computerの日記

Cisco,SHELL,C,Qt,C++,Linux,ネットワーク,Windows Scriptなどの発言です

あるプロセスが使用しているメモリの正確な値を知る方法

お疲れさまです。あるプロセスが、どの程度メモリを使用しているかを知りたいという人がいると思います。

その回答となります。

例えば、 ps コマンドで以下のように出力してみます。
以下は、auditd のプロセスのみを取り出しました。

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...(snip)...
root 885 0.0 0.0 56120 1936 ? S<sl 18:50 0:00 /sbin/auditd
...(snip)...

ここで、VSZ は、Virtual Set SiZe (仮想メモリのサイズ)
RSS は、Resident Set Size (物理メモリのサイズ)

と言われています。

これが、正確な値であるかどうかは、疑わしいです。
他の確認方法として、以下のコマンドを実行する方法があります。

# pmap -x <PID>

結構、いい感じですけど、
共有されているメモリなのか、自分だけに割り当てられているものなのかがわかりません。
そんなときに使えるのが、以下のコマンドです。

# cat /proc/<PID>/smaps

上記コマンドは、メモリをどの位使用しているかを正確に教えてくれます。
もっと重要なことには、メモリを private と shared に分割します。
したがって、いくつかのプログラムのインスタンスにより共有されているメモリを含めることなく、プログラムのインスタンスがどの程度メモリを使用しているかを、知ることができます。


(コマンド)
# pmap -x 885 | less
(結果の一部)
----------------------------
885: /sbin/auditd
Address Kbytes RSS Dirty Mode Mapping
0000560598052000 112 112 0 r-x-- auditd
0000560598052000 0 0 0 r-x-- auditd
000056059826e000 4 4 4 r---- auditd
000056059826e000 0 0 0 r---- auditd
000056059826f000 4 4 4 rw--- auditd
000056059826f000 0 0 0 rw--- auditd
0000560598270000 16 12 12 rw--- [ anon ]
...(snip)...
----------------------------
(コマンド)
# cat /proc/885/smaps | less
(結果の一部)
----------------------------
560598052000-56059806e000 r-xp 00000000 fd:00 3044478 /usr/sbin/auditd
Size: 112 kB
Rss: 112 kB
Pss: 112 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 112 kB
Private_Dirty: 0 kB
Referenced: 112 kB
Anonymous: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd ex mr mw me dw sd
56059826e000-56059826f000 r--p 0001c000 fd:00 3044478 /usr/sbin/auditd
Size: 4 kB
Rss: 4 kB
Pss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
...(snip)...

これなら、あるプロセスが使用しているメモリについて知りたいことが、全て明らかになりすね。

(参考)
https://stackoverflow.com/questions/131303/how-to-measure-actual-memory-usage-of-an-application-or-process

 

何かあれば、お知らせください。