memcached のメモリストレージについてちょっと調べる
memcached のメモリストレージの特徴
・起動時に予め指定したメモリを確保する(データが格納されるたびにmallocしてない)
・有効期限切れのデータは即メモリ上から消去されない
・有効期限内のデータはLRU順にメモリから消去される( = evict)
・格納するデータによって格納される場所が決まる(Slab Allocation)
格納されるデータ容量が増えた場合どうなるのか
sairoutine:~$ memcached -f 1.1 -vv -m 64 slab class 1: chunk size 80 perslab 13107 slab class 2: chunk size 88 perslab 11915 slab class 3: chunk size 96 perslab 10922 slab class 4: chunk size 112 perslab 9362 slab class 5: chunk size 128 perslab 8192 slab class 6: chunk size 144 perslab 7281 slab class 7: chunk size 160 perslab 6553 slab class 8: chunk size 176 perslab 5957 slab class 9: chunk size 200 perslab 5242 slab class 10: chunk size 224 perslab 4681 slab class 11: chunk size 248 perslab 4228 slab class 12: chunk size 272 perslab 3855 slab class 13: chunk size 304 perslab 3449
上記のchunk size 分けだと、80バイト以下のデータはslab class 1に、
80〜88 byte のデータは slab class 2 に格納される。
(slab や chunk といった概念は「Slab Allocation」でググる)
この状態で、最初に80byte以下のデータを格納し、その後同一のキーで
80byte以上のデータを格納した場合、slab class の移動が起こるのか確かめる。
sairoutine:~$ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. set foo 0 86400 1 1 STORED quit Connection closed by foreign host.
telnet で memcached に foo = 1 を格納する。
sairoutine:~$ memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 1 80B 10s 1 1 no 0 0 0
memcached-tool を使って、slab 1に格納されたことを確認した。
この状態で foo に 81byte のデータを格納すると、slab class を移動するのか
確認する。
sairoutine:~$ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. set foo 0 86400 81 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa STORED quit Connection closed by foreign host.
foo に 81byteのデータを格納した。
sairoutine:~$ memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 1 80B 0s 1 0 no 0 0 0 6 144B 3s 1 1 no 0 0 0
slab class 6 に移動したことを確認した。なぜ容量が80〜88byteのslab class 2 でなく
144Byte の slab class 6 に移動したのはキー名とモロモロの情報のために48byteくらい
さらに容量が必要になるかららしい。