2017-02-19 5 views
0

背景:私は検索エンジンで作業しており、新しいスレッドプール(32スレッド)を作成する新しい機能を開発しています。いくつかのルールを満たすクエリは、新しいスレッドプールによって実行されます。同時に、古いスレッドプール(32個のスレッドもあります)は引き続き動作し、他のクエリを実行します。サービスを再開しないで新しいスレッドプールを使用した後、Jemallocのメモリが大きく増加する

問題:私たちはメモリ割り当てにJemallocを使用しています。新しい機能を有効にして新しいスレッドプールが動作するようになると、Jemallocで消費されるメモリは4〜5時間で80GBから95GBに増加し、2時間でダウンします。私はJemallocの統計番号を見てきました。増加したメモリはすべてstats.mapped(Jemallocによって割り当てられたもの)から来ました。 "stats.active"と "stats.allocated"(私たちのサービスで消費される)は変更されず、メモリの増加はメモリの断片化に起因する可能性があります。ここで

は「stats.allocated」と「stats.active」、「stats.mapped」の定義は次のとおりです。

  1. JeMallocはバイトをマップされた:アクティブチャンクのバイト 合計数(デフォルトは4メガバイトあたりですチャンク)を割り当てます(Jemalloc)。これは、チャンクサイズの倍数であり、JeMallocアクティブバイトよりも大きい。これには、使用されていないダーティページが含まれていても、非アクティブなチャンクは含まれません。つまり、このstats.residentとの間に厳密な順序はありません。
  2. JeMallocアクティブバイト: アプリケーション(私たちのサービス)によって割り当てられたアクティブなページ(デフォルトは4KB /ページ)の合計バイト数。これはページサイズの倍数であり、stats.allocated以上です。これには、stats.arenas..pdirtyや、アロケータメタデータ専用のページは含まれません。
  3. JeMalloc割り当てバイト: アプリケーション(私たちのサービス)によって割り当てられた合計バイト数。

メモリの増加は、(80ギガバイトから95ギガバイトまで)が大きすぎるので、私達は私達の機能を有効にすると、メモリの影響を軽減したい、あなたは上記の問題(Jemallocのメモリの断片化)についての提案がありますか?ありがとう!

私はtcacheを無効にしようとしましたが、新しい機能を有効にするとメモリが増加します。

Graph of memory changing

答えて

0

あなたは、断片化が非常にいくつかのアリーナのため高く、かつ他人のために許容可能であるように、頻繁に使用されていないいくつかのアリーナを有することができます。 narenasオプションを使用してアリーナの数を減らして、定常状態の動作中にアリーナがアイドル状態にならないようにしてください。

+0

ありがとうございました。私はnarenasオプションを試してみます。私たちはバージョン3.3.1を使用しています。自分のコードでje_mallctl関数を使って "opt.lg_chunk"や "opt.narenas"などのオプション値を設定できますか?私はje_mallctlを使って "opt.lg_chunk"を設定しようとしていますが、この値をもう一度取得して印刷すると効果がないようです... – Shuai

関連する問題