Tryb wydajności serwera (aka perfmode
lub serverperfmode
) zmienia wiele parametrów jądra, rezerwując znacznie więcej pamięci dla jądra, aby zapewnić znacznie wyższe limity, a tym samym umożliwić uruchomienie większej liczby procesów, otwarcie plików i nawiązanie połączeń sieciowych obsługiwane między innymi. Wszystkie parametry są skalowane wraz z ilością zainstalowanej pamięci, w ramach limitów i nic się nie zmienia, chyba że zainstalowano co najmniej 16 GiB pamięci . Liczby @ klanomath odpowiadają zainstalowaniu 16 GiB pamięci.
Oto krótki opis ze starego dokumentu pomocy technicznej firmy Apple na temat serwera 10.6:
- Na każde 8 GB zainstalowanej pamięci dostępnych jest 2500 procesów i 150 000 vnodes.
- Maksymalna liczba wątków jest ustawiona na pięciokrotność (5x) liczby maksymalnych procesów. (To nie wydaje się już prawdą)
- Pojedynczy identyfikator użytkownika (UID) może wykorzystywać do 75% maksymalnej liczby procesów.
- Pojedynczy proces może przydzielić do 20% maksymalnej wartości wątków.
W trybie wydajności z 48 GiB pamięci widzę:
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
Jeśli naprawdę chcesz się w to zagłębić, możesz odczytać aktualny kod. Poniżej znajduje się El Capitan 10.11.6. Tryb serwera jest nadal taki sam (do najnowszego opublikowanego kodu, który pochodzi z OS X 10.14 Mojave), ale tryb normalny dostał spadku wydajności, zaczynając od OS X 10.13 High Sierra, jeśli masz co najmniej 12 GiB pamięci (uwzględniono zmiany w komentarzach w kodzie).
Te scale_seutp
zestawy funkcyjne górę scale
czynnik jako floor(memsize / 8 GiB)
jeśli masz włączony tryb wydajności serwera, a co najmniej 16 GiB pamięci zainstalowane. W przeciwnym razie wynosi zero, chyba że masz co najmniej 3 GiB pamięci, w którym to przypadku jest to 2 lub, począwszy od High Sierra , memsize / 4 GiB. (Wartość task_max
na początku fragmentu kodu jest ustawiana podczas budowania jądra i nie jest jasne, w jaki sposób jest ustawiany przez Apple podczas dystrybucji OS X. Prawdopodobnie 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;
}
Następnie ten scale
czynnik jest stosowany bsd_scale_setup
(tylko w przypadku jądra 64-bitowego) lub tutaj w przypadku High Sierra . To modyfikuje parametry jądra, które zostały omówione powyżej i są widoczne przez sysctl
. Zauważ, że jeśli Tryb wydajność serwera nie jest włączona, tylko rzeczą, która jest skalowana jest maxproc
(532 -> 1064) i maxprocperuid
(266 -> 709) aż do High Sierra, kiedy maxfiles
i maxfilesperproc
również są zderzył jeśli masz co najmniej 12 Gib pamięci.
/* 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);
}
}
Wreszcie zastosowano również współczynnik skali bsd_exec_setup
. Konfiguruje to, ile pamięci jądra jest zarezerwowane na zebranie wszystkich danych potrzebnych do zainicjowania procesu. Jak proces jest exec
warty jest pełnego rozdziału w książce na temat jądra Uniksa, więc nie będę się tutaj zajmował. Konsekwencją tego ustawienia wysokiego poziomu jest to, że większa liczba zajmuje więcej pamięci, ale umożliwia utworzenie większej liczby procesów na sekundę. (Mimo że ten kod pozostał taki sam przez obecny / Mojave, efekt zmienił się wraz ze zmianą sposobu scale
obliczania w High Sierra. Przypomnijmy powyższe szczegóły: w High Sierra i później, skala jest z grubsza ( memory / 4 GiB
) dla trybu normalnego i ( memory / 8 GiB
) dla trybu serwera. Więc bsd_simul_execs
może faktycznie spaść po przejściu do trybu serwera).
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);
Dla El Capitan poprzez obecną / Mojave, BSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024
więc dla mojego 48 GiB Mac jądro zarezerwuje około 67 MiB pamięci, podobnie jak przestrzeń buforowa do konfigurowania nowych procesów do odrodzenia. Z jednej strony jest to szalona wysoka liczba, nawet jak na serwer WWW. Z drugiej strony 67 MiB to orzeszki ziemne w porównaniu z 48 GiB na maszynie.
Tak więc tryb wydajności serwera zajmuje więcej pamięci i zwiększa prawdopodobieństwo, że system ucierpi, jeśli jakiś program wymknie się spod kontroli i zużywa zasoby, ale znacznie zwiększa zdolność systemu do obsługi znacznie większej liczby zadań w tle. Myślę, że Apple wykonał prawidłowe połączenie, nie włączając go domyślnie, ale także ułatwiając włączenie. Cieszę się, że dzięki High Sierra podnoszą teraz granice w trybie normalnym, jeśli masz wystarczająco dużo pamięci. Opuściłbym tryb serwera wyłączony (i zostawiłem go wyłączony) na wszystkich moich komputerach, dopóki nie zauważę, że mają problemy, ponieważ działa na nim tak wiele programów serwerowych. W końcu nie przyspiesza zegara systemowego, nie zwiększa prędkości dysku, a jedynie zwiększa sieciowe wejścia / wyjścia, jeśli masz setki połączeń. Tam'
Z drugiej strony, jeśli naprawdę potrzebujesz uruchomić 2000 procesów, tryb serwera jest twoją jedyną opcją, dopóki nie dojdziesz do High Sierra. Dobrą wiadomością jest to, że łatwo jest włączyć, wypróbować, a jeśli ci się nie podoba, wyłącz.
sysctl -a
jest to bardzo miłe podsumowanie rzeczy, które możesz obejrzeć jako pierwsze, jeśli dopiero zaczynasz dostrajanie serwera lub modyfikację parametrów jądra. Do odpowiedzi dodam „opinię” na wypadek, gdyby pomogło to innym. Cofnij moje zmiany, jeśli wyrażone opinie nie są twoje.