Answers:
开启服务器性能模式实质上会增加一些与可能/允许的进程和连接的最大数量有关的内核/网络参数,并修改一些内存/计时器设置:
...
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)之类的有限资源而导致服务器宕机。在一个正在运行一个用户的系统上,您要比一个数十个用户正在运行的多个进程更早地停止一个失控的进程。与“更快地提供一个文件或一个网页”相比,“性能”可以看作是提高了一些硬性限制。
服务器性能模式(aka perfmode
或serverperfmode
)更改了许多内核参数,为内核保留了更多内存,以便提供更高的限制,从而使更多的进程可以运行,文件可以打开以及网络连接可以处理的等等。所有参数都会随安装的内存量在限制范围内扩展,除非您已安装至少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,如果maxfiles
和maxfilesperproc
至少有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内核的书中写整整整整一章,因此在这里我不再赘述。此设置的高级结果是,更大的数量占用更多的内存,但是每秒可以创建更多的进程。(尽管此代码在当前/莫哈韦沙漠中保持不变,但效果随着scale
High 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之前,服务器模式是您唯一的选择。好消息是,它很容易打开,然后尝试一下;如果您不喜欢它,请关闭它。
sysctl -a
因此如果您不熟悉服务器调优或内核参数修改,那么可以很轻松地总结一下这些内容。我会在答案中添加一些“意见”,以防他人受到帮助。如果不是您的意见,请还原我的修改。