
假設我有一個使用 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
文件(如果您對此感興趣)。