O que o serverperfmode = 1 realmente faz no macOS?


24

A ativação é descrita aqui, mas não há detalhes.

Há uma descrição vaga:

O modo Performance altera os parâmetros do sistema do seu Mac. Essas alterações aproveitam melhor o seu hardware para aplicativos de servidor exigentes.

O que realmente está mudando dentro do sistema / kernel?

Respostas:


16

A ativação do Modo de Desempenho do Servidor essencialmente aumenta alguns parâmetros do kernel / net relacionados ao número máximo de processos e conexões possíveis / permitidos e modifica algumas configurações de memória / timer:

...
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

O objetivo é permitir que mais arquivos abertos (especialmente necessários para servidores da Web) e conexões atendam a mais clientes ao mesmo tempo e descartar threads de servidor único mais rapidamente da memória / memória virtual (se eu interpretar certas modificações corretamente).


No passado, a Apple lançou um sistema operacional diferente e, agora que o servidor carrega sobre o sistema operacional do consumidor, algumas configurações básicas podem ajudar o sistema operacional a executar processos para 25 usuários que se conectam a um servidor em vez de serem ajustados para uma pessoa usando o sistema operacional. Essas afinações são apenas um ponto de partida - qualquer pessoa que queira que seu servidor funcione com alta carga precisa personalizar e monitorar as coisas em um nível muito mais detalhado do que ter o modo de desempenho ativado ou desativado.

Além disso, esses limites destinam-se principalmente a impedir que softwares defeituosos derrubem um servidor esgotando recursos limitados, como canais de sinalização de comunicação entre processos (ipc). Em um sistema em que um usuário está executando, você deseja interromper um processo descontrolado mais cedo do que se houver dezenas de processos em execução para dezenas de usuários. O "desempenho" pode ser visto como um aumento de alguns limites rígidos, em vez de "servir um arquivo ou uma página da Web mais rapidamente".


Como existem mais de 1100 itens específicos relatados por sysctl -aeste, é 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.
bmike

Isso funciona em um macbook pro também?
Tadej 20/06

11
@JedatKinports Isso também funciona para MacBooks, sim
klanomath 20/17

E quais são essas configurações "#muito especiais"? Além disso: acho que há algumas configurações não sysctl alteradas também. Permissões reforçadas; outras 'coisas' igualmente diferentes nas versões mais antigas do OS X Server autônomo?
LаngLаngС

9

O Modo de Desempenho do Servidor (aka perfmodeou 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_seutpfunção configura o scalefator 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_maxno 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 scalefator é 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 maxfilese maxfilesperproctambé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 é execdigno 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_execspode 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 * 1024portanto, 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.


!🏻! Um bom conselho a ser observado perto da conclusão: "Eu deixaria o modo de servidor desativado [...]".
dan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.