linux – 在/ proc / pid / smaps中为给定进程更新PSS值的频率
作者:互联网
因此,如果n个进程共享大小为M的库L,则对其PSS的贡献是M / n.
现在假设其中一个进程终止.因此贡献将是M /(n-1).
问题1:我的问题是这个变化多久反映在仍在运行和使用共享库的进程的PSS值中?
Q2:作为一个简单的例子,假设只有两个进程正在使用大小为100K的共享库. PSS对每个过程的贡献是50K.现在当P2死亡时,它是唯一使用L的过程.因此它的PSS应该增加并变为100K.一旦P2死亡或一段时间后,这会发生多久?经过多少时间?
解决方法:
这一变化立即得到反映.沿途没有缓存.当您读取/ proc /< pid> / smaps时,实际上会触发该进程的页表的遍历.有关映射的信息会在此过程中累积,然后显示,而不进行任何缓存.
/ proc /< pid> / smaps文件后面的代码在fs / proc / task_mmu.c中,特别是show_smap
函数.
该函数使用smaps_pte_range
作为PTE回调执行walk_page_range. 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);
}
(您可以在此处看到,如果页面实际映射不止一次,那么页面只能在共享部分中计算 – 否则它将被视为私有页面.)
page_mapcount
在linux / mm.h中内联定义,只需访问结构页面:
static inline int page_mapcount(struct page *page)
{
return atomic_read(&(page)->_mapcount) + 1;
}
因此PSS“始终是最新的”.
标签:linux,memory,process,kernel,virtual-memory 来源: https://codeday.me/bug/20190816/1666029.html