從 /proc/pid/smaps 獲取有關程序的記憶體使用情況的資訊
對於 中的給定程序
/proc/<pid>/smaps
,對於給定的映射條目,它們是:
- Shared_Clean
- Shared_Dirty
- Private_Clean
- Private_Dirty
Shared_Clean
+是Shared_Dirty
與其他程序共享的記憶體量嗎?所以它就像共享的RSS?同樣是
Private_Clean
+僅可用於一個程序Private_Dirty
的記憶體量?所以它就像私人RSS?PSS 值是否 = PrivateRSS + (SharedRSS / 共享它的程序數)?
閱讀此連結後還有一些問題:LWN
現在讓我們將整個過程作為一個整體來討論,我們正在查看其 smaps 條目。
我注意到,如果我為程序的每個 smaps 條目執行
Shared_Clean
+Shared_Dirty
+Private_Clean
+Private_Dirty
,我會得到由 報告的程序的 RSSps
,這非常酷。例如ps -p $$ -o pid,rss
將給我(大約)與/proc/$$/smaps中每個
Shared_Clean
,Shared_Dirty
,Private_Clean
,條目的總和相同的 rss 值。Private_Dirty
但是整個過程的 PSS 呢?因此,從上面的範例中,我如何獲得 PSS
$$ ? Can I just add the PSS entry for every smaps mapping and arrive at PSS for $$? 整個過程的**USS呢?**再次以上面的例子為例,我猜我可以到達 USS
$$ by summing up only the Private_* entries for every smaps entry for $$..正確的? 注:
PSS= 比例集大小。
USS= 唯一集大小。
乾淨頁面是自映射後未修改的頁面(通常,共享庫中的文本部分僅從磁碟讀取(必要時),從未修改過,因此它們將位於共享的干淨頁面中)。
臟頁是不干淨的頁面(即已被修改)。
私有頁面僅對該程序可用,共享頁面由其他程序映射*。
RSS 是目前映射到程序中的頁面總數,無論是否共享。所以
Shared_Clean
+Shared_Dirty
將是 RSS 的共享部分(即 RSS 中也映射到其他程序的部分),Private_Clean
+Private_Dirty
是 RSS 的私有部分(即僅映射到此程序中)。PSS(比例份額大小)如您所描述。私有頁面按原樣匯總,每個共享映射的大小除以共享它的程序數。
因此,如果一個程序有 100k 私有頁面,500k 頁面與其他程序共享,500k 與其他四個程序共享,則 PSS 將是:
100k + (500k / 2) + (500k / 5) = 450k
進一步閱讀:
- ELC:應用程序真正使用了多少記憶體?
Documentation/filesystems/proc.txt
在核心原始碼中man proc(5)
- Linux 記憶體管理概述
- TLDP.org 的記憶體管理
- LinuxMM
關於整個過程的總和:
RSS
可以(大約+)通過對中的Rss:
條目求和來獲得smaps
(您不需要將共享/私有共享/臟條目相加)。awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
- 您可以以相同的方式總結
Pss:
值,以獲得 process-globalPSS
。USS
中未報告smaps
,但實際上它是私有映射的總和,因此您也可以通過相同方式獲取它請注意,在實際共享之前,“可共享”頁面被視為私有映射。即,如果目前只有一個程序在使用
libfoo
,則該庫的文本部分將出現在程序的私有*映射中。僅當/當另一個程序開始使用該庫時,它才會在共享映射中計算(並從私有映射中刪除)。+這些值並不完全適用於所有程序。不完全確定為什麼……對不起。