WordPress Cache Plugin Benchmarks
A lot of time and effort goes into keeping a WordPress site alive when it starts to accumulate traffic. While not every site has the same goals, keeping a site responsive and online is the number one priority. When a surfer requests the page, it should load quickly and be responsive. Each addon handles caching a little differently and should be used in different cases.
For many sites, page caching will provide decent performance. Once your sites starts receiving comments, or people log in, many cache solutions cache too heavily or not enough. As many solutions as there are, it is obvious that WordPress underperforms in higher traffic situations.
The list of caching addons that we’re testing:
* DB Cache (version 0.6)
* DB Cache Reloaded (version 2.0.2)
* W3 Total Cache (version 0.8.5.1)
* WP Cache (version 2.1.2)
* WP Super Cache (version 0.9.9)
* WP Widget Cache (version 0.25.2)
* WP File Cache(version 1.2.5)
* WP Varnish (in beta)
* WP Varnish ESI Widget (in beta)
What are we testing?
* Frontpage hits
* httpload through a series of urls
We take two measurements. The cold start measurement is taken after any plugin cache has been cleared and Apache2 and MySQL have been restarted. A 30 second pause is inserted prior to starting the tests. We perform a frontpage hit 1000 times with 10 parallel connections. We then repeat that test after Apache2 and the caching solution have had time to cache that page. Afterwards, http_load requests a series of 30 URLs to simulate people surfing other pages. Between those two measurements, we should have a pretty good indicator of how well a site is going to perform in real life.
What does the Test Environment look like?
* Debian 3.1/Squeeze VPS
* Linux Kernel 2.6.33
* Single core of a Xen Virtualized Xeon X3220 (2.40ghz)
* 2gb RAM
* CoW file is written on a Raid-10 System using 4x1tb 7200RPM Drives
* Apache 2.2.14 mpm-prefork
* PHP 5.3.1
* WordPress Theme Test Data
* Tests are performed from a Quadcore Xeon machine connected via 1000 Base T on the same switch and /24 as the VPS machine
This setup is designed to replicate what most people might choose to host a reasonably popular wordpress site.
If you aren’t using Varnish in front of your web site, the clear winner is W3 Total Cache using Page Caching – Disk (Enhanced), Minify Caching – Alternative PHP Cache (APC), Database Caching – Alternative PHP Cache (APC).
If you can use Varnish, WP Varnish would be a very simple way to gain quite a bit of performance while maintaining interactivity. WP Varnish purges the cache when posts are made, allowing the site to be more dynamic and not suffer from the long cache delay before a page is updated.
W3 Total Cache has a number of options and sometimes settings can be quite detrimental to site performance. If you can’t use APC caching or Memcached for caching Database queries or Minification, turn both off. W3 Total Cache’s interface is overwhelming but the plugin author has indicated that he’ll be making a new ‘Wizard’ configuration menu in the next version along with Fragment Caching.
WP Super Cache isn’t too far behind and is also a reasonable alternative.
Either way, if you want your site to survive, you need to use a cache addon. Going from 2.5 requests per second to 800+ requests per second makes a considerable difference in the usability of your site for visitors. Logged in users and search engine bots still see uncached/live results, so, you don’t need to worry that your site won’t be indexed properly.
Sorted in Ascending order in terms of higher overall performance
|Req/Second||Time/Request||50% within x ms||Fetches/Second||Min First Response||Avg First Response|
|Cached all SQL queries||4.81||207.776||2091||15.1712||304.446||583.684|
|Out of Box config||4.94||202.624||2026||14.432||114.983||618.434|
|WP File Cache||4.95||201.890||2009||15.8869||158.597||549.176|
|DB Cache Reloaded||5.02||199.387||1983||15.0167||187.343||589.196|
|All SQL Queries Cached||5.03||200.089||1985||14.9233||150.145||586.443|
|DB Cache Reloaded||5.06||197.636||1968||14.9697||174.857||589.161|
|Out of Box config||5.08||196.980||1968||15.181||257.533||587.737|
|W3 Total Cache||153.45||65.167||60||133.1898||8.916||85.7177|
|DB Cache off, Page Caching with Memcached||169.46||59.011||57||188.4||9.107||50.142|
|W3 Total Cache||173.49||57.639||52||108.898||7.668||86.4077|
|DB Cache off, Minify Cache with Memcached||189.76||52.698||48||203.522||8.122||43.8795|
|W3 Total Cache||171.34||58.364||50||203.718||8.097||44.1234|
|DB Cache using Memcached||190.01||52.269||48||206.187||8.186||42.4438|
|W3 Total Cache||175.29||57.048||48||87.423||7.515||107.973|
|Out of Box config||191.15||52.314||47||204.387||8.288||43.217|
|W3 Total Cache||175.29||57.047||51||204.557||8.199||42.9365|
|Database Cache using APC||191.19||52.304||48||200.612||8.11||44.6691|
|W3 Total Cache||114.02||87.703||49||114.393||8.206||82.0678|
|Database Cache Disabled||191.76||52.150||49||203.781||8.095||42.558|
|W3 Total Cache||175.80||56.884||51||107.842||7.281||87.2761|
|Database Cache Disabled, Minify Cache using APC||192.01||52.082||50||205.66||8.244||43.1231|
|W3 Total Cache||104.90||95.325||51||123.041||7.868||74.5887|
|Database Cache Disabled, Page Caching using APC||197.55||50.620||46||210.445||7.907||41.4102|
|WP Super Cache||336.88||2.968||16||15.1021||335.708||583.363|
|Out of Box config, Half On||391.59||2.554||16||15.1712||304.446||583.684|
|WP Super Cache||919.11||1.088||3||190.117||1.473||47.9367|
|Full on, Lockdown mode||965.69||1.036||3||975.979||1.455||9.67185|
|WP Super Cache||928.45||1.077||3||210.106||1.468||43.8167|
|W3 Total Cache||1143.94||8.742||2||165.547||0.958||56.7702|
|Page Cache using Disk Enhanced||1222.16||8.182||3||1290.43||0.961||7.15632|
|W3 Total Cache||1153.50||8.669||3||165.725||0.916||56.5004|
|Page Caching – Disk Enhanced, Minify/Database using APC||1211.22||8.256||2||1305.94||0.948||6.97114|
#!/bin/sh FETCHES=1000 PARALLEL=10 /usr/sbin/apache2ctl stop /etc/init.d/mysql restart apache2ctl start echo Sleeping sleep 30 time ( \ echo First Run; \ ab -n $FETCHES -c $PARALLEL http://example.com/; \ echo Second Run; \ ab -n $FETCHES -c $PARALLEL http://example.com/; \ \ echo First Run; \ ./http_load -parallel $PARALLEL -fetches $FETCHES wordpresstest; \ echo Second Run; \ ./http_load -parallel $PARALLEL -fetches $FETCHES wordpresstest; \ )
URL File for http_load
http://example.com/ http://example.com/2010/03/hello-world/ http://example.com/2008/09/layout-test/ http://example.com/2008/04/simple-gallery-test/ http://example.com/2007/12/category-name-clash/ http://example.com/2007/12/test-with-enclosures/ http://example.com/2007/11/block-quotes/ http://example.com/2007/11/many-categories/ http://example.com/2007/11/many-tags/ http://example.com/2007/11/tags-a-and-c/ http://example.com/2007/11/tags-b-and-c/ http://example.com/2007/11/tags-a-and-b/ http://example.com/2007/11/tag-c/ http://example.com/2007/11/tag-b/ http://example.com/2007/11/tag-a/ http://example.com/2007/09/tags-a-b-c/ http://example.com/2007/09/raw-html-code/ http://example.com/2007/09/simple-markup-test/ http://example.com/2007/09/embedded-video/ http://example.com/2007/09/contributor-post-approved/ http://example.com/2007/09/one-comment/ http://example.com/2007/09/no-comments/ http://example.com/2007/09/many-trackbacks/ http://example.com/2007/09/one-trackback/ http://example.com/2007/09/comment-test/ http://example.com/2007/09/a-post-with-multiple-pages/ http://example.com/2007/09/lorem-ipsum/ http://example.com/2007/09/cat-c/ http://example.com/2007/09/cat-b/ http://example.com/2007/09/cat-a/ http://example.com/2007/09/cats-a-and-c/