memcachedの予期しない(?)高「浪費」メモリ


18

更新されました。長めの(申し訳ありませんが)質問の下部を参照してください。

memcachedの統計を見ると、以前は気付かなかった問題を見つけたと思います。無駄なスペースが非常に多いようです。phpmemcacheadminで変更を確認したところ、この画像が私を見つめていました。

memcachedキャッシュサイズの図

今、私は最悪のシナリオは50%の無駄があるという印象を受けましたが、すべての詳細を知らないことを認めたのは初めてです。とりわけ古いこのページを読みましたが、私たちのバージョンのmemcachedもそうです。システムがどのように機能するかは理解していると思いますが(たとえば)、私は、76%の無駄なスペースに到達する方法を理解するのに苦労しています。

phpmemcacheadminが示す追い出し率はです2 ev/sので、ここで問題があります。

  • 主な質問は次のとおりです。これを修正するにはどうすればよいですか。私はそれでより多くのメモリを投げることができました(私は考えるといくつかの余分な空きがあります)、多分私はスラブ設定をいじる必要があります(このバージョンでも可能ですか?)、多分他のオプションがありますか?memcachedバージョンのアップグレードは、すぐに利用できるオプションではありません。

  • 好奇心から二番目の質問は、75%(および上昇)の無駄なスペースの割合が予想される場合、そしてそうである場合は、その理由はもちろんです。

システム:現在、これは私ができることではありません。memcachedバージョンは最新のものではないことは知っていますが、これらは私が扱ったカードです。

  • Memcached 1.4.5
  • Apache 2.2.17
  • PHP 5.3.5

@DavidSchwartzの答えへの応答として:phpmemcacheadminが生成するスラブ統計は次のとおりです(これらよりも多くのスラブがあります)

私もここからテキスト形式で少し後で統計を貼り付けました

スラブの詳細

更新

デーモンを-f 1.5で再起動しましたが、本当に見栄えがよかったです。ある程度の温暖化の後、50/50の使用済み/無駄がありました。しかし、以前と同じように、1日が長ければ長いほど(日中は忙しくなります)、現在の30/70に戻り始め、無駄は増え続けています。それとは別に、「無駄」がどこから来たのか、私にはまだわかりません。このスラブが見えます:

**Slab 5 Stats**
Chunk Size  496.0 Bytes
Used Chunk  77502 [24.6 %]
Total Chunk 314986
Total Page  149
Wasted      117.3 MBytes
Hits        30.9 Request/sec
Evicted     0

いっぱいではなく、排除されていませんが、117.3 MBを無駄にしています。私がした迅速な計算(間違っていたら修正)は次のとおりでした:

  • 前のスラブのチャンクサイズは328であるため、最悪の場合、このスラブは329バイトのチャンクで埋められます。
  • これは、使用済みチャンクあたり167バイト= 12942834バイト= 12.3 MBを無駄にしていることを意味します

では、他の105 MBの無駄はどこから来たのでしょうか?次のような兄です。

**Slab 6 Stats** 
Chunk Size  744.0 Bytes
Used Chunk  17488 [31.0 %]
Total Chunk 56360
Total Page  40
Wasted      31.1 MBytes
Hits        107.7 Request/sec
Evicted     1109

問題は、他のスラブに大量の未使用スペースがあるのに、スラブ3が100%満杯で立ち退きをしていることです。
デビッドシュワルツ

良い点、それは立ち退きを説明するだろうが、「浪費された」数がどのように計算されるかは本当にわからない。スラブ8の使用率が13.9%のみの場合、「空き」スペースが必ず残っているはずです。
ナネ

はい、そのスラブには空きスペースがあります。しかし、追い出されているオブジェクトがそのスラブに入らない場合、それは役に立ちません。
デビッドシュワルツ

それが私があなたの答えから推測したものですが、なぜ空きスペースがリストされていないのですか?少なくともスペースが残っている場合は、(テストインストールのように)円グラフの一部が存在するはずです。少なくとも、それが私が考えていたものです
Nanne

回答:


10

この質問から1年が経ち、あなたが答えを見つけたかどうかはわかりませんが、「無駄」に対するあなたの認識は間違っていると言います。

無駄なメモリはメモリに割り当てられるため、別のアプリケーションで使用することはできませんが、memcachedで使用できます。

説明を簡単にするために、3 MBのRAMと3つのスラブを持つmemcacheがあると仮定します。

slab class  1: chunk size     10485 perslab      100
slab class  2: chunk size    104857 perslab       10
slab class  3: chunk size   1048576 perslab        1

10kサイズの単一の「セット」を実行します。統計に(大まかに)表示されます:

0.03% used
66.6% free
33% wasted

これは、memcachedが「スラブクラス1」から単一のチャンクを割り当て、そのスラブのメモリの99%が「浪費」され、1%が「使用」されているためです。

10kサイズの別の単一の「セット」を実行します。今回は以下が表示されます。

0.06% used
66.6% free
32.7% wasted

そのため、スラブ1で割り当てられた100個のチャンクのうち2個を使用し、「無駄な」統計は削除され、使用済みの統計は増加しました。

used%+ wasted%が100%であることに問題はありません。これは、メモリが残っていないという意味ではなく、各スラブから少なくとも1つのチャンクを割り当てたことを意味します。

この問題を確認するには、サイズが100kの「セット」とサイズが1000kの別のセットを確認します

今、あなたは表示されます

36.6% used
   0% free
63.3% wasted

いいですね!これをバックアップするリンクはありますか?もしそうなら、それは私のmemcache-serverのパフォーマンスが良かった(している)ことを意味します:)。私があなたを正しく理解している場合、無駄は割り当てられているが、まだ使用可能であることを意味します。これは、無料のものがなければスラブをそれ以上割り当てることができないことを意味しますが、それ自体に問題があるわけではありませんか?
ナネ

1
頭の上にリンクはありませんが、自分でテストするのはとても簡単です。コマンドラインを押して、サンプルの小さなサーバーを作成し、動作をテストします。詳細なデバッグメッセージに-vvオプションを使用すると、最初に作成されたスラブが表示されます。「memcached -vv -p 11500 -m 3 -n 10000 -f 10」では、チャンクサイズが10k 100kおよび1000kのスラブが3つ作成されます。そして、「セット」を発行し続け、無駄/使用された統計が上記のとおりに変化することを確認してください。
カーリー

いい視点ね。今、私はあなたのためにこの答えにいくつかの特別な注意を引くことができる方法を見つけるために:)
ナンヌ

6

おそらく非常に多くの非常に小さなオブジェクトがあります。通常、最小のスラブは104バイトのエントリを保持します。ある整数を別の整数にマップするだけのエントリが多数ある場合、85%もの無駄を取得できます。

この問題を回避する方法に関する情報は、Memcached for small objectsの記事に記載されています


統計ページを正しく読んだ場合、これは当てはまりません。ほとんどの廃棄物は、480.0バイトチャンクのスラブにあります。いくつかの統計情報を表示できるかどうかを確認しましょう
...-

ああ、これは正常で、心配することはありません。そこにあるデータはわずかになりました。(たとえば、そのスラブは14%しか使用されていないことに注意してください。)
デイビッドシュワルツ

しかし、75%がどのように無駄になるのでしょうか?この数には未使用のスペースが含まれていますか?それが「無料」としてカウントされることを期待しています。また、サイトは忙しくなりますが、1日が経つにつれて無駄になるメモリの増加//使用メモリの減少が見られます。それと、立ち退きがあるという事実から、何ができるのだろうかと思います。
ナネ

スラブの数を減らすことで、間違ったスラブにメモリーが過剰に詰まる問題を回避できます。たとえば、-f 1.5 -I 2800役立つかもしれません。
デビッドシュワルツ

マンページはあまり明確ではありません-I 2800。1Mのデフォルトではなく、2800Kを意味しますか?
ナネ

-1

この問題が発生し、memcachedからredisに移動しました(ディスクベースの保存なし)。これは不可能かもしれませんが、オプションとして試して、メモリの断片化に注意してください。再起動時の「古いキャッシュ」の問題を修正するために、持続性をオンにすることもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.