Cosa fa effettivamente serverperfmode = 1 su macOS?


24

L'accensione è descritta qui ma non ci sono dettagli.

C'è una vaga descrizione:

La modalità Performance modifica i parametri di sistema del tuo Mac. Queste modifiche sfruttano meglio l'hardware per applicazioni server impegnative.

Cosa sta realmente cambiando all'interno del sistema / kernel?

Risposte:


16

L'attivazione della Modalità prestazioni server aumenta essenzialmente alcuni parametri kernel / net relativi al numero massimo di processi e connessioni possibili / consentiti e modifica alcune impostazioni di memoria / 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

L'obiettivo è consentire a più file aperti (specialmente necessari per i server Web) e connessioni di servire più client contemporaneamente e scartare i thread di un singolo server più velocemente dalla memoria / memoria virtuale (se interpreto correttamente alcune modifiche).


In passato, Apple ha rilasciato un sistema operativo diverso e ora che il server carica sopra il sistema operativo consumer un tuning di base può aiutare il sistema operativo a eseguire processi per 25 utenti che si connettono a un server invece di essere sintonizzati per una persona che utilizza il sistema operativo. Queste regolazioni sono solo un punto di partenza: chiunque desideri che il proprio server funzioni a carico elevato deve personalizzare e monitorare le cose a un livello molto più dettagliato rispetto all'attivazione o alla disattivazione della modalità prestazioni.

Inoltre, questi limiti servono principalmente a impedire che un software dannoso blocchi un server esaurendo risorse limitate come i canali di segnalazione delle comunicazioni tra processi (IPC). Su un sistema in cui è in esecuzione un utente, si desidera interrompere un processo in fuga prima che se ci sono dozzine di processi in esecuzione per dozzine di utenti. La "performance" può essere vista come innalzare alcuni limiti piuttosto che "servire un file o una pagina web più velocemente".


Dal momento che ci sono oltre 1100 elementi specifici segnalati da sysctl -aquesto è un bel riassunto delle cose che potresti guardare prima se sei nuovo nell'ottimizzazione del server o nella modifica dei parametri del kernel. Aggiungerò un po 'di "opinione" alla risposta nel caso in cui ciò aiuti gli altri. Per favore, ripristina le mie modifiche se le opinioni espresse non sono tue.
bmike

Funziona anche su un MacBook Pro?
Tadej,

1
@JedatKinports Funziona anche con i MacBook, sì
klanomath il

E quali sono queste impostazioni "#molto speciali"? Inoltre: penso che siano state modificate anche alcune impostazioni non di sistema. Autorizzazioni rafforzate; altre "cose" ugualmente diverse nelle versioni precedenti di OS X Server standalone?
LängLаngС,

9

La Modalità prestazioni server (aka perfmodeo serverperfmode) modifica un numero di parametri del kernel, riservando molta più memoria per il kernel al fine di fornire limiti molto più alti e quindi consentire l'esecuzione di molti più processi, l'apertura dei file e le connessioni di rete gestito, tra le altre cose. Tutti i parametri vengono ridimensionati con la quantità di memoria installata, entro limiti e nulla cambia a meno che non siano installati almeno 16 GiB di memoria . I numeri di @ klanomath corrispondono all'installazione di 16 GiB di memoria.

Ecco una breve descrizione da un vecchio documento di supporto di Apple sul Server 10.6:

  • Per ogni 8 GB di memoria installata sono disponibili 2500 processi e 150.000 vnodi.
  • Il numero massimo di thread è impostato su cinque volte (5x) il numero di processi massimi. (Questo non sembra più essere vero)
  • Un singolo ID utente (uid) può utilizzare fino al 75% del numero massimo di processi.
  • Un singolo processo può allocare fino al 20% del valore massimo di thread.

In modalità Performance con 48 GiB di memoria, vedo:

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 vuoi davvero approfondire, puoi leggere il codice reale. Di seguito è da El Capitan 10.11.6. La modalità server è sempre la stessa (fino al codice pubblicato più di recente, che proviene da OS X 10.14 Mojave), ma la modalità normale ha un aumento delle prestazioni a partire da OS X 10.13 High Sierra se si dispone di almeno 12 GiB di memoria (modifiche incluse nei commenti nel codice).

La scale_seutpfunzione imposta il scalefattore come floor(memsize / 8 GiB)se la Modalità prestazioni server fosse abilitata e fossero installati almeno 16 GiB di memoria. Altrimenti è zero a meno che tu non abbia almeno 3 GiB di memoria, nel qual caso è 2 o, a partire da High Sierra , memsize / 4 GiB. (Il valore di task_maxall'inizio dello snippet di codice viene impostato quando viene creato il kernel, e non è chiaro come viene impostato da Apple quando distribuisce OS X. Probabilmente è 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; 
    }

Quindi quel scalefattore viene applicato bsd_scale_setup(solo per un kernel a 64 bit) o qui per High Sierra . Questo modifica i parametri del kernel che sono discussi sopra e sono visibili tramite sysctl. Notare che se la Modalità prestazioni server non è abilitata, l' unica cosa che viene ridimensionata è maxproc(532 -> 1064) e maxprocperuid(266 -> 709) fino a High Sierra, quando maxfilese maxfilesperprocvengono anche bloccati se si dispone di almeno 12 GiB di memoria.

    /* 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);
        }
    }

Infine, viene applicato anche il fattore di scala bsd_exec_setup. Ciò configura la quantità di memoria del kernel riservata per l'assemblaggio di tutti i dati necessari per inizializzare un processo. Il modo in cui un processo è execdegno di un capitolo completo in un libro sul kernel Unix, quindi non approfondirò qui. La conseguenza di alto livello di questa impostazione è che un numero maggiore occupa più memoria, ma consente di creare un numero maggiore di processi al secondo. (Sebbene questo codice sia rimasto lo stesso nel presente / Mojave, l'effetto è cambiato con il cambiamento nel modo in cui scaleè calcolato in High Sierra. Ricorda i dettagli sopra: in High Sierra e successivi, la scala è approssimativamente ( memory / 4 GiB) per la modalità normale e ( memory / 8 GiB) per la modalità server. Quindi bsd_simul_execs, quando si passa alla modalità server, si può effettivamente scendere.)

    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);

Per El Capitan attraverso il presente / Mojave, BSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024quindi per il mio Mac da 48 GiB il kernel riserverà circa 67 MiB di memoria proprio come lo spazio buffer per l'impostazione di nuovi processi da generare. Da un lato, questo è un numero alto pazzo, anche per un server web. D'altra parte, 67 MiB sono noccioline rispetto ai 48 GiB della macchina.

Pertanto, la Modalità prestazioni server occupa più memoria e aumenta la probabilità che il sistema risenta se qualche programma va fuori controllo consumando risorse, ma aumenta notevolmente la capacità del sistema di gestire molte più attività in background. Penso che Apple abbia fatto la chiamata giusta non accendendola per impostazione predefinita ma anche rendendola facile da abilitare. Sono contento che con High Sierra stiano aumentando i limiti in modalità normale se hai abbastanza memoria. Lascerei la modalità server disattivata (e l'ho lasciata disattivata) su tutti i miei computer fino a quando non li vedo incorrere in problemi perché ho così tanti programmi server in esecuzione su di esso. Dopotutto, non accelera l'orologio di sistema, non aumenta la velocità del disco e aumenta l'I / O di rete solo se si hanno centinaia di connessioni. Là'

D'altra parte, se hai davvero bisogno di eseguire 2000 processi, la modalità server è la tua unica opzione fino a quando non arrivi a High Sierra. La buona notizia è che è abbastanza facile accenderlo, provarlo e, se non ti piace, spegnerlo nuovamente.


👏🏻! Un bel consiglio da notare vicino alla conclusione: "Vorrei lasciare la modalità server disattivata [...]".
dan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.