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

mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

memcachedのslab増加のアルゴリズム確認

前に調べてた、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

メモリ使用量は増えない。