Benchmarking Memcached
We wanted a better understanding of how much time was being spent carrying out Memcached operations, and a deterministic method to benchmark operations isolated from the WordPress environment.
The result:
What does it do?
The script allows you to specify one or more memcached servers to test (host:port), as well as provide fixture data in the form of a JSON file.
The script does the following:
- Creates client Memcached instances using the PECL Memcache extension
- Loads fixture data and converts to PHP arrays
- Runs a simple benchmark — set, get and delete provided cache data in sequence, timing each method as it runs
- Writes results to a CSV file
If you pass multiple memcached servers as input, the benchmarks will be run in two different modes:
- Pooled (one client sharing multiple servers)
- Individual (one client per server)
Gathering Test Data
We explored a few options for generating cache data to run through the benchmark script.
We leverged the built-in WP_Object_Cache
class, specifically the one defined in the memcached object cache drop-in to extract actual cache data used during individual page requests.
function WP_Object_Cache() { . . . if ( defined( 'DUMP_CACHE_DATA' ) && DUMP_CACHE_DATA ) register_shutdown_function( array( $this, 'cache_dump' ) ); } } function cache_dump() { $filename = sprintf( '%s-%s.json', $_SERVER['HTTP_HOST'], rawurlencode( $_SERVER['REQUEST_URI'] ) ); file_put_contents( "/tmp/cachedumps/$filename", json_encode( $this->cache ) ); return true; }
With this in place, cache dumps could be triggered by setting a constant in wp-config.php and pointing the browser at real pages in our install.
define( 'DUMP_CACHE_DATA', true );
The end result is a JSON file for each page, which we turned around and fed to the benchmark script.
Next Steps
Results coming soon…