3

spymemcached ライブラリ (http://code.google.com/p/spymemcached) を使用してオブジェクトを memcached に読み書きする Java アプリがあります。

アプリは常に同じタイプのオブジェクトを memcached にキャッシュします。キャッシュされたオブジェクトは、常に 5 つまたは 6 つの java.util.String の ArrayList です。SizeOf ライブラリ (http://www.codeinstructions.com/2008/12/sizeof-for-java.html) を使用して、ArrayList の平均ディープ サイズが約 800 バイトであることを確認しました。

全体として、12 GB の RAM を memcached に割り当てました。私の質問は、memcached が保持できるこれらのオブジェクトの数は?

SizeOf の「800 バイト」メトリックを使用することが正しいのか、それとも誤解を招くものなのか、はっきりしません。たとえば、SizeOf は各文字を 2 バイトとしてカウントします。String 内のすべての文字が通常の ASCII 文字であることはわかっています。spymemcached は Java シリアライゼーションを使用していると思いますが、それによって各 char が 1 バイトまたは 2 バイトを占めるようになるかどうかはわかりません。

また、memcached が使用するオブジェクトごとのオーバーヘッドがどの程度かはわかりません。したがって、計算では、memcached が独自の内部データ構造に使用する RAM を考慮する必要があります。

100% 正確な数値は必要ありません。大まかな封筒の裏側の計算は素晴らしいでしょう。

4

1 に答える 1

4

簡単なアプローチは実験です。

  1. memcache を再起動します
  2. 割り当てられたバイトを確認します。echo "stats" | nc localhost 11211 | fgrep "bytes "
  3. 1 つのオブジェクトを挿入し、割り当てられたバイトをチェックします
  4. 10 個のオブジェクトを挿入し、割り当てられたバイトをチェックします

これにより、キーあたりのバイト数がよくわかります。

ただし、シリアル化されたサイズを把握したとしても、それだけでは、そのサイズの memcache が保持するオブジェクトの数がわからない可能性があります。Memcache のスラブ システムと LRU の実装により、その性質を推定することは困難です。

Memcache は、実際にはデータの可用性を保証するように設計されているようには見えません。キーを取得したときに、キーが存在する場合と存在しない場合があります。時期尚早にパージされた可能性があります。プール内のサーバーの 1 つまたは 2 つがダウンした可能性があります。

于 2011-04-01T19:47:01.657 に答える