Archive for September 2011
Sometimes it’s useful to be able to quickly peek what keys memcache is storing and how old are they. A good use case for example could be to check whether something is cached or not or that they expire as they should.
At first I found a way to dump memcache keys through telnet. However if a memcache instance is fairly large and has a lot of slabs and thousands of keys it becomes impractical to do it manually.
I wrote a simple utility that helps me find keys across all memcache slabs.
#!/usr/bin/php < ?php $host = "127.0.0.1"; $port = 11211; $lookupKey = ""; $limit = 10000; $time = time(); foreach ($argv as $key => $arg) { switch ($arg) { case '-h': $host = $argv[$key + 1]; break; case '-p': $port = $argv[$key + 1]; break; case '-s': $lookupKey = $argv[$key + 1]; break; case '-l': $limit = $argv[$key + 1]; } } $memcache = memcache_connect($host, $port); $list = array(); $allSlabs = $memcache->getExtendedStats('slabs'); $items = $memcache->getExtendedStats('items'); foreach ($allSlabs as $server => $slabs) { foreach ($slabs as $slabId => $slabMeta) { if (!is_numeric($slabId)) { continue; } $cdump = $memcache->getExtendedStats('cachedump', (int)$slabId, $limit); foreach ($cdump as $server => $entries) { if (!$entries) { continue; } foreach($entries as $eName => $eData) { $list[$eName] = array( 'key' => $eName, 'slabId' => $slabId, 'size' => $eData[0], 'age' => $eData[1] ); } } } } ksort($list); if (!empty($lookupKey)) { echo "Searching for keys that contain: '{$lookupKey}'\n"; foreach ($list as $row) { if (strpos($row['key'], $lookupKey) !== FALSE) { echo "Key: {$row['key']}, size: {$row['size']}b, age: ", ($time - $row['age']), "s, slab id: {$row['slabId']}\n"; } } } else { echo "Printing out all keys\n"; foreach ($list as $row) { echo "Key: {$row['key']}, size: {$row['size']}b, age: ", ($time - $row['age']), "s, slab id: {$row['slabId']}\n"; } }
This script accepts 4 parameters:
-h host
-p port
-s partial search string
-l a limit of how many keys to dump from a single slab (default 10,000)
The easiest way to use it:
./membrowser.php -s uk
Searching for keys that contain: ‘uk’
Key: 1_uk_xml, size: 3178b, age: 1728s, slab id: 17
Key: 2_uk_xml, size: 3178b, age: 1725s, slab id: 17
Key: 3_uk_xml, size: 3178b, age: 1721s, slab id: 17
Download memcache keys dump script.
P.S some of the code I’ve copied from 100days.de blog post.