**この質問については、こちらで詳しく説明しています。
Linuxでアプリケーションやプロセスのメモリ使用量を測定するにはどうすればよいですか?
Understanding memory usage on Linux]2のブログ記事によると、ps
はこの目的のために使用する正確なツールではありません。
なぜ
ps
は "wrong"なのか? となります。 見方によっては、ps
はプロセスの実際のメモリ使用量を報告していません。実際に行っているのは、各プロセスが唯一のプロセスを実行している場合に、各プロセスがどれだけの実メモリを占有するかを示しているのです。もちろん、典型的なLinuxマシンでは、常に数十個のプロセスが実行されていますので、ps
が報告するVSZやRSSの数値は、ほぼ間違いなく*間違っていることになります。
ps`や同様のツールでは、そのプロセスが割り当てたメモリページの量しか得られません。この数字は正しいのですが
アプリケーションが実際に使用しているメモリ量を反映しておらず、アプリケーションのために確保されたメモリ量のみを反映しています。
ページが複数のスレッドで共有されていたり、動的にリンクされたライブラリを使用している場合は、誤解を招く可能性があります。
アプリケーションが実際に使用しているメモリ量を本当に知りたいのであれば、プロファイラで実行する必要があります。例えば、valgrind
は、使用されているメモリの量についての洞察を与えてくれますし、さらに重要なことには、プログラムで起こりうるメモリリークについても教えてくれます。valgrindのヒーププロファイラツールは 'massif'と呼ばれています。
と呼ばれています。 Massifはヒーププロファイラです。プログラムのヒープのスナップショットを定期的に取ることで、詳細なヒーププロファイリングを行います。プログラムのどの部分が最も多くのメモリ割り当てを行っているかなどの情報を含む、ヒープの使用状況を時系列でグラフ化します。また、このグラフに加えて、メモリが最も多く割り当てられている場所を特定するための情報を含むテキストまたは HTML ファイルが提供されます。Massif は、プログラムの実行速度が通常の約 20 倍になります。
valgrind documentation]1で説明されているように、プログラムを valgrind で実行する必要があります。
valgrind --tool=massif <executable> <arguments>
Massif はメモリ使用量のスナップショットのダンプを書き込みます (例 : massif.out.12345
)。これらは、(1) メモリ使用量のタイムライン、(2) 各スナップショットごとに、プログラムのどこでメモリが割り当てられたかの記録を提供します。
これらのファイルを分析するための素晴らしいグラフィックツールが massif-visualizer です。しかし私は、valgrindに同梱されているシンプルなテキストベースのツールであるms_print
がすでに大きな助けとなっていることに気づきました。
メモリリークを見つけるには、valgrindの(デフォルトの)memcheck
ツールを使います。
はっきりしたことは言えませんが、ここでは、2つの&quot;close&quot;が役に立ちます。
$ ps aux
は、仮想サイズ(VSZ)を表示します。
また、/proc ファイルシステムから /proc/$pid/status
にアクセスすると、詳細な統計情報を得ることができます。
最も重要なのは VmSize で、これは ps aux
で得られる値に近いはずです。
となります。
/proc/19420$ cat status
名前: firefox
状態: S (スリーピング)
Tgid: 19420
Pid: 19420
PPid: 1
TracerPid: 0
Uid:1000 1000 1000 1000
Gid:1000 1000 1000 1000
FDSサイズ: 256
グループ: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000
VmPeak: 222956 kB
VmSize: 212520 kB
VmLck: 0 kB
VmHWM: 127912 kB
VmRSS: 118768 kB
VmData: 170180 kB
VmStk: 228 kB
VmExe: 28 kB
VmLib: 35424 kB
VmPTE: 184 kB
スレッド数: 8
シグQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000020001000
SigCgt: 000000018000442f
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed: 03
Mems_allowed: 1
voluntary_ctxt_switches: 63422
nonvoluntary_ctxt_switches: 7171
となっています。