Linux

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

  • October 19, 2012

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

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

像“top”這樣的程序將顯示每個程序使用 200MB,而 SHRd 記憶體非常少,因此看起來程序總共使用了 400MB。然而,因為 fork() 為程序的記憶體頁實現了寫時複製 (COW),所以程序總共只使用了 200MB。

為什麼 top 不顯示 COW 佔記憶體的多少?有沒有辦法讓它這樣做?或者我可以使用另一個命令嗎?

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

/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:應用程序真正使用了多少記憶體?

我不知道有一個常見的類似 top 的工具來顯示這些資訊,ps不幸的是,我認為也沒有選項可以顯示這些資訊。這篇文章指向一個pagemap由 Matt Mackall 呼叫的帶有 python 腳本的儲存庫,您可以使用或調整它。

無恥外掛:如果您對此感興趣,您會在Unix 和 Linux上找到一些關於 PSS 和文件的文章。smaps

引用自:https://serverfault.com/questions/440115