【问题标题】:freebsd shpgperproc what is responsible for?freebsd shpgperproc 负责什么?
【发布时间】:2012-05-14 15:24:21
【问题描述】:

我在谷歌上搜索了很多关于“每个 proc 的页面共享因子”负责的内容,但一无所获。这对我来说很有趣,我目前没有任何问题,只是好奇(想知道更多)。在 sysctl 中是:

vm.pmap.shpgperproc

提前致谢

【问题讨论】:

  • 我发现这个参数会影响 pv 条目的数量(可能,我不是 100% 确定)......但是如何? freebsd 内核源 grep 什么也没找到。或者我没有那么努力地搜索。

标签: performance freebsd sysctl


【解决方案1】:

首先要注意的是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 结构因此,给定一个页面 (struct vm_page) 需要被弄脏或分页或需要更新硬件页表的东西,通过查看pv_entrys 的对应列表可以很容易地找到对应的映射虚拟页面列表(例如,看看i386/i386/pmap.c:pmap_remove_all())。

pv_entrys 的使用使某些 VM 操作更加高效,但当前的实现(至少对于 i386)似乎分配了静态的空间量(参见pv_maxchunks,它是基于pv_entry_max 设置的)用于pv_chunks,用于管理pv_entrys。如果内核在释放非活动的之后无法分配pv_entry,它就会崩溃。

因此我们想根据我们想要空间的pv_entrys 来设置pv_entry_max;显然,我们至少需要与 RAM 页面一样多的内存(这是cnt.v_page_count 的来源)。然后我们要考虑到许多页面将被不同的进程多重虚拟映射,因为需要为每个这样的映射分配一个pv_entry。因此shpgperproc - 所有拱门的默认值为 200 - 只是一种扩展方式。在一个进程之间共享许多页面的系统上(比如在运行 apache 的负载很重的 Web 服务器上),显然pv_entrys 可能会用完,因此需要增加它。

【讨论】:

  • 还有一个问题:碎片化的内存使用会增加pv_entrys的消耗吗?
  • 嗯,pv_entry 分配给每个映射的页面,所以如果内存碎片的粒度小于页面大小,那么大概是的。
【解决方案2】:

我现在附近没有 FreeBSD 机器,但似乎这个参数是在 pmap.c 中定义和使用的,http://fxr.watson.org/fxr/ident?v=FREEBSD7&im=bigexcerpts&i=shpgperproc

【讨论】:

  • 所以,我发现“pv_entry_max = shpgperproc * maxproc + cnt.v_page_count;”,但是 freebsd 的 sysctl 有 vm.pmap.pv_entry_max 参数。有什么区别?
  • 也许 shpgperproc 对我可以稍后调整的初始 pv_entry_max 值有影响?
猜你喜欢
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多