Linux

/proc/pid/smaps 中給定程序的 PSS 值多久更新一次

  • March 15, 2012

因此,如果 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_rangewithsmaps_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並簡單地訪問 a struct page

static inline int page_mapcount(struct page *page)
{
   return atomic_read(&(page)->_mapcount) + 1;
}

所以 PSS 是“永遠是最新的”。

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