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

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

因此,如果 n 個進程共享大小為 M 的庫 L,則對它們的 PSS 的貢獻為 M/n。

現在想像其中一個行程終止。因此貢獻將為 M/(n-1)。

問題 1:我的問題是,此變更多久會反映在仍在運行並使用共享庫的進程的 PSS 值中?

Q2:作為一個簡單的例子,假設只有兩個進程正在使用大小為 100K 的共享庫 L。 PSS對每個進程的貢獻是50K。現在,當 P2 死亡時,它是唯一使用 L 的進程。這種情況多久會發生,是 P2 死亡後立即發生,還是一段時間後?過了多少時間?

答案1

更改會立即反映出來。一路上沒有快取。當您讀取 時/proc/<pid>/smaps,您實際上觸發了對該進程頁表的遍歷。有關映射的資訊會一路累積,然後顯示,無需任何快取。

文件背後的程式碼/proc/<pid>/smaps位於 中fs/proc/task_mmu.c,特別是show_smap功能。
此函數執行walk_page_range以下操作:smaps_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並簡單地存取struct page

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

所以PSS「始終是最新的」。

相關內容