ソケットからデータを受け取り、いくつかの品質管理を行い、それにさまざまな調整を行い、名前付きパイプに書き出すプログラムがあります。私はそれに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)データをドロップするとメモリがリークしました。入力レートは、メモリが消費されたままではなく、ゆっくりと妥当な量に戻ってゆきます。
誰にでも私がここからどこに向かうべきかに関するヒントを教えてもらえますか?私はなぜ記憶がこのように振る舞っているのか完全に困惑しています。
ありがとうございました。
あなたのプログラミングのメモリを集めるだけでなく、そのリークは確実でしょうか?あなたは大衆を試しましたか? – PlasmaHH
私は同じような問題を自分自身に打ちましたが(奇妙ではありません)、私はあなたが得たフィードバックにとても興味があります。 1つの提案:使用しているOS /バージョンを明確にすることはできますか?私はそれがLinux distであると仮定します。 –
Valgrindはプログラムをサンドボックスで実行し、膨大な処理を行います。 valgrindを実行している同じアプリケーションよりもはるかに高いCPU使用率とはるかに低速のパフォーマンスを持つことが期待されます。私は、ストレステスト中に、プログラムがパイプに接続できないデータを保持する余分なバッファを作成し、それが成長しているかどうかを検討します(リークしないで、ペースを保てないほど成長します)。 –