2012-08-30 9 views
7

ソケットからデータを受け取り、いくつかの品質管理を行い、それにさまざまな調整を行い、名前付きパイプに書き出すプログラムがあります。私はそれにvalgrindを実行し、元々存在していたすべてのメモリリークを修正しました。私は、このプログラムの32のインスタンスを実行していたシステム上に「デモ」環境を作成しました。各インスタンスには固有のデータが供給され、それぞれ独自のパイプに出力されます。我々はそれをテストし、すべてがうまくいくように見えました。それから、私は、データが不合理なレートで送信される速度を上げてストレステストを試みました。物事は最初は良く見えました...しかし、私のプログラムは、リソースがなくなるまで、より多くのメモリを消費し続けました。どのようにメモリリークを狩るvalgrindは存在しませんか?

私はvalgrindに回り、leakgheck = fullを使用してvalgrind内で実行されている各プログラムを除いて全く同じセットアップを実行しました。ちょっと変わったことが起こった。まず、メモリはリークしましたが、各プログラムが自分のメモリの9%を消費した時点(以前は一番大きなメモリを持っていたのは私のメモリの6%でした)まででした。 valgrindが起動したプログラムのCPUコストを稼いで、現在は100%CPUで負荷平均が非常に大きいため、使用可能なCPUが不足しているため、すべてのプログラムがゆっくり実行され、リークが長すぎて。これらのプログラムを停止しようとしたとき、valgrindは直接的なメモリリークを示していませんでした。メモリリークの可能性がありましたが、私はそれらをチェックしました。また、プログラムが100 MBを消費している間に、メモリリークの可能性が数キロバイトしか示されていませんでした。 valgrindによって報告された到達可能な(リークされていない)メモリもKB範囲に入っていたので、valgrindは自分のプログラムがTopが使用しているメモリのほんの一部を消費していると考えているようです。

私はいくつかのテストを実行し、奇妙な結果を得ました。 1つのプログラムでも、私の元のメモリリークが検出されたレートが3倍であっても、0.9%以上のメモリを消費することはなく、2つのプログラムはそれぞれ1.9%と1.3%のメモリリークが発生します。漏れたメモリの量、および漏れの割合は、何度も私のプログラムのインスタンスが一度に実行されているかどうかによって決まります。それは意味をなさない、それぞれのインスタンスは他のものと100%独立しているべきです。

私は、valgrindインスタンスでvalgrindインスタンスを実行しているインスタンスが1つしかない32インスタンスを実行した場合(valgrindインスタンス以外のインスタンスよりも遅い速度でメモリがリークします) valgrindのインスタンスは、私はダイレクトリークがなく、トップショーのメモリ消費量がはるかに少ないと言うでしょう。

私は、この結果を引き起こす可能性があることと、valgrindがメモリリークを認識することを拒否している理由についてむしろ困惑しています。私はそれが外の図書館かもしれないと思ったが、私は実際に外部図書館を使用していない。基本的なC++の関数/オブジェクトです。私はまた、出力パイプに書き込まれたデータがバッファを無期限に成長させることができると考えましたが、1)そのようなバッファが大きくなる上限があります.2)データをドロップするとメモリがリークしました。入力レートは、メモリが消費されたままではなく、ゆっくりと妥当な量に戻ってゆきます。

誰にでも私がここからどこに向かうべきかに関するヒントを教えてもらえますか?私はなぜ記憶がこのように振る舞っているのか完全に困惑しています。

ありがとうございました。

+2

あなたのプログラミングのメモリを集めるだけでなく、そのリークは確実でしょうか?あなたは大衆を試しましたか? – PlasmaHH

+0

私は同じような問題を自分自身に打ちましたが(奇妙ではありません)、私はあなたが得たフィードバックにとても興味があります。 1つの提案:使用しているOS /バージョンを明確にすることはできますか?私はそれがLinux distであると仮定します。 –

+0

Valgrindはプログラムをサンドボックスで実行し、膨大な処理を行います。 valgrindを実行している同じアプリケーションよりもはるかに高いCPU使用率とはるかに低速のパフォーマンスを持つことが期待されます。私は、ストレステスト中に、プログラムがパイプに接続できないデータを保持する余分なバッファを作成し、それが成長しているかどうかを検討します(リークしないで、ペースを保てないほど成長します)。 –

答えて

1

これは私が最近した問題のようです。

プログラムがデータを受け入れ、制限なく内部的にバッファする場合、データを出力できる速度よりも速く読み込みとバッファリングが行われている可能性があります。その場合、メモリ使用量は制限なく増加し続けます。

実行するプログラムのインスタンスが多くなるほど、各インスタンスの実行速度が遅くなり、バッファが高速になります。

これはあなたの問題であるかもしれないし、問題ではないかもしれませんが、それ以上の情報がなければ私ができることは最高です。

+0

これは正確に最も近いものでした。私はデータをx秒ごとに出力することを想定していました(設定ファイルで悩まされていました)。しかし、バグのためにタイムアウト時間を保存したカウンタが起動時に増分していたので、1分分のデータを保存していました。システムに余分な負担がかかったため、起動時にタイムアウトカウンタが頻繁に増加するというバグが発生しました。私は正しい方向に私を置いた大衆の言葉についてPlasmaに感謝したいと思います。私はmemcheckが私に内部メモリの使用を見ないように使用されたメモリがあまりないことを私に伝えていると思いました。私はapparntly誤解memcheck。 – dsollen

2

最初にソフトリークを調べる必要があります。いくつかの静的またはシングルトンがバッファまたはコンテナを徐々に増加させ、ゴミを収集するときに起こります。技術的にはリークではありませんが、その影響は悪いです。

1

MemoryScapeで試してみることをお勧めしますか?このツールは、メモリリークの検出に非常に有効です。それは無料ではありませんが、時間とエネルギーを費やしていれば、試してみる価値があります。

関連する問題