2013-08-07 49 views
4

我在計算一組進程實際使用的內存(駐留)時遇到了問題。在Linux上通過一組進程計算已用內存

剛剛出現的問題是一組用戶擁有一組共享內存之間的內存的過程,所以簡單添加已用內存最後會出現無用數字(當機器只有48GB內存時> 60gb)。

有沒有簡單的方法來解決這個問題?

我大概可以做一些近似。以(res mem - shared mem) * num proc + shared mem。但並非所有進程都必須共享相同的內存塊。

我正在爲C/C++尋找針對此問題的POSIX或Linux解決方案。

+0

遠不是答案,但我想你可以根據'/ proc/$ {PID}/maps'確定哪些進程共享什麼內存。 – 2013-08-07 13:27:10

+0

您也可以嘗試[ps](http://unixhelp.ed.ac.uk/CGI/man-cgi?ps)命令,該命令顯示不同進程使用的內存。 –

+0

@ArunR我在ps中沒有看到這樣的選項,你能否提供答案? –

回答

3

你會希望通過每個流程/proc/[pid]/smaps

它將包含喜歡的每個VM映射的條目進行迭代:

7ffffffe7000-7ffffffff000 rw-p 00000000 00:00 0       [stack] 
Size:    100 kB 
Rss:     20 kB 
Pss:     20 kB 
Shared_Clean:   0 kB 
Shared_Dirty:   0 kB 
Private_Clean:   0 kB 
Private_Dirty:  20 kB 
Referenced:   20 kB 
Anonymous:   20 kB 
AnonHugePages:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

Private_Dirty內存是你所感興趣的東西

。如果您的smaps文件中有Pss字段,則這是常駐內存量除以共享物理內存的進程量。

Private_Clean可能是寫時複製映射。這些通常用於共享庫,通常是讀/不寫/執行。

+0

所以我很接近:) – 2013-08-07 13:31:34

+0

男人,我有點希望會有一些稍微簡單一些:-D但是,好的,謝謝你的信息:-) –

+0

@Let_Me_Be在'bash'中(設置'$ PIDS'逗號分隔的pid ):'grep -h -s Pss:/ proc/{$ PIDS}/smaps | awk'{sum + = $ 2} END {print sum「kB」}'' –