私は無期限に成長する内部 C++ アプリケーションを持っています。そのため、RSS が特定のピーク サイズ (2.0G) に達すると実際にアプリケーションを強制終了するロジックを実装して、順序の類似性を維持する必要がありました。ただし、これはいくつかの奇妙な動作を示しています。
まず、Valgrind と memcheck を使用してアプリケーションを実行し、ランダムなメモリ リークをあちこちで修正しました。ただし、これらのメモリ リークの程度は、数十メガバイト単位で測定されました。これは理にかなっています。実際のメモリ リークはなく、アプリケーション側のメモリ管理が不十分である可能性があるからです。
次に、Valgrind と Massif を使用して、メモリがどこに向かっているのかを確認しました。ピークのスナップショットは 161M で、RSS フィールドを使用して確認できる 1.9G+ のピークにはほど遠いものです。最大の消費は、std::string であると予想される場所ですが、これは異常ではありません。
最後に、これが最も不可解です。このメモリ リークに気付く前に、AWS でこのサービスを実際にテストしていたのですが、楽しみのために、CC2.8XL マシンでワーカーの数を 44 に設定しました。労働者。これは 60.5G の RAM で、スワップはありません。1 か月早送りします。私はホストを見に行きます-そして、低いと見よ、それは RAM で限界に達しています--しかし! プロセスはまだ正常に実行されており、メモリ使用量のさまざまな段階でスタックしています。800M から 1.9G までほぼ均等に分散されています。ときどきdmesg
、メモリを割り当てることができないという Xen エラーが出力されますが、それ以外は、プロセスが終了することはなく、アクティブに処理を続けます (つまり、「スタック」していません)。
私がここに欠けているものはありますか?基本的には機能していますが、私の人生では、その理由がわかりません。次に何を探すべきかについて、何をお勧めしますか? それを理解するのに役立つツールはありますか?