O Modo de Desempenho do Servidor (aka perfmode
ou serverperfmode
) altera vários parâmetros do kernel, reservando muito mais memória para o kernel, a fim de fornecer limites muito mais altos e, portanto, permitir a execução de muito mais processos, a abertura de arquivos e a conexão de redes. manipulado, entre outras coisas. Todos os parâmetros são dimensionados com a quantidade de memória instalada, dentro dos limites e nada muda, a menos que você tenha pelo menos 16 GiB de memória instalados . Os números do @ klanomath correspondem a 16 GiB de memória instalados.
Aqui está uma breve descrição de um antigo documento de suporte da Apple sobre o Server 10.6:
- Para cada 8 GB de memória instalada, 2500 processos e 150.000 vnodes estão disponíveis.
- O número máximo de threads é definido como cinco vezes (5x) o número máximo de processos. (Isso parece não ser mais verdade)
- Um único ID do usuário (uid) pode usar até 75% do número máximo de processos.
- Um único processo pode alocar até 20% do valor máximo de threads.
No modo de desempenho com 48 GiB de memória, vejo:
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
Se você realmente quiser descobrir, pode ler o código real. Abaixo está o El Capitan 10.11.6. O modo de servidor ainda é o mesmo (até o código publicado mais recentemente, que é do OS X 10.14 Mojave), mas o modo normal teve um aumento de desempenho começando no OS X 10.13 High Sierra se você tiver pelo menos 12 GiB de memória (alterações incluídas nos comentários no código).
A scale_seutp
função configura o scale
fator como floor(memsize / 8 GiB)
se você tivesse o Modo de Desempenho do Servidor ativado e pelo menos 16 GiB de memória instalados. Caso contrário, será zero, a menos que você tenha pelo menos 3 GiB de memória; nesse caso, será 2 ou, começando com High Sierra , memsize / 4 GiB. (O valor de task_max
no início do trecho de código é definido quando o kernel é construído e não está claro como ele é definido pela Apple ao distribuir o OS X. Provavelmente é 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;
}
Em seguida, esse scale
fator é aplicado bsd_scale_setup
(apenas para um kernel de 64 bits) ou aqui para High Sierra . Isso modifica os parâmetros do kernel que são discutidos acima e são visíveis via sysctl
. Observe que, se o Modo de desempenho do servidor não estiver ativado, a única coisa escalada será maxproc
(532 -> 1064) e maxprocperuid
(266 -> 709) até High Sierra, quando maxfiles
e maxfilesperproc
também ocorrerá uma colisão se você tiver pelo menos 12 GiB de memória.
/* 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);
}
}
Finalmente, o fator de escala também é aplicado em bsd_exec_setup
. Isso configura quanta memória do kernel é reservada para reunir todos os dados necessários para inicializar um processo. Como um processo é exec
digno de um capítulo completo de um livro sobre o kernel do Unix, então não vou entrar aqui. A consequência de alto nível dessa configuração é que um número maior consome mais memória, mas permite que um número maior de processos seja criado por segundo. (Embora esse código tenha permanecido o mesmo durante o presente / Mojave, o efeito mudou com a alteração de como scale
é calculada em High Sierra. Lembre-se dos detalhes acima: em High Sierra e mais tarde, a escala é aproximadamente ( memory / 4 GiB
) para o modo normal e ( memory / 8 GiB
) para o modo servidor. Portanto, bsd_simul_execs
pode ser desativado quando você alterna para o modo servidor.)
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);
Para o El Capitan até o presente / Mojave, BSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024
portanto, para o meu Mac de 48 GiB, o kernel reservará cerca de 67 MiB de memória, como espaço de buffer para a criação de novos processos. Por um lado, esse é um número alto, mesmo para um servidor web. Por outro lado, 67 MiB são amendoins em comparação com os 48 GiB na máquina.
Portanto, o Modo de desempenho do servidor ocupa mais memória e aumenta a probabilidade de o sistema sofrer algum problema, se algum programa sair do controle, consumindo recursos, mas aumenta bastante a capacidade do sistema para lidar com muito mais tarefas em segundo plano. Acho que a Apple fez a ligação certa, não ativando-a por padrão, mas também facilitando a ativação. Fico feliz que, com High Sierra, eles agora estejam aumentando os limites no modo normal, se você tiver memória suficiente. Eu deixaria o modo de servidor desativado (e o deixei desativado) em todos os meus computadores até notá-los com problemas, porque tenho muitos programas de servidor em execução nele. Afinal, ele não acelera o relógio do sistema, não aumenta a velocidade do disco e apenas aumenta a E / S da rede se você tiver centenas de conexões. Lá'
Por outro lado, se você realmente precisa executar 2000 processos, o modo de servidor é sua única opção até chegar ao High Sierra. A boa notícia é que é fácil o suficiente ligar, experimentar e, se você não gostar, desligar novamente.
sysctl -a
este, é um resumo muito interessante das coisas que você deve assistir primeiro se for novo no ajuste do servidor ou nas modificações dos parâmetros do kernel. Vou adicionar alguma "opinião" à resposta, caso isso ajude outras pessoas. Reveja minhas edições se as opiniões expressas não forem suas.