如何測量一組分叉進程的記憶體佔用?

如何測量一組分叉進程的記憶體佔用?

假設我有一個使用 200MB 記憶體的進程,並且它 fork()s:

python -c "import os; data='x'*200000000; os.fork(); raw_input()"

像「top」這樣的程式將顯示每個進程使用 200MB,而 SHRd 記憶體非常少,因此看起來這些進程總共使用了 400MB。然而,由於 fork() 為進程的記憶體頁實作了寫入時複製 (COW),因此實際情況是進程總共僅使用 200MB。

為什麼 top 不顯示 COW 的記憶體比例?有沒有辦法讓它這樣做?或者我可以使用另一個命令來代替?

注意:OSX 上的「top」似乎有一個 RSHRD 列,可以滿足我的期望。我的問題是針對Linux的。

答案1

/proc/<pid>/smaps您可以以條目的形式從每個進程的檔案中取得此類資訊Pss(「比例共享大小」的縮寫)。

在上面兩個進程之間「共享」200MB 的範例中,每個進程將在該映射的PSS 條目中顯示100MB,即內存在共享它的進程之間均勻分佈(直到它被任一進程複製並取消共享)。

這是運行類似您發布的內容的摘錄:

$ top
...
30986 me        20   0  790m 769m 2200 S    0  4.8   0:00.48 python3.2
30987 me        20   0  790m 767m  224 S    0  4.8   0:00.00 python3.2
$ cat /proc/30986/smaps
...
0119a000-015b7000 rw-p 00000000 00:00 0                                  [heap]
Size:               4212 kB
Rss:                3924 kB
Pss:                1992 kB
...
7fa06b020000-7fa09ab11000 rw-p 00000000 00:00 0 
Size:             781252 kB
Rss:              781252 kB
Pss:              390626 kB
...
7fff8e45a000-7fff8e489000 rw-p 00000000 00:00 0                          [stack]
Size:                192 kB
Rss:                 160 kB
Pss:                  82 kB
...

(有一個很多這些文件中的內容,包括可能在許多進程之間共享的共享庫的映射,因此每個進程在其 PSS 條目中只佔其中的一小部分。

這是一篇關於此的好文章:ELC:應用程式實際使用了多少記憶體?

我不知道有一個常見的類似頂部的工具來顯示此信息,ps不幸的是,我認為也沒有選項可以顯示該信息。該文章指向一個包含 python 腳本的儲存庫,名為pagemap作者:Matt Mackall,你可以使用或改編。

無恥的插件:你會發現一些帖子Unix 和 Linux關於 PSS 和smaps文件(如果您對此感興趣)。

相關內容