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 についての筆者のブログ記事です。発表したスライドも掲載しています。

注脚

也有一个名为Slabs Automove的选项可以自动释放多余的页面。
bannerAds