具体的に言うと、メモリは余裕があるのに、Evictionが発生してしまっているのだ。
検索したところ、ちょいと記事が古いがMemcachedのメモリ使用方法について詳しいものを見つけた。
これらを見ると一度確保されたチャンクのページは、他のチャンクに割り振られることがないので、最初に容量を確保されてしまったら、開放されることがない模様。
しかし、 version 1.4.11からは「Slab Reassign」、「Slab Automove」と言う、使っていないチャンクのページを、頻繁に使っているチャンクに割り振り直す機能があるようなので、公式ページを見てみた。
以下要約
Slab Reassign
長い間稼働しているmemcahedインスタンスは、すべての利用可能なメモリが特定のスラブクラスに割り当てられている問題に直面するかもしれない。
100バイトのリクエストがたくさんあり、その後200バイトのリクエストが、異なるチャンクに保存された。その場合Memcachedは100バイトのチャンクを使うことができず、200バイトのデータは少ししか保持できない。
1.4.11はスラブページを再割り当てする機能をもつ。 この機能、コマンドはベータです。近々のリリースで変わるかもしれません。覚えておいてください。コマンドが確定したとき、リリースノートにかかれるでしょう。
Slab Reassignを有効にするには、スタート時に以下オプションをつける必要がある。
$memcached -o slab_reassign一度すべてのメモリが割り当てられてしまった場合は、以下コマンドでリアサインできる。
$ echo "slabs reassign 1 4" | nc localhost 11211それは成功を表すエラーコードを返す、または後でリトライするひつようがある。
成功はスラブが移動したことを意味してはない。しかし、 バックグラウンドスレッドがメモリ移動を試みることを意味している。
Slab Automove
slab reassignは手動実行の機能である。Slab Automoveは自動できに実行されるアルゴリズムだ。$ memcached -o slab_reassign, slab_automove上記はスタートアップ時に有効にする。slab_automoveは slab_reassignが最初に有効になっていなければならない。
automoveは起動中にも変更可能
$ echo "slabs automove 0" | nc localhost 11211このアルゴリズムは遅くて、古くさい。10秒のあいだに3回Evictionが発生すると、30秒の間Evictionが発生していないスラブクラスからページを移動させる。このアルゴリズムは十分出ないです。コミュニティを助けてください!改修したらパッチを送ってください!
Slab Reassign Implementation
スラブページのリアサインはトレードオフがある。
- 500kより大きなすべてのアイテムが、1MBのスペースをとる。
- メモリをリアサインしたとき、 1MBのページにいたすべてのアイテムは追い出される。
- スラブリアサインが有効な時、追加のバックグラウンドスレッドが使われる。
ふむふむ。あまり洗練された機能ではなさそうだな。
先のバージョンで改修があるかもしれないので、見てみよう。
1.4.14 で機能に改修があるのを見つけた。以下要約。
slabs reassign -1 15と与えると、どこかのスラブから、クラス15に対してページが移動される。
slabs automoveはアグレッシブなページリアサインアルゴリズムになった。
追い出し発生後とに、移動ができるか試みる。あなたが何が起こっているか本当に理解していないと、決して動かすべきでない。ほとんどの人は、ヒットレートがさがる。
緊急時には使える。
警告します。