/proc/pid/smapsの特定のプロセスのPSS値が更新される頻度

/proc/pid/smapsの特定のプロセスのPSS値が更新される頻度

したがって、n個のプロセスがサイズMのライブラリLを共有する場合、そのPSSへの寄与はM / nです。

それでは、プロセスの1つが終了すると想像してみてください。したがって、寄与度はM/(n-1)になります。

Q1:私の質問は、この変更はまだ実行されており、共有ライブラリを使用しているプロセスのPSS値にどのくらい速く反映されていますか?

Q2:簡単な例として、2つのプロセスのみが100Kサイズの共有ライブラリLを使用しているとします。プロセスあたりのPSS寄与は50Kです。今、P2が死んだ場合、Lを使用する唯一のプロセスです。したがって、PSSは増加して100Kになるはずです。これはどのくらいの頻度で発生しますか? P2が死んだ直後に発生しますか、それともしばらくすると発生しますか?どのくらいの時間が経過しましたか?

答え1

変更はすぐに反映されます。途中でキャッシュはありません。を読むと、/proc/<pid>/smaps実際にプロセスのページテーブルに移動します。マッピングに関する情報は、途中で蓄積された後にキャッシュなしで表示されます。

ファイルの後ろのコードは特に/proc/<pid>/smapsありますfs/proc/task_mmu.cshow_smap機能。
この関数はwalk_page_range次のことを行います。smaps_pte_rangePTEコールバックで。smaps_pte_range自分で情報を蓄積します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は「常に最新の状態」です。

関連情報