Linux
/proc/pid/smaps 中給定程序的 PSS 值多久更新一次
因此,如果 n 個程序共享一個大小為 M 的庫 L,那麼對它們的 PSS 的貢獻是 M/n。
現在想像其中一個過程終止。所以貢獻是 M/(n-1)。
Q1:我的問題是這種變化多久會反映在仍在執行和使用共享庫的程序的 PSS 值中?
Q2:作為一個小例子,假設只有兩個程序正在使用大小為 100K 的共享庫 L。PSS對每個程序的貢獻是50K。現在當 P2 死亡時,它是唯一使用 L 的程序。所以它的 PSS 應該增加並變為 100K。這種情況多久會發生,一旦 P2 死掉,或者一段時間後?過了多少時間?
更改會立即反映出來。一路上沒有記憶體。當您閱讀時
/proc/<pid>/smaps
,您實際上觸發了對該程序的頁表的遍歷。有關映射的資訊在此過程中累積,然後顯示,沒有任何記憶體。
/proc/<pid>/smaps
文件後面的程式碼在中fs/proc/task_mmu.c
,特別是show_smap
函式。該函式將
walk_page_range
withsmaps_pte_range
作為 PTE 回調。smaps_pte_range
本身在 a 中積累資訊struct mem_size_stats
。該程式碼負責的部分是
PSS
:mapcount = page_mapcount(page); if (mapcount >= 2) { if (pte_dirty(ptent) || PageDirty(page)) mss->shared_dirty += ptent_size; else mss->shared_clean += ptent_size; mss->pss += (ptent_size << PSS_SHIFT) / mapcount; } else { if (pte_dirty(ptent) || PageDirty(page)) mss->private_dirty += ptent_size; else mss->private_clean += ptent_size; mss->pss += (ptent_size << PSS_SHIFT); }
Shared
(您可以在此處看到,如果頁面實際上被多次映射,則只能在該部分中計入- 否則它被計為私有。)
page_mapcount
內聯定義linux/mm.h
並簡單地訪問 astruct page
:static inline int page_mapcount(struct page *page) { return atomic_read(&(page)->_mapcount) + 1; }
所以 PSS 是“永遠是最新的”。