memcachedのサイズ別データ数のカウント

これは何

memcachedからredisへ移行したいので、redisのベンチマークを取っていたが、その時にmemcachedに保存されているデータがどれくらいのサイズがどれくらいの量で出現するのか確認した。その話を適当にまとめておく。

chunkサイズとslabについて

参考: http://gihyo.jp/dev/feature/01/memcached/0002

memachedはメモリのフラグメンテーションを防ぐために slab allocator というのを使っているっぽい。単にmalloc と freeを使ってメモリを扱うとばらばらになってしまう。確保したメモリをいろいろなサイズの塊(chunk)にわけて同じサイズの塊をクラスとしてひとまとまりにする。stats itemの出力はどうもこのchunk別に別れている模様。

class別個数カウント

$ echo "stats items" | nc localhost 11211    | grep number
STAT items:1:number 6
STAT items:2:number 4990
STAT items:3:number 1
STAT items:4:number 39
STAT items:5:number 160
STAT items:6:number 3
STAT items:7:number 17
STAT items:8:number 19
STAT items:9:number 46
STAT items:10:number 1
STAT items:11:number 5326
STAT items:12:number 1397
STAT items:13:number 60
以下略

このコマンドは↓でもよい

$ echo "stats slabs" | nc localhost 11211  | grep used_chunk

classのサイズを確認する

上からサイズ順になっている。

$ echo "stats slabs" | nc localhost 11211  | grep chunk_size
STAT 1:chunk_size 96
STAT 2:chunk_size 120
STAT 3:chunk_size 152
STAT 4:chunk_size 192
STAT 5:chunk_size 240
STAT 6:chunk_size 304
STAT 7:chunk_size 384
STAT 8:chunk_size 480
STAT 9:chunk_size 600
STAT 10:chunk_size 752
STAT 11:chunk_size 944
STAT 12:chunk_size 1184
STAT 13:chunk_size 1480
以下略

トータル個数とか一定サイズ以上のものとか

$ echo "stats slabs" | nc localhost 11211  | grep used_chunk | awk 'BEGIN {num = 0};{ sum =+ sum + $3} END {print sum }'

大きいサイズの個数が知りたいななど。例えばclass 19以上のもの(size 5kでの区切りで見たやつ)

$  echo "stats slabs" | nc localhost 11211  | grep used_chunk | egrep "(STAT 19|STAT [2-4][0-9])" |  awk 'BEGIN {num = 0};{ sum =+ sum + $3} END {print sum }'