Was macht eigentlich serverperfmode = 1 unter macOS?

24

Das Einschalten wird hier beschrieben , es gibt jedoch keine Details.

Es gibt eine vage Beschreibung:

Der Leistungsmodus ändert die Systemparameter Ihres Mac. Diese Änderungen nutzen Ihre Hardware besser für anspruchsvolle Serveranwendungen.

Was ändert sich eigentlich im System / Kernel?

Keir Thomas
quelle

Antworten:

16

Durch das Aktivieren des Server-Leistungsmodus werden einige Kernel- / Netzparameter in Bezug auf die maximale Anzahl möglicher / zulässiger Prozesse und Verbindungen wesentlich erhöht und einige Speicher- / Timereinstellungen geändert:

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

Das Ziel ist, dass mehr offene Dateien (insbesondere für Webserver erforderlich) und Verbindungen mehr Clients gleichzeitig bedienen und einzelne Serverthreads schneller aus dem Arbeitsspeicher / virtuellen Speicher entfernt werden (wenn ich bestimmte Änderungen richtig interpretiere).


In der Vergangenheit hat Apple ein anderes Betriebssystem herausgebracht, und jetzt, da der Server über das Consumer-Betriebssystem geladen wird, kann eine grundlegende Optimierung dazu beitragen, dass das Betriebssystem Prozesse für 25 Benutzer ausführt, die eine Verbindung zu einem Server herstellen, anstatt für eine Person, die das Betriebssystem verwendet, optimiert zu werden. Diese Optimierungen sind nur ein Ausgangspunkt - jeder, der möchte, dass sein Server unter hoher Last arbeitet, muss die Dinge auf einer weitaus detaillierteren Ebene anpassen und überwachen, als wenn der Leistungsmodus ein- oder ausgeschaltet ist.

Außerdem dienen diese Beschränkungen hauptsächlich dazu, zu verhindern, dass fehlerhafte Software einen Server zum Absturz bringt, indem begrenzte Ressourcen wie IPC (Inter Process Communications Signaling Channels) erschöpft werden. Auf einem System, auf dem ein Benutzer ausgeführt wird, möchten Sie einen außer Kontrolle geratenen Prozess früher anhalten, als wenn Dutzende von Prozessen für Dutzende von Benutzern ausgeführt werden. Die "Leistung" kann als Anhebung einiger harter Grenzen angesehen werden, im Gegensatz zu "eine Datei oder eine Webseite schneller bedienen".

klanomath
quelle
Da es über 1100 spezifische Elemente gibt, ist sysctl -adies eine sehr schöne Zusammenfassung der Dinge, die Sie möglicherweise zuerst sehen, wenn Sie mit der Serveroptimierung oder den Änderungen von Kernelparametern noch nicht vertraut sind. Ich werde der Antwort eine "Meinung" hinzufügen, falls dies anderen hilft. Bitte machen Sie meine Änderungen rückgängig, wenn die geäußerten Meinungen nicht Ihre sind.
bmike
Funktioniert das auch auf einem MacBook Pro?
Tadej
1
@JedatKinports Dies funktioniert auch für MacBooks, ja
klanomath
Und was sind diese "#sehr speziellen" Einstellungen? Weiter: Ich denke, es wurden auch einige Nicht-Sysctl-Einstellungen geändert. Berechtigungen verschärft; andere "Dinge", die in älteren Versionen von OS X Server gleichermaßen anders sind?
LongLang
9

Der Server-Leistungsmodus ( perfmodeoder serverperfmode) ändert eine Reihe von Kernelparametern und reserviert viel mehr Speicher für den Kernel, um viel höhere Grenzwerte bereitzustellen und damit viel mehr Prozesse auszuführen, Dateien zu öffnen und Netzwerkverbindungen herzustellen unter anderem behandelt. Alle Parameter werden mit der Größe des installierten Speichers skaliert, und es ändert sich nichts, es sei denn, Sie haben mindestens 16 GB Speicher installiert . @ klanomaths Zahlen entsprechen einer installierten Speicherkapazität von 16 GB.

Hier ist eine kurze Beschreibung eines alten Support-Dokuments von Apple zu Server 10.6:

  • Für jeweils 8 GB installierten Speicher stehen 2500 Prozesse und 150.000 Knoten zur Verfügung.
  • Die maximale Anzahl von Threads ist auf das Fünffache (5x) der maximalen Anzahl von Prozessen festgelegt. (Dies scheint nicht mehr wahr zu sein)
  • Eine einzelne Benutzer-ID (UID) kann bis zu 75% der maximalen Anzahl von Prozessen verwenden.
  • Ein einzelner Prozess kann bis zu 20% des maximalen Thread-Werts zuweisen.

Im Performance-Modus mit 48 GiB Speicher sehe ich:

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

Wenn Sie wirklich darin graben möchten, können Sie den tatsächlichen Code lesen. Unten ist von El Capitan 10.11.6. Der Servermodus ist immer noch derselbe (bis auf den zuletzt veröffentlichten Code, der aus OS X 10.14 Mojave stammt), aber der normale Modus hat ab OS X 10.13 High Sierra eine Leistungsbeeinträchtigung, wenn Sie mindestens 12 GB Arbeitsspeicher haben (Änderungen eingeschlossen) in Kommentaren im Code).

Die scale_seutpFunktion stellt den scaleFaktor so ein, als floor(memsize / 8 GiB)ob Sie den Server-Leistungsmodus aktiviert und mindestens 16 GB Arbeitsspeicher installiert hätten. Andernfalls ist es Null, es sei denn, Sie haben mindestens 3 GiB Speicher. In diesem Fall ist es 2, oder, beginnend mit High Sierra , memsize / 4 GiB. (Der Wert von task_maxam Anfang des Code-Snippets wird festgelegt, wenn der Kernel erstellt wird, und es ist unklar, wie er von Apple bei der Verteilung von OS X festgelegt wird. Es ist wahrscheinlich 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; 
    }

Dann wird dieser scaleFaktor in bsd_scale_setup(nur für einen 64-Bit-Kernel) oder hier für High Sierra angewendet . Dadurch werden die oben beschriebenen Kernel-Parameter geändert, die über angezeigt werden sysctl. Beachten Sie, dass , wenn Server Performance - Modus nicht die Option aktiviert ist , nur was skaliert ist maxproc(532 -> 1064) und maxprocperuid(266 -> 709) bis High Sierra, wenn maxfilesund maxfilesperprocauch gestoßen werden , wenn Sie mindestens 12 GiB Arbeitsspeicher verfügen.

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

Schließlich wird der Skalierungsfaktor auch in angewendet bsd_exec_setup. Hiermit wird konfiguriert, wie viel Kernelspeicher für die Zusammenstellung aller zum Initialisieren eines Prozesses erforderlichen Daten reserviert ist. Wie ein Prozess execabläuft, verdient ein ganzes Kapitel in einem Buch über den Unix-Kernel, daher werde ich hier nicht darauf eingehen. Die übergeordnete Konsequenz dieser Einstellung ist, dass eine größere Anzahl mehr Speicherplatz beansprucht, jedoch eine größere Anzahl von Prozessen pro Sekunde erstellt werden kann. (Obwohl dieser Code im Present / Mojave- Modus unverändert geblieben ist, hat sich der Effekt mit der Änderung der scaleBerechnungsweise in High Sierra geändert . Beachten Sie die obigen Details: In High Sierra und höher ist die Skalierung ungefähr ( memory / 4 GiB) für Normalmodus und ( memory / 8 GiB). für den Servermodus. bsd_simul_execsKann also tatsächlich ausfallen, wenn Sie in den Servermodus wechseln.)

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

Für El Capitan durch die Gegenwart / Mojave, BSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024also für meinen 48 GiB Mac reserviert der Kernel ungefähr 67 MiB Speicher als Pufferraum zum Einrichten neuer Prozesse, die erzeugt werden sollen. Einerseits ist das eine verrückte hohe Zahl, selbst für einen Webserver. Auf der anderen Seite sind 67 MiB Erdnüsse im Vergleich zu den 48 GiB auf der Maschine.

Der Server-Leistungsmodus beansprucht also mehr Arbeitsspeicher und führt zu einer höheren Wahrscheinlichkeit, dass das System leidet, wenn ein Programm die Kontrolle über die Ressourcen verliert, erhöht jedoch die Fähigkeit des Systems, wesentlich mehr Hintergrundaufgaben zu erledigen. Ich denke, Apple hat den richtigen Anruf getätigt, indem es ihn nicht standardmäßig aktiviert, sondern auch einfach aktiviert hat. Ich bin froh, dass sie mit High Sierra jetzt im normalen Modus die Grenzen erhöhen, wenn Sie genug Speicher haben. Ich habe den Servermodus auf allen meinen Computern deaktiviert (und deaktiviert), bis ich bemerkte, dass sie auf Probleme stoßen, weil so viele Serverprogramme darauf ausgeführt werden. Schließlich wird die Systemuhr nicht beschleunigt, die Festplattengeschwindigkeit wird nicht erhöht, und die Netzwerk-E / A werden nur erhöht, wenn Sie über Hunderte von Verbindungen verfügen. Dort'

Wenn Sie jedoch wirklich 2000 Prozesse ausführen müssen, ist der Servermodus Ihre einzige Option, bis Sie zu High Sierra gelangen. Die gute Nachricht ist, dass es einfach genug ist, das Gerät einzuschalten und auszuprobieren. Wenn es Ihnen nicht gefällt, schalten Sie es wieder aus.

Alter Pro
quelle
👏🏻! Ein netter Rat, den man in der Nähe der Schlussfolgerung beachten sollte: "Ich würde den Servermodus auslassen […]".
dan