scramble cadenza

技術ネタのガラクタ置き場

memcached と戦う

イントロ

ゆとり世代なので、今まで redis しか触ったことない人が memcached を使うと、辛すぎて涙が出ます。
素手では戦えなかったので、memcached と戦うため、最低限の武器を揃えました。

公式

用語

Slabs, Pages, Chunks and Memcached

Slab(= Slab class)

  • 起動時にメモリを確保し、特定のサイズで分割されたメモリ領域のことを指す
  • 元々は memory の fragmentation を防ぐために設計されたもの
  • Slab の実体は「 同じサイズのメモリ領域を持つ chunk の集合」
  • SlabSlab Class N という形式で番号を振って管理される
$ ./memcached -vv
slab class   1: chunk size        80 perslab   13107
slab class   2: chunk size       104 perslab   10082
slab class   3: chunk size       136 perslab    7710
slab class   4: chunk size       176 perslab    5957

例) slab class 1 には chunk size 80 byte13107 個存在している。
ところでこの合計は、 80 [byte] * 13107 = 1048560[byte] ≒ 1M であり、デフォルトの page の領域と等しくなる

Chunk

  • レコードをキャッシュするためのメモリ領域
  • 同サイズの chunk の集まりが Slab

Item

  • chunk に保存される value のこと。
  • ユーザーが memcached に保存する値そのものを指す単語
    • 故に chunk は固定サイズに対し、item は変動値
  • memcached では、殆どの場合で chunk = item で話が通じる気がする

Page

  • Slab は複数の Page を持つ
  • デフォルトでは 1MB で分割された memcached のメモリ領域
  • Slab > Page > Chunk みたいなイメージ

Slabs, Pages, Chunks and Memcached

memcached を触るツールたち

telnet

telnet なんて、学校の授業以来、初めて使ったという。。。

stats item

item 一覧を見る

vagrant@mgi166:~$ telnet localhost 11211
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats items
STAT items:1:number 1
STAT items:1:age 57
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
STAT items:1:crawler_reclaimed 0
STAT items:1:crawler_items_checked 0
STAT items:1:lrutail_reflocked 0
END

stats cachedump

対象の slab の item を表示する

# slab 10 の item を 100 個 dump する
stats cachedump 10 100
ITEM users_presences [628 b; 1497009430 s]
ITEM favorites [540 b; 1497009429 s]
ITEM feature_article_categories [509 b; 1497009429 s]
ITEM feature_article_tags [568 b; 1497009429 s]
ITEM messages_uploaded_files [550 b; 1497009429 s]
ITEM services_scores [523 b; 1497009428 s]
ITEM favorites_counts [522 b; 1497009428 s]
ITEM hyperlinks [578 b; 1497009428 s]
ITEM provider_votes [526 b; 1497009429 s]
ITEM follows_counts [618 b; 1497009429 s]
ITEM follows [541 b; 1497009429 s]
ITEM accounts [553 b; 1497009447 s]
ITEM services_reservation_users [619 b; 1497009429 s]
END

memcached-tool

dump/restore の用途では memcached-tool がよく使われるようだ。
ただの perl script なので、持ってなかったら github から直接取得する。

expired 0 の item が dump できないバグがあるらしいので、気をつける。

$ wget https://raw.githubusercontent.com/memcached/memcached/master/scripts/memcached-tool
$ chmod a+x memcached-tool
$ ./memcached-tool localhost 11211
#localhost:11211   Field       Value
         accepting_conns           1
               auth_cmds           0
             auth_errors           0
                   bytes           0
              bytes_read           7
...
                  uptime      122070
                 version 1.4.25 Ubuntu

memcacled-cli を使う

memcached-cli の v0.9.4 までの追加機能の紹介 - weblog of key_amb

memcached-cli を使用するのも良いと思う。
大抵の環境では perl 5.8 以上は入っているし、後は carton を入れてローカルに install すれば良い。

telnet よりコマンドが使いやすい。こういうのが欲しかった。

$ apt-get update
$ cd /root/home
$ mkdir memcached-cli
$ apt-get install carton
$ apt-get install make
$ echo 'requires "App::Memcached::CLI"' > cpanfile
$ carton install
$ carton exec -- memcached-cli

dumpmemcached-tool で取れない expired 0 問題にも対応できている。

# dump
$ carton exec -- memcached-cli localhost:11211 dump_all > dump.txt

# restore
$ carton exec -- memcached-cli localhost:11211 restore_all dump.txt

libmemcached-tools

libmemcached-tools とは memcached の関連ツール群。
(これは apt-get のパッケージ名で、yum でも同じパッケージ名かどうかはわからない)

$ sudo apt-get install libmemcached-tools
$ memc # tab で補完させる
memcached    memccat      memcdump     memcexist    memcparse    memcrm       memcstat
memccapable  memccp       memcerror    memcflush    memcping     memcslap     memctouch

それぞれの使い方は --help でなんとなくわかる。
大体 --servers option が付いていて、これで対象サーバーを指定する。, で複数指定可能。

$ memcdump --help
memdump v1.0

        Dump all values from one or many servers.

Current options. A '=' means the option takes a value.

         --version
                Display the version of the application and then exit.
         --help
                Display this message and then exit.
         --quiet
                stderr and stdin will be closed at application startup.
         --verbose
                Give more details on the progression of the application.
         --debug
                Provide output only useful for debugging.
         --servers=
                List which servers you wish to connect to.
         --hash=
                Select hash type.
         --binary
                Switch to binary protocol.
         --username=
                Username to use for SASL authentication
         --password=
                Password to use for SASL authentication

まとめ

一先ずこれで最低限の操作はできるようになりました。
数ヶ月前、同じ KVM だし key 一覧くらいコマンド一発で見れるやろ、と思っていた自分を殴り倒したいです。

Slab Allocator 周りはゆるく理解したものの、kernel でも使われているとのことなので、もう少し深掘りして理解していきたいところ。

参考