[譯]指定程序更新/proc/pid/smaps中PSS值得頻率是多久?
阿新 • • 發佈:2019-01-22
問題:
如果n個程序共享大小為M的庫L,那麼它們對PSS的貢獻是M/n。
現在假定一個程序終止了,那麼貢獻值變成M/(n-1)。
Q1:我的問題是這種變化在多久反映到仍然執行和使用共享庫的程序的PSS值?
Q2:作為一個普通情況,假定只有兩個程序使用大小為100
k的共享庫L。每個程序的PSS貢獻是50K。現在當P2死亡了,只有一個程序使用庫L。這樣他的PSS將會增加變成100K。多快會發生,P2死亡時,或者其他時刻?之後多久?
回答:
立刻就反映了。沒有延誤。當讀取/proc/<pid>/smaps
時,實際觸發了該程序的頁表遍歷。關於對映的資訊被計算,之後顯示,沒有任何延誤。
/proc/<pid>/smaps
fs/proc/task_mmu.c
中,特指show_smap
函式。 該函式做了一次
walk_page_range
,將smaps_pte_range
作為PTE的回撥。smaps_pte_range
本身計算了結構mem_size_stat
中的資訊。 負責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);
}
(你可以看到只有頁被映射了多次才被認為在共享
部分-佛足額它被認為是私有的。)
page_mapcount
在 linux/mm.h
中定義為內聯的,只是簡單地訪問struct page
:
static inline int page_mapcount(struct page *page)
{
return atomic_read(&(page)->_mapcount) + 1;
}
那麼PSS“總是最新的”。