これは何
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 }'