La Modalità prestazioni server (aka perfmode
o 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_seutp
funzione imposta il scale
fattore 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_max
all'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 scale
fattore 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 maxfiles
e maxfilesperproc
vengono 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 è exec
degno 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 * 1024
quindi 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.
sysctl -a
questo è 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.