前に調べてた、memcachedへデータ登録した時のslabの増え方について調査したメモを残しとく。
調査の参考にしたサイト:
http://gihyo.jp/dev/feature/01/memcached/0002
memcachedのバージョン:1.4.15
-f 3(個々のslabのサイズ3倍)でmemcachedを起動
[mokky14@centos1 bin]$ ./memcached -vv -f 3 slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 288 perslab 3640 slab class 3: chunk size 864 perslab 1213 slab class 4: chunk size 2592 perslab 404 slab class 5: chunk size 7776 perslab 134 slab class 6: chunk size 23328 perslab 44 slab class 7: chunk size 69984 perslab 14 slab class 8: chunk size 209952 perslab 4 slab class 9: chunk size 1048576 perslab 1 <26 server listening (auto-negotiate) <27 server listening (auto-negotiate) <28 send buffer was 129024, now 268435456 <29 send buffer was 129024, now 268435456 <28 server listening (udp) <29 server listening (udp) <28 server listening (udp) <29 server listening (udp) <28 server listening (udp) <29 server listening (udp) <28 server listening (udp) <29 server listening (udp)
slab class2をターゲットにデータ登録を実行
[mokky14@centos1 ~]$ cat memcached_data.pl #!/usr/bin/perl use strict; use warnings; use Cache::Memcached::Fast; use String::Random; my $memd = Cache::Memcached::Fast->new({ servers => [{address => 'localhost:11211'}], }); for ( my $i=0; $i<3640; $i++ ) { my $key = "key-${i}"; my $data = String::Random->new->randregex('[A-Za-z0-9]{100}'); $memd->set($key, $data); } [mokky14@centos1 ~]$ perl !$ perl memcached_data.pl
データ登録状況確認
slab class2に3640個のデータが登録されたっぽい
[mokky14@centos1 memcached-1.4.15]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 288B 36s 1 3640 yes 0 0 0 [mokky14@centos1 memcached-1.4.15]$
登録されたデータを確かめてみる
[mokky14@centos1 ~]$ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. get key-3639 VALUE key-3639 0 100 m5R2Ca7jw2Hc0UkefOYgknvQqGvUHO0Mlc4solwumAn3Aj1pBkPm35G4pluggDk0T7ap4v0wcjDo7tzb0LGd5MGgLcT2RTz1MimT END get key-0 VALUE key-0 0 100 e3wjA4DnbEUvbuaQjrsQQndWdb1OzW47i1lT6dxZMRGrNgghFRNt9kBAKUn1pXya5dKiPJTkC25N5cWYH5JnhdED13CBXXHhMQAZ END get key-3640 END
ここでデータを登録すると、key-0のデータが削除されて、新しいデータが登録されるはず
get key-0 VALUE key-0 0 100 e3wjA4DnbEUvbuaQjrsQQndWdb1OzW47i1lT6dxZMRGrNgghFRNt9kBAKUn1pXya5dKiPJTkC25N5cWYH5JnhdED13CBXXHhMQAZ END get add-key-1 VALUE add-key-1 0 100 m5R2Ca7jw2Hc0UkefOYgknvQqGvUHO0Mlc4solwumAn3Aj1pBkPm35G4pluggDk0T7ap4v0wcjDo7tzb0LGd5MGgLcT2RTz1Mim1 END
あれ?
[mokky14@centos1 memcached-1.4.15]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 288B 982s 2 3641 yes 0 0 0
Pagesが2になってる。。
どこまで登録できるのかを調査する。
こんなスクリプト作って、、
[mokky14@centos1 ~]$ cat memcached_data.pl #!/usr/bin/perl use strict; use warnings; use Cache::Memcached::Fast; use String::Random; my $memd = Cache::Memcached::Fast->new({ servers => [{address => 'localhost:11211'}], }); for ( my $i=0; $i<3640; $i++ ) { my $key = "key${ARGV[0]}-${i}"; my $data = String::Random->new->randregex('[A-Za-z0-9]{100}'); $memd->set($key, $data); }
どこまでPagesが増えるか試す。
[mokky14@centos1 ~]$ perl memcached_data.pl 4 [mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 288B 1639s 5 14561 yes 0 0 0 [mokky14@centos1 ~]$ perl memcached_data.pl 5 [mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 288B 1878s 6 18201 yes 0 0 0 [mokky14@centos1 ~]$ perl memcached_data.pl 6 [mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 288B 1886s 7 21841 yes 0 0 0 [mokky14@centos1 ~]$ perl memcached_data.pl 7 [mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 288B 1892s 8 25481 yes 0 0 0 [mokky14@centos1 ~]$ perl memcached_data.pl 8 [mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 288B 1898s 9 29121 yes 0 0 0
どんどん増える。
メモリ使用量の上限までいくんじゃないかと予想。
slabのサイズは1MBなので、デフォルトの64MBだと、64pageになるはず。
そこまで登録してみる。
[mokky14@centos1 ~]$ cnt=9 [mokky14@centos1 ~]$ while (( $cnt < 64 )): do > perl memcached_data.pl $cnt > cnt=$(( cnt + 1 )) > done [mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 288B 2166s 64 229321 yes 0 0 0
あと1page分登録
[mokky14@centos1 ~]$ perl memcached_data.pl 64 [mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 288B 2623s 64 232960 yes 1 2615 0
予想通り、65page目は出てこない。
slab class 2の1slabには3640個のデータが登録出来るので、64slabに登録出来るデータは
64 * 3640 = 232960 個
つまり、登録上限に達してる。
Evictedの値が増えてることから、2615個のデータが削除されたことも分かる。
(でもこの状態でFull?=yesって何でなんだろう?)
試しに1レコード登録
set add-key-2 0 0 100 e3wjA4DnbEUvbuaQjrsQQndWdb1OzW47i1lT6dxZMRGrNgghFRNt9kBAKUn1pXya5dKiPJTkC25N5cWYH5JnhdED13CBXXHhMQ12 STORED get add-key-2 VALUE add-key-2 0 100 e3wjA4DnbEUvbuaQjrsQQndWdb1OzW47i1lT6dxZMRGrNgghFRNt9kBAKUn1pXya5dKiPJTkC25N5cWYH5JnhdED13CBXXHhMQ12 END ||< >|| [mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 288B 2834s 64 232960 yes 2 2814 0
Countの値は増えておらず、Evictedの値が増えている。
つまり、他の何かのレコードが削除されたはず。
LRUアルゴリズムだと、最初に登録されたデータかな?
get key-0 VALUE key-0 0 100 vOJrXXAavUfjdSFs8nXK5RXpOajAm53FV5GmA9nzZSw8Je6DLuc00zCTntxkKQIV009aq8ZeqWHg0oKsrGxXmb1pyjrjYqgkBhPi END
最後に確認したデータが何だったか忘れた。。後で調査しよう。
この状態で、別のslab classにデータ登録したらどうなる?
[mokky14@centos1 ~]$ ps -eo comm,vsz | grep memcached memcached 134308
この状態で別slab classにデータ登録。
set short-key-1 0 1 1 a STORED ||< >|| [mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 1 96B 7s 1 1 yes 0 0 0 2 288B 4565s 64 232960 yes 2 2814 0 [mokky14@centos1 ~]$ ps -eo comm,vsz | grep memcached memcached 135332
slab class2のデータはそのままで、slab class1のデータが新しく登録された。 プロセスのメモリ使用量も増えた
更に別slabにデータ登録
set long-key-1 0 1 300 dXJ3fmwIZ3DNJ8rymmHjY0RPKV0tyR2NzKAsbgb5WdPrYIuLhB6toT2BIi24Oyj8XXWtiedwEB3wCj1uBhWWXOaXZtoyYAXzJ5FidXJ3fmwIZ3DNJ8rymmHjY0RPKV0tyR2NzKAsbgb5WdPrYIuLhB6toT2BIi24Oyj8XXWtiedwEB3wCj1uBhWWXOaXZtoyYAXzJ5FidXJ3fmwIZ3DNJ8rymmHjY0RPKV0tyR2NzKAsbgb5WdPrYIuLhB6toT2BIi24Oyj8XXWtiedwEB3wCj1uBhWWXOaXZtoyYAXzJ5Fi STORED
[mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 1 96B 240s 1 1 yes 0 0 0 2 288B 4798s 64 232960 yes 2 2814 0 3 864B 4s 1 1 yes 0 0 0 [mokky14@centos1 ~]$ ps -eo comm,vsz | grep memcached memcached 136356
またメモリ使用量が増えた。
既にslabが作成されたclassに対し、追加データ登録
set short-key-2 0 1 2 ab STORED
[mokky14@centos1 ~]$ /usr/local/src/memcached-1.4.15/scripts/memcached-tool localhost:11211 # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 1 96B 15s 1 1 yes 0 0 0 2 288B 4890s 64 232960 yes 2 2814 0 3 864B 96s 1 1 yes 0 0 0 [mokky14@centos1 ~]$ ps -eo comm,vsz | grep memcached memcached 136356
メモリ使用量は増えない。