1. ホーム
  2. linux

[解決済み] アプリケーションやプロセスの実際のメモリ使用量を測定するにはどうすればよいですか?

2022-03-22 23:56:47

質問

Linuxでアプリケーションやプロセスのメモリ使用量を測定するにはどうしたらいいですか?

のブログ記事より Linuxのメモリ使用量を理解する , ps は、この意図のために使用する正確なツールではありません。

<ブロッククオート

なぜ ps は"false"です。

見方によっては ps は、プロセスの実際のメモリ使用量を報告するものではありません。本当にやっていることは、各プロセスがどれだけの実メモリを消費するかを示すことです。 もしそれが唯一のプロセスであったなら . もちろん、典型的な Linux マシンでは、常に数十のプロセスが実行されているため、VSZ や RSS が報告する数値は ps は、ほぼ間違いなく 誤り .

<サブ (注)この質問は こちら を詳しく説明します)。

解決方法は?

ps や類似のツールでは、そのプロセスによって割り当てられたメモリページの量だけを得ることができます。この数値は正しいのですが

  • は、アプリケーションが実際に使用するメモリ量を反映しておらず、アプリケーションのために予約されたメモリ量のみを反映しています。

  • 複数のスレッドや動的リンクライブラリの使用などでページが共有されている場合、誤解を招く可能性があります。

アプリケーションが実際に使用するメモリ量を本当に知りたい場合は、プロファイラで実行する必要があります。例えば ヴァルグラインド は、使用されるメモリの量について、そしてより重要なこととして、プログラム内のメモリリークの可能性についての洞察を与えてくれます。Valgrind のヒーププロファイラツールは 'massif' と呼ばれています。

<ブロッククオート

Massifはヒーププロファイラです。プログラムのヒープを定期的にスナップショットすることで、詳細なヒーププロファイリングを実行します。プログラムのどの部分が最も多くのメモリを割り当てたかという情報を含む、ヒープの使用状況を時系列で表示するグラフが作成されます。このグラフは、テキストファイルまたはHTMLファイルによって補完され、最も多くのメモリが割り当てられている場所を特定するための詳細な情報を含んでいます。Massif は、通常の約 20 倍の速度でプログラムを実行します。

で説明したように Valgrindのドキュメント の場合、Valgrindを通してプログラムを実行する必要があります。

valgrind --tool=massif <executable> <arguments>

Massif は、メモリ使用量のスナップショットのダンプを書き込みます(例. massif.out.12345 ). これらの情報は、(1) メモリ使用量のタイムライン、(2) 各スナップショットについて、プログラムのどこでメモリが割り当てられたかを記録したものです。これらのファイルを分析するための優れたグラフィカルツールは、次のとおりです。 マッシブ・ビジュアライザー . しかし、私は ms_print Valgrindに同梱されているテキストベースのシンプルなツールで、すでに大きな助けになっています。

メモリリークを見つけるには、(デフォルトの) memcheck というツールがあります。