読者です 読者をやめる 読者になる 読者になる

まるまるこふこふ

数々の次元が崩壊し、全ての生命が塵と化すのを見てきた。私ほどの闇の心の持ち主でも、そこには何の喜びも無かった。

memcached のメモリストレージについてちょっと調べる

gihyo.jp

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.

telnetmemcached に 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くらい
さらに容量が必要になるかららしい。