Linux

從 /proc/pid/smaps 獲取有關程序的記憶體使用情況的資訊

  • May 31, 2018

對於 中的給定程序/proc/<pid>/smaps,對於給定的映射條目,它們是:

  1. Shared_Clean
  2. Shared_Dirty
  3. Private_Clean
  4. 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,我會得到由 報告的程序的 RSS ps,這非常酷。例如

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

進一步閱讀:

關於整個過程的總和:

  • RSS可以(大約+)通過對中的Rss:條目求和來獲得smaps(您不需要將共享/私有共享/臟條目相加)。
awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
  • 您可以以相同的方式總結Pss:值,以獲得 process-global PSS
  • USS中未報告smaps,但實際上它是私有映射的總和,因此您也可以通過相同方式獲取它

請注意,在實際共享之前,“可共享”頁面被視為私有映射。即,如果目前只有一個程序在使用libfoo,則該庫的文本部分將出現在程序的私有*映射中。僅當/當另一個程序開始使用該庫時,它才會在共享映射中計算(並從私有映射中刪除)。

+這些值並不完全適用於所有程序。不完全確定為什麼……對不起。

引用自:https://unix.stackexchange.com/questions/33381