Co faktycznie robi serverperfmode = 1 w systemie macOS?

24

Włączanie jest opisane tutaj, ale nie ma żadnych szczegółów.

Istnieje niejasny opis:

Tryb wydajności zmienia parametry systemowe komputera Mac. Zmiany te lepiej wykorzystują sprzęt w wymagających aplikacjach serwerowych.

Co tak naprawdę zmienia się w systemie / jądrze?

Keir Thomas
źródło

Odpowiedzi:

16

Włączenie trybu wydajności serwera zasadniczo zwiększa niektóre parametry jądra / sieci związane z maksymalną liczbą możliwych / dozwolonych procesów i połączeń oraz modyfikuje niektóre ustawienia pamięci / timera:

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

Celem jest umożliwienie większej liczbie otwartych plików (szczególnie potrzebnych dla serwerów WWW) i połączeń w celu obsługi większej liczby klientów w tym samym czasie oraz szybsze usuwanie wątków z pojedynczego serwera z pamięci / pamięci wirtualnej (jeśli poprawnie interpretuję niektóre modyfikacje).


W przeszłości Apple wydało inny system operacyjny, a teraz, gdy serwer ładuje się na system operacyjny klienta, niektóre podstawowe strojenie może pomóc systemowi operacyjnemu uruchomić procesy dla 25 użytkowników, którzy łączą się z serwerem, zamiast być dostrojonym dla jednej osoby używającej systemu operacyjnego. Strojenie to tylko punkt wyjścia - każdy, kto chce, aby jego serwer działał pod dużym obciążeniem, musi dostosowywać i monitorować rzeczy na znacznie bardziej szczegółowym poziomie niż włączenie lub wyłączenie trybu wydajności.

Ograniczenia te służą głównie zapobieganiu awarii oprogramowania przez serwer poprzez wyczerpanie ograniczonych zasobów, takich jak kanały sygnalizacyjne komunikacji międzyprocesowej (ipc). W systemie, w którym działa jeden użytkownik, chcesz zatrzymać niekontrolowany proces wcześniej niż wtedy, gdy dziesiątki użytkowników uruchomią dziesiątki procesów. „Wydajność” może być postrzegana jako podwyższanie pewnych twardych limitów, a nie „szybsze wyświetlanie jednego pliku lub jednej strony internetowej”.

klanomath
źródło
Ponieważ zgłoszonych jest ponad 1100 konkretnych pozycji, sysctl -ajest 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.
bmike
Czy to działa również na MacBooku Pro?
Tadej
1
@JedatKinports Działa to również na MacBooki, tak
klanomath
A jakie są te „# bardzo specjalne” ustawienia? Ponadto: Myślę, że zmieniono także niektóre ustawienia inne niż sysctl. Uprawnienia zaostrzone; inne „rzeczy” równie różne w starszych wersjach autonomicznego OS X Server?
LаngLаngС
9

Tryb wydajności serwera (aka perfmodelub 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_seutpzestawy funkcyjne górę scaleczynnik 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_maxna 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 scaleczynnik 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 maxfilesi maxfilesperprocró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 execwarty 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 scaleobliczania 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_execsmoż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 * 1024wię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.

Old Pro
źródło
👏🏻! Przyjemna rada do odnotowania przy zakończeniu: „Opuściłbym tryb serwera wyłączony […]”.
dan