Read more about this book |
(For more resources on Magento, see here.)
The reader can benefit from the previous article on Magento 1.4: Performance Optimization.
Using APC/Memcached as the cache backend
Magento has got a cache system that is based on files by default. We can boost the overall performance by changing the cache handler to a better engine like APC or Memcached. This recipe will help us to set up APC or Memcached as the cache backend.
Getting ready
Installation of APC:
Alternative PHP Cache (APC) is a PECL extension. For any Debian-based Distro, it can be installed with an easy command from the terminal:
sudo apt-get install php5-apc
Or:
sudo pecl install APC
You can also install it from the source. The package download location for APC is: http://pecl.php.net/package/APC. Check whether it exists or not in phpinfo(). If you cannot see an APC block there, then you might not have added APC in the php.ini file.
Installation of Memcached:
Memcached is also available in most OS package repositories. You can install it from the command line:
sudo apt-get install php5-memcached
Memcached could be installed from source as well. Check whether it exists or not in phpinfo(). If you cannot see a Memcached block there, then you might not have added Memcached in the php.ini file.
You can also check it via the telnet client. Issue the following command in the terminal:
telnet localhost 11211
We can issue the get command now:
get greeting
Nothing happened? We have to set it first.
set greeting 1 0 11 Hello World STORED get greeting Hello World END quit
How to do it…
- Okay, we are all set to go for the APC or Memcached. Let’s do it now for APC. Open local.xml in your favorite PHP editor. Add the cache block as follows:
<?xml version=”1.0″?>
<config>
<global>
<install>
<date><![CDATA[Sat, 26 Jun 2010 11:55:18 +0000]]></date>
</install>
<cache>
<backend>apc</backend>
<prefix>alphanumeric</prefix>
</cache>
<crypt>
<key><![CDATA[870f60e1ba58fd34dbf730bfa8c9c152]]></key>
</crypt>
<disable_local_modules>false</disable_local_modules>
<resources>
<db>
<table_prefix><![CDATA[]]></table_prefix>
</db>
<default_setup>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[root]]></username>
<password><![CDATA[f]]></password>
<dbname><![CDATA[magento]]></dbname>
<active>1</active>
</connection>
</default_setup>
</resources>
<session_save><![CDATA[files]]></session_save>
</global>
<admin>
<routers>
<adminhtml>
<args>
<frontName><![CDATA[backend]]></frontName>
</args>
</adminhtml>
</routers>
</admin>
</config> - Delete all files from the var/cache/ directory. Reload your Magento and benchmark it now to see the boost in performance. Run the benchmark several times to get an accurate result.
ab -c 5 -n 100 http://magento.local.com/
- You can use either APC or Memcached. Let’s test it with Memcached now. Delete the cache block as we set with APC previously and add the cache block as follows:
<?xml version=”1.0″?>
<config>
<global>
<install>
<date><![CDATA[Sat, 26 Jun 2010 11:55:18 +0000]]></date>
</install>
<crypt>
<key><![CDATA[870f60e1ba58fd34dbf730bfa8c9c152]]></key>
</crypt>
<disable_local_modules>false</disable_local_modules>
<resources>
<db>
<table_prefix><![CDATA[]]></table_prefix>
</db>
<default_setup>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[root]]></username>
<password><![CDATA[f]]></password>
<dbname><![CDATA[magento]]></dbname>
<active>1</active>
</connection>
</default_setup>
</resources>
<session_save><![CDATA[files]]></session_save><cache>
<backend>memcached</backend> apc / memcached / xcache /
empty=file
<slow_backend>file</slow_backend> database / file (default)
– used for 2 levels cache setup, necessary for all shared memory
storages
<memcached> memcached cache backend related config
<servers> any number of server nodes can be included
<server>
<host><![CDATA[127.0.0.1]]></host>
<port><![CDATA[11211]]></port>
<persistent><![CDATA[1]]></persistent>
<weight><![CDATA[2]]></weight>
<timeout><![CDATA[10]]></timeout>
<retry_interval><![CDATA[10]]></retry_interval>
<status><![CDATA[1]]></status>
</server>
</servers>
<compression><![CDATA[0]]></compression>
<cache_dir><![CDATA[]]></cache_dir>
<hashed_directory_level><![CDATA[]]>
</hashed_directory_level>
<hashed_directory_umask><![CDATA[]]>
</hashed_directory_umask>
<file_name_prefix><![CDATA[]]></file_name_prefix>
</memcached>
</cache></global>
<admin>
<routers>
<adminhtml>
<args>
<frontName><![CDATA[backend]]></frontName>
</args>
</adminhtml>
</routers>
</admin>
</config> - Save the local.xml file, clear all cache files from /var/cache/ and reload your Magento in the frontend and check the performance.
- Mount var/cache as TMPFS:
mount tmpfs /path/to/your/magento/var/cache -t tmpfs -o size=64m
How it works…
Alternative PHP Cache (APC) is a free, open source opcode cache framework that optimizes PHP intermediate code and caches data and compiled code from the PHP bytecode compiler in shared memory, which is similar to Memcached. APC is quickly becoming the de facto standard PHP caching mechanism, as it will be included built-in to the core of PHP, starting with PHP 6. The biggest problem with APC is that you can only access the local APC cache.
Memcached’s magic lies in its two-stage hash approach. It behaves as though it were a giant hash table, looking up key = value pairs. Give it a key, and set or get some arbitrary data. When doing a memcached lookup, first the client hashes the key against the whole list of servers. Once it has chosen a server, the client then sends its request, and the server does an internal hash key lookup for the actual item data. Memcached affords us endless possibilities (query caching, content caching, session storage) and great flexibility. It’s an excellent option for increasing performance and scalability on any website without requiring a lot of additional resources.
Changing the var/cache to TMPFS is a very good trick to increase disk I/O. I personally found both APC’s and Memcached’s performance pretty similar. Both are good to go. If you want to split your cache in multiple servers go for the Memcached. Good Luck!
The highlighted sections in code are for the APC and Memcached settings, respectively.