2013年6月25日火曜日

Memcache のSlab Reassign, Slab Automoveについて

Memcache1.4.5を使用しているのだが、アプリケーションにとって不都合な点がでている・・・
具体的に言うと、メモリは余裕があるのに、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つめのものは、のちのバージョンで改修される。そして、 -o slab_reassignオプションをつけなければ回避されます。


ふむふむ。あまり洗練された機能ではなさそうだな。
先のバージョンで改修があるかもしれないので、見てみよう。
1.4.14 で機能に改修があるのを見つけた。以下要約。

slabs reassign -1 15と与えると、どこかのスラブから、クラス15に対してページが移動される。

slabs automoveはアグレッシブなページリアサインアルゴリズムになった。
追い出し発生後とに、移動ができるか試みる。あなたが何が起こっているか本当に理解していないと、決して動かすべきでない。ほとんどの人は、ヒットレートがさがる。
緊急時には使える。

警告します。


結論

緊急時意外使わない方がいいのでは。

0 件のコメント:

コメントを投稿