memcached と戦う
イントロ
ゆとり世代なので、今まで redis
しか触ったことない人が memcached
を使うと、辛すぎて涙が出ます。
素手では戦えなかったので、memcached
と戦うため、最低限の武器を揃えました。
公式
- memcached - a distributed memory object caching system
- memcached/memcached: memcached development tree
- wiki にかなり詳しい情報が乗っている
用語
Slabs, Pages, Chunks and Memcached
Slab(= Slab class)
- 起動時にメモリを確保し、特定のサイズで分割されたメモリ領域のことを指す
- 元々は memory の fragmentation を防ぐために設計されたもの
Slab
の実体は「 同じサイズのメモリ領域を持つchunk
の集合」Slab
はSlab 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 byte
が 13107
個存在している。
ところでこの合計は、 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
dump
も memcached-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
でも使われているとのことなので、もう少し深掘りして理解していきたいところ。