serverperfmode = 1在macOS上实际做什么?


24

此处介绍如何将其打开,但没有详细信息。

有一个模糊的描述:

性能模式更改Mac的系统参数。这些更改可以更好地利用硬件来满足要求苛刻的服务器应用程序。

系统/内核内部实际上发生了什么变化?

Answers:


16

开启服务器性能模式实质上会增加一些与可能/允许的进程和连接的最大数量有关的内核/网络参数,并修改一些内存/计时器设置:

...
kern.maxvnodes: 66560 > 300000
kern.maxproc: 1064 > 5000
...
kern.maxfilesperproc: 10240 > 150000
kern.maxprocperuid: 709 > 3750
kern.ipc.maxsockbuf: 4194304 > 8388608
...
kern.ipc.somaxconn: 128 > 1024
...
kern.ipc.nmbclusters: 32768 > 65536
...
kern.ipc.sbmb_cnt_peak: 1120 > 1170
...
kern.ipc.njcl: 10920 > 21840
...
kern.timer.longterm.qlen: 100 > 0
kern.timer.longterm.threshold: 1000 > 0
...
net.inet.ip.maxfragpackets: 1024 > 2048
...
net.inet.tcp.tcbhashsize: 4096 > 8192
...
net.inet.tcp.fastopen_backlog: 10 > 200
...
net.inet6.ip6.maxfragpackets: 1024 > 2048
...
net.inet6.ip6.maxfrags: 2048 > 4096
#and some very special vm page-outs/compressor and and memory/cache settings

目标是允许更多打开的文件(尤其是Web服务器所需)和连接同时服务于更多客户端,并更快地从内存/虚拟内存中丢弃单个服务器线程(如果我正确解释了某些修改)。


过去,Apple发布了不同的操作系统,现在服务器将服务器加载到消费者操作系统之上,一些基本的调整可以帮助操作系统为连接到服务器的25个用户运行进程,而不是为使用该操作系统的人进行调整。这些调整只是一个起点-任何想要服务器在高负载下执行的人都需要以比打开或关闭性能模式更为详细的级别自定义和监视事物。

同样,这些限制主要是为了防止不良软件通过耗尽进程间通信信令通道(ipc)之类的有限资源而导致服务器宕机。在一个正在运行一个用户的系统上,您要比一个数十个用户正在运行的多个进程更早地停止一个失控的进程。与“更快地提供一个文件或一个网页”相比,“性能”可以看作是提高了一些硬性限制。


由于报告的特定项目超过1100个,sysctl -a因此如果您不熟悉服务器调优或内核参数修改,那么可以很轻松地总结一下这些内容。我会在答案中添加一些“意见”,以防他人受到帮助。如果不是您的意见,请还原我的修改。
bmike

这对Macbook Pro也适用吗?
Tadej

1
@JedatKinports这也适用于MacBook,是的
klanomath

这些“#非常特别”设置是什么?进一步:我认为有些非sysctl设置也已更改。许可收紧;独立OS X Server的旧版本中的其他“事物”是否同样不同?
LаngLаngС

9

服务器性能模式(aka perfmodeserverperfmode)更改了许多内核参数,为内核保留了更多内存,以便提供更高的限制,从而使更多的进程可以运行,文件可以打开以及网络连接可以处理的等等。所有参数都会随安装的内存量在限制范围内扩展,除非您已安装至少16 GiB的内存,否则所有更改都不会改变。@klanomath的数字对应于已安装16 GiB的内存。

这是来自Apple的有关Server 10.6 的旧支持文档的简短描述:

  • 对于每8GB的已安装内存,可用2500个进程和150,000个vnode。
  • 最大线程数设置为最大进程数的五倍(5x)。(这似乎不再是对的)
  • 一个用户ID(uid)最多可以使用最大进程数的75%。
  • 一个进程最多可以分配最大线程值的20%。

在具有48 GiB内存的性能模式下,我看到:

kern.maxvnodes: 900000
kern.maxproc: 15000
kern.maxprocperuid: 11250
kern.num_tasks: 15000
kern.num_taskthreads: 15000
kern.num_threads: 75000
kern.maxfiles: 900000
kern.maxfilesperproc: 450000

kern.ipc.maxsockbuf:8388608
kern.ipc.somaxconn: 2048
kern.ipc.nmbclusters: 131072
kern.ipc.sbmb_cnt_peak: # This parameter is not in my kernel
kern.ipc.njcl: 43688
...
kern.timer.longterm.qlen: 0 # same
kern.timer.longterm.threshold: 0 # same
...
net.inet.ip.maxfragpackets: 4096
...
net.inet.tcp.tcbhashsize: 32768
net.inet.tcp.fastopen_backlog: 600
...
net.inet6.ip6.maxfragpackets: 4096
net.inet6.ip6.maxfrags: 8192

如果您真的想深入研究它,可以阅读实际的代码。以下是El Capitan 10.11.6的内容。服务器模式仍然相同(最新版本的代码来自OS X 10.14 Mojave),但是如果您至少有12 GiB的内存(包括更改),普通模式将从OS X 10.13 High Sierra开始出现性能提升。在代码中的注释中)。

scale_seutp功能可设置scale因素,就floor(memsize / 8 GiB)好像您已启用服务器性能模式并已安装至少16 GiB的内存一样。否则为零,除非您至少有3 GiB的内存(在这种情况下为2),或者从High Sierra开始,内存大小为4 GiB。(task_max代码段开头的值是在构建内核时设置的,尚不清楚苹果在分发OS X时如何设置它的值。可能是1024。)

    typeof(task_max) task_max_base = task_max;

    /* Raise limits for servers with >= 16G */
    if ((serverperfmode != 0) && ((uint64_t)sane_size >= (uint64_t)(16 * 1024 * 1024 *1024ULL))) {
        scale = (int)((uint64_t)sane_size / (uint64_t)(8 * 1024 * 1024 *1024ULL));
        /* limit to 128 G */
        if (scale > 16)
            scale = 16;
        task_max_base = 2500;
    } else if ((uint64_t)sane_size >= (uint64_t)(3 * 1024 * 1024 *1024ULL))
        scale = 2;
    /* Starting with OS X 10.13 High Sierra, if more than 8 GiB of memory,
     * scale = sane_size / 4 GiB with max of 16 (64 GiB or more)
     */

    task_max = MAX(task_max, task_max_base * scale);

    if (scale != 0) {
        task_threadmax = task_max;
        thread_max = task_max * 5; 
    }

然后,将该scale因子应用于bsd_scale_setup(仅适用于64位内核)或High Sierra。这将修改上面讨论过的内核参数,并且可以通过看到sysctl。请注意,如果未启用“服务器性能模式”,那么只有maxproc(532-> 1064)和maxprocperuid(266-> 709)才可缩放,直到High Sierra,如果maxfilesmaxfilesperproc至少有12 GiB的内存,它们也会被颠簸。

    /* The initial value of maxproc here is 532 */
    if ((scale > 0) && (serverperfmode == 0)) {
        maxproc *= scale;
        maxprocperuid = (maxproc * 2) / 3;
        /* Starting with OS X 10.13 High Sierra, this clause is added
        if (scale > 2) {
            maxfiles *= scale;
            maxfilesperproc = maxfiles/2;
        }
        *** end of High Sierra addition */
    }
    /* Apply server scaling rules */
    if ((scale >  0) && (serverperfmode !=0)) {
        maxproc = 2500 * scale;
        hard_maxproc = maxproc;
        /* no fp usage */
        maxprocperuid = (maxproc*3)/4;
        maxfiles = (150000 * scale);
        maxfilesperproc = maxfiles/2;
        desiredvnodes = maxfiles;
        vnodes_sized = 1;
        tcp_tfo_backlog = 100 * scale;
        if (scale > 4) {
            /* clip somaxconn at 32G level */
            somaxconn = 2048;
            /*
             * For scale > 4 (> 32G), clip
             * tcp_tcbhashsize to 32K
             */
            tcp_tcbhashsize = 32 *1024;

            if (scale > 7) {
                /* clip at 64G level */
                max_cached_sock_count = 165000;
            } else {
                max_cached_sock_count = 60000 + ((scale-1) * 15000);
            }
        } else {
            somaxconn = 512*scale;
            tcp_tcbhashsize = 4*1024*scale;
            max_cached_sock_count = 60000 + ((scale-1) * 15000);
        }
    }

最后,比例因子也应用于中bsd_exec_setup。这将配置保留多少内核内存来组装初始化进程所需的所有数据。进程exec的方式值得在Unix内核的书中写整整整整一章,因此在这里我不再赘述。此设置的高级结果是,更大的数量占用更多的内存,但是每秒可以创建更多的进程。(尽管此代码在当前/莫哈韦沙漠中保持不变,但效果随着scaleHigh Sierra中计算方式的变化而改变。请回想上面的细节:在High Sierra及更高版本中,memory / 4 GiB正常模式的缩放比例大致为(),(memory / 8 GiB)服务器模式。因此bsd_simul_execs,当您切换到服务器模式时,它实际上可能会掉线。)

    switch (scale) {
        case 0:
        case 1:
            bsd_simul_execs = BSD_SIMUL_EXECS;
            break;
        case 2:
        case 3:
            bsd_simul_execs = 65;
            break;
        case 4:
        case 5:
            bsd_simul_execs = 129;
            break;
        case 6:
        case 7:
            bsd_simul_execs = 257;
            break;
        default:
            bsd_simul_execs = 513;
            break;

    }
    bsd_pageable_map_size = (bsd_simul_execs * BSD_PAGEABLE_SIZE_PER_EXEC);

对于El capitan到现在/ Mojave,BSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024对于我的48 GiB Mac,内核将保留大约67 MiB的内存,作为设置要产生的新进程的缓冲区空间。一方面,即使对于Web服务器,这也是一个疯狂的高数字。另一方面,与机器上的48 GiB相比,67 MiB是花生。

因此,“服务器性能模式”确实占用了更多的内存,并且如果某些程序失去了控制消耗资源的能力,将使系统遭受损失的可能性更大,但会大大提高系统处理更多后台任务的能力。我认为Apple做出了正确的选择,即默认情况下不开启它,但也使其易于启用。我很高兴使用High Sierra,如果您有足够的内存,他们现在可以在正常模式下提高限制。我会在所有计算机上都关闭服务器模式(并保持关闭状态),直到发现它们出现问题为止,因为我正在运行许多服务器程序。毕竟,它不会加快系统时钟的速度,不会提高磁盘速度,并且只有在有数百个连接的情况下才增加网络I / O。那里'

另一方面,如果您确实需要运行2000个进程,则在进入High Sierra之前,服务器模式是您唯一的选择。好消息是,它很容易打开,然后尝试一下;如果您不喜欢它,请关闭它。


👏🏻!在结论附近要注意的好建议:“我将关闭服务器模式[…]”。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.