Linux
你如何測量一組分叉程序的記憶體佔用?
假設我有一個使用 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