我已经搜索了很多关于什么是“每个proc的页面共享因子”负责并且什么也没找到。这对我来说很有意思,我现在暂时没有问题,只是好奇(知道更多)。在sysctl中它是:
vm.pmap.shpgperproc
提前致谢
答案 0 :(得分:3)
首先要注意的是shpgperproc
是一个加载程序可调参数,因此只能在启动时使用loader.conf
中的相应指令进行设置,之后它是只读的。
要注意的第二件事是它在<arch>/<arch>/pmap.c
中定义,它处理vm子系统的体系结构相关部分。特别是,它实际上并没有出现在amd64 pmap.c
中 - 它最近被删除了,我将在下面讨论一下。然而,它存在于其他架构(i386,arm,...),并且它在每个架构上使用相同;即,它看起来如下:
void
pmap_init(void)
{
...
TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
pv_entry_max = shpgperproc * maxproc + cnt.v_page_count;
并没有在其他地方使用它。 pmap_init()
仅被调用一次:在引导时作为vm子系统初始化的一部分。 maxproc
,只是可以存在的最大进程数(即kern.maxproc
),而cnt.v_page_count
只是可用内存的物理页数(即vm.stats.v_page_count
)。
pv_entry
基本上只是物理页面的虚拟映射(或更准确地说是struct vm_page
,因此如果两个进程共享一个页面并且两者都映射了它们,那么将会有一个单独的{{每个映射的结构。因此,给定需要弄脏或分页的页面(pv_entry
)或需要更新hw页面表的内容,可以通过查看相应的映射虚拟页面列表相应的struct vm_page
列表(例如,请查看pv_entry
)。
使用i386/i386/pmap.c:pmap_remove_all()
s可以提高某些VM操作的效率,但是当前的实现(至少对于i386)似乎分配了一定的静态空间(参见pv_entry
,它基于pv_maxchunks
用于pv_entry_max
,用于管理pv_chunk
。如果内核在解除分配非活动状态后无法分配pv_entry
,则会发生恐慌。
因此,我们希望根据我们想要空间的pv_entry
来设置pv_entry_max
;显然,我们至少需要与RAM页面(pv_entry
来自哪里)一样多。然后我们想要允许这样一个事实:许多页面将由不同的进程进行多个虚拟映射,因为需要为每个这样的映射分配cnt.v_page_count
。因此pv_entry
- 在所有拱门上的默认值为200 - 只是一种扩展它的方法。在一个系统中,许多页面将在进程之间共享(例如在运行apache的负载很重的Web服务器上),显然可能会耗尽shpgperproc
s,因此人们会想要提升它。
答案 1 :(得分:0)
我现在没有FreeBSD机器靠近我,但似乎这个参数是在pmap.c中定义和使用的,http://fxr.watson.org/fxr/ident?v=FREEBSD7&im=bigexcerpts&i=shpgperproc