memcached-cli で Memcached の Slabs Reassign と LRU Crawler を試してみる
この記事では、Gotanda.pm #8 でデモをする予定だった内容の手順と結果を紹介します。
勉強会では、発表時間が足りずデモが実施できませんでした。
希望能对你有所帮助。
首先
memcached-cli は筆者が開発した Perl 製の Memcached クライアントです。
テキストプロトコルでできる操作はすべて実行でき、TELNET よりもユーザーにやさしいインタフェースとなっております。
依存も少なく、Perl 5.8 以上であれば動作するように作ったつもりなので、Memcached をお使いの方はぜひ使ってみてください。
关于Memcached Slabs Reassign和LRU Crawler
在进入演示步骤之前,我简单地解释一下本次涉及的 Memcached 功能。
首先,让我们来谈一谈。Memcached将数据根据其大小分配到不同的Slab Class中。每个Slab Class都有以1MB为单位的内存页分配。一旦页被分配,通常情况下,即使该Class的数据量减少,页也不会被释放。Slabs Reassign是一项可以更改不同Slab Class之间页分配的功能。
次に LRU Crawler ですが、これは Expire したデータをなめてメモリ領域を解放してくれるものです。
こちらも、Expire したデータを get したり、同じ Slab Class にデータを set するなりしなければ、通常は解放されません。
示范步骤和结果 hé
我正在使用MacOSX环境,在Homebrew上安装了Memcached 1.4.22。
以较低的内存启动Memcached
因为想要看到溢出的地方,所以将Memcached的-m选项设置为4MB,并以非常低的内存启动。
同时,使用-o选项启用slab_reassign和lru_crawler。
此外,为了之后查看stats detail dump的结果,可以通过-D “:”启用按命名空间收集统计信息的功能。
% memcached -m 4 -o slab_reassign,lru_crawler -D ":"
生成并使数据溢出,数据的大小有两种类型。
首先,使用memcached-cli进行连接。
由于之前的memcached启动命令是在前台启动的,所以请在另一个窗口中操作。
% memcached-cli localhost
Type '\h' or 'help' to show help.
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
由于服务器刚刚启动,所以 display 命令没有结果。
通过 randomset 命令生成数据并将其设置到 Memcached 中。
// 500B のデータを "sample1" ネームスペース下に5000個生成
memcached@localhost:11211> randomset 5000 500 500 sample1
Random Generate. [....................]
Complete.
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 7s 3 5000 yes 0 0 0
// 1kB のデータを "sample2" ネームスペース下に1000個生成
memcached@localhost:11211> randomset 1000 1000 1000 sample2
Random Generate. [....................]
Complete.
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 29s 3 5000 yes 0 0 0
12 1.2K 8s 1 885 yes 115 1 0
// 1kB のデータを "sample3" ネームスペース下に1000個生成
memcached@localhost:11211> randomset 1000 1000 1000 sample3
Random Generate. [....................]
Complete.
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 35s 3 5000 yes 0 0 0
12 1.2K 2s 1 885 yes 1115 1 0
由于为 Slab 类别#9 分配了3页内存,因此只能为#12 分配1页内存。
#12 无法设置超过885个数据,导致溢出并进行了逐出。
将所有数据失效并用LRU Crawler进行清理。
使用flush_all命令将所有数据设置为过期。
然而,仅有此命令并不能释放已分配的页面,因此在Slab Class#12中无法设置超过885个数据。
memcached@localhost:11211> flush_all
OK
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 466s 3 5000 yes 0 0 0
12 1.2K 433s 1 885 yes 1115 1 0
memcached@localhost:11211> randomset 1000 1000 1000 sample3
Random Generate. [....................]
Complete.
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 486s 3 5000 yes 0 0 0
12 1.2K 2s 1 885 yes 1230 1 0
所以,现在轮到 Slabs Reassign 出场了。
由于数据已经无效化,因此即使将页面分配更改为 #9 => #12 也没有什么问题,但这次我们会在这之前先用 LRU Crawler 清除 #9 的数据。
// LRU Crawler を Slab Class #9 に対して手動実行する
memcached@localhost:11211> call lru_crawler crawl 9
OK
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 0s 3 0 yes 0 0 0
12 1.2K 18s 1 885 yes 1230 1 0
// Slabs Reassign でページ割当てを #9 => #12 に移していく
memcached@localhost:11211> call slabs reassign 9 12
OK
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 0s 2 0 yes 0 0 0
12 1.2K 38s 2 885 yes 1230 1 0
memcached@localhost:11211> call slabs reassign 9 12
OK
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 0s 1 0 yes 0 0 0
12 1.2K 42s 3 885 yes 1230 1 0
您是否能够理解以上内容,即页面数量从 #9 移动至 #12。
我们可以使用这个工具在 #12 上设置3MB的数据。
我们来试一试。
// ネームスペースを変えながら、1000個ずつ計3000個のデータ set を試みる
memcached@localhost:11211> randomset 1000 1000 1000 sample3
Random Generate. [....................]
Complete.
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 0s 1 0 yes 0 0 0
12 1.2K 4s 3 1000 yes 1230 1 0
memcached@localhost:11211> randomset 1000 1000 1000 sample4
Random Generate. [....................]
Complete.
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 0s 1 0 yes 0 0 0
12 1.2K 17s 3 2000 yes 1230 1 0
memcached@localhost:11211> randomset 1000 1000 1000 sample5
Random Generate. [....................]
Complete.
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
9 600B 0s 1 0 yes 0 0 0
12 1.2K 21s 3 2655 yes 1575 20 0
最后虽然稍微有些溢出,但与只有一页时相比,我们能够存储三倍的数据。
ネームスペースごとの統計を見てみる
这次演示的主要内容就是这些,但是顺便再介绍一下 memcached/memcached-cli 的功能。
detaildump コマンドでは、ネームスペースごとの統計情報を見ることができます。
memcached@localhost:11211> detaildump
PREFIX sample4 get 0 hit 0 set 1000 del 0
PREFIX sample3 get 0 hit 0 set 3000 del 0
PREFIX sample5 get 0 hit 0 set 1000 del 0
PREFIX sample2 get 0 hit 0 set 1000 del 0
PREFIX sample1 get 0 hit 0 set 5000 del 0
如果在Memcached启动时未启用收集统计信息,可以使用memcached-cli的detail on命令进行启用。相反,也可以使用detail off命令进行禁用。
请尝试进行数据的导出/恢复
目前在memcached-cli中(~v0.94),当保存dump文件时,需要在批处理模式下运行。
因此,请先通过\q退出交互模式。
memcached@localhost:11211> \q
// シェル上で memcached-cli の dump_all コマンドを実行し、出力をファイルにリダイレクト
% memcached-cli localhost dump_all > dump-memd.txt
Dumping memcache contents
Number of buckets: 1
Number of items : 2655
Dumping bucket 12 - 2655 total items
% ll -h dump-memd.txt
-rw-r--r-- 1 key-amb 1522739515 2.6M 3 31 01:19 dump-memd.txt
% wc -l dump-memd.txt
5310 dump-memd.txt
垃圾被清除了。
那么,我们将重新启动在另一个窗口中运行的Memcached。
% memcached -m 4 -o slab_reassign,lru_crawler -D ":"
^CSignal handled: Interrupt: 2.
% memcached -m 4 -o slab_reassign,lru_crawler -D ":"
// 別窓で memcached-cli を立ち上げる
% memcached-cli localhost
Type '\h' or 'help' to show help.
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
由于重新启动,数据已被清空。
现在将恢复之前备份的转储数据。
memcached@localhost:11211> restore_dump dump-memd.txt
...loaded 200 lines
...loaded 400 lines
...loaded 600 lines
...loaded 800 lines
:
...loaded 5000 lines
...loaded 5200 lines
Complete.
memcached@localhost:11211> display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
12 1.2K 5s 3 2655 yes 0 0 0
我成功地恢复了数据,一切顺利。
结束了
我使用memcached-cli来体验了Memcached的Slabs Reassign和LRU Crawler功能。
Memcached をお使いの方は、ぜひ memcached-cli をお試し下さい。
何かありましたら GitHub 上で Issue や Pull Request をお待ちしています。
- https://github.com/key-amb/perl5-App-Memcached-CLI
那么,尽情享受吧!
请参考
memcached/protocol.txt at master · memcached/memcached
今回紹介した Memcached の機能の仕様を詳しく知りたい方はこちら。
Gotanda.pm #8 で memcached-cli について喋ってきた #gotandapm #memcached – weblog of key_amb
Gotanda.pm #8 についての筆者のブログ記事です。発表したスライドも掲載しています。