freebsd shpgperproc负责什么?

时间:2012-05-05 07:09:29

标签: performance freebsd sysctl

我已经搜索了很多关于什么是“每个proc的页面共享因子”负责并且什么也没找到。这对我来说很有意思,我现在暂时没有问题,只是好奇(知道更多)。在sysctl中它是:

vm.pmap.shpgperproc

提前致谢

2 个答案:

答案 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