Was macht serverperfmode=1 eigentlich unter macOS?

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

Es gibt eine vage Beschreibung:

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

Was ändert sich tatsächlich im System/Kernel?

Antworten (2)

Das Einschalten des Serverleistungsmodus erhöht im Wesentlichen einige Kernel-/Netzparameter in Bezug auf die maximale Anzahl möglicher/zulässiger Prozesse und Verbindungen und ändert einige Speicher-/Timer-Einstellungen:

...
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 besteht darin, mehr offene Dateien (insbesondere für Webserver erforderlich) und Verbindungen zuzulassen, um mehr Clients gleichzeitig zu bedienen, und einzelne Server-Threads schneller aus dem Speicher/virtuellen Speicher zu verwerfen (wenn ich bestimmte Änderungen richtig interpretiere).


In der Vergangenheit hat Apple ein anderes Betriebssystem veröffentlicht, und jetzt, da der Server zusätzlich zum Verbraucher-Betriebssystem geladen wird, kann eine grundlegende Optimierung dem Betriebssystem helfen, Prozesse für 25 Benutzer auszuführen, die eine Verbindung zu einem Server herstellen, anstatt für eine Person, die das Betriebssystem verwendet, optimiert zu werden. Diese Tunings sind nur ein Anfangspunkt - jeder, der möchte, dass sein Server unter hoher Last funktioniert, muss die Dinge auf einer viel detaillierteren Ebene anpassen und überwachen, als den Performance-Modus ein- oder auszuschalten.

Außerdem dienen diese Limits hauptsächlich dazu, zu verhindern, dass schlechte Software einen Server herunterfährt, indem sie begrenzte Ressourcen wie Interprozesskommunikations-Signalisierungskanäle (IPC) erschöpft. 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 Aufhebung einiger harter Grenzen angesehen werden, im Gegensatz zu "eine Datei oder eine Webseite schneller bereitstellen".

Da über 1100 spezifische Elemente gemeldet werden sysctl -a, ist dies eine sehr schöne Zusammenfassung der Dinge, die Sie vielleicht zuerst sehen sollten, wenn Sie neu in der Serveroptimierung oder Kernelparameteränderungen 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.
Funktioniert das auch auf einem Macbook Pro?
@JedatKinports Das funktioniert auch für MacBooks, ja
Und was sind diese „#ganz besonderen“ Einstellungen? Weiter: Ich denke, es wurden auch einige Nicht-Sysctl-Einstellungen geändert. Berechtigungen verschärft; andere 'Dinge', die in älteren Versionen des eigenständigen OS X Servers gleichermaßen unterschiedlich sind?

Der Server Performance Mode (auch bekannt als perfmodeoder serverperfmode) ändert eine Reihe von Kernel-Parametern und reserviert viel mehr Speicher für den Kernel, um viel höhere Limits bereitzustellen und somit viel mehr Prozesse laufen zu lassen, Dateien zu öffnen und Netzwerkverbindungen zu ermöglichen unter anderem gehandhabt. Alle Parameter skalieren mit der Menge des installierten Arbeitsspeichers innerhalb von Grenzen, und es ändert sich nichts, es sei denn, Sie haben mindestens 16 GiB Arbeitsspeicher installiert . Die Zahlen von @klanomath entsprechen der Installation von 16 GiB Speicher.

Hier ist eine kurze Beschreibung aus einem alten Support-Dokument von Apple zu Server 10.6:

  • Für jeweils 8 GB installierten Arbeitsspeicher stehen 2500 Prozesse und 150.000 vnodes zur Verfügung.
  • Die maximale Anzahl von Threads ist auf das Fünffache (5x) der Anzahl der maximalen Prozesse festgelegt. (Das 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 Leistungsmodus 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 sich wirklich damit beschäftigen möchten, können Sie den eigentlichen Code lesen. Unten ist von El Capitan 10.11.6. Der Servermodus ist immer noch derselbe (bis zum zuletzt veröffentlichten Code, der von OS X 10.14 Mojave stammt), aber der normale Modus hat ab OS X 10.13 High Sierra eine Leistungssteigerung erfahren, wenn Sie mindestens 12 GiB Arbeitsspeicher haben (Änderungen eingeschlossen in Kommentaren im Code).

Die scale_seutpFunktion richtet den scaleFaktor so ein, als floor(memsize / 8 GiB)ob Sie den Server Performance Mode aktiviert und mindestens 16 GiB Arbeitsspeicher installiert hätten. Andernfalls ist es null, es sei denn, Sie haben mindestens 3 GiB Speicher, in diesem Fall sind es 2 oder, beginnend mit High Sierra , memsize / 4 GiB. (Der Wert von task_maxam Anfang des Codeausschnitts wird festgelegt, wenn der Kernel erstellt wird, und es ist unklar, wie er von Apple beim Verteilen von OS X festgelegt wird. Er 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; 
    }

Nebenbemerkung: Beachten Sie, dass oben scale_setupder Skalierungsfaktor für serverperfmodeden Systemspeicher geteilt durch 8 GiB gilt, während er für den regulären Modus der Systemspeicher geteilt durch 4 GiB ist. Ein Computer mit 32 GiB Arbeitsspeicher hat also im normalen Modus den doppelten Skalierungsfaktor wie im Leistungsmodus, wodurch es noch unwahrscheinlicher wird, dass Sie ihn serverperfmodeauf einem Computer mit viel Arbeitsspeicher verwenden möchten.

Der scaleFaktor wird in bsd_scale_setup(nur für einen 64-Bit-Kernel) oder hier für High Sierra angewendet . Dadurch werden die oben besprochenen Kernelparameter geändert, die über sichtbar sind sysctl. Beachten Sie, dass bei nicht aktiviertem Serverleistungsmodus nur (maxproc 532 -> 1064) und maxprocperuid(266 -> 709) bis High Sierra skaliert werden, wenn maxfilesund maxfilesperprocebenfalls erhöht werden, wenn Sie über mindestens 12 GiB Arbeitsspeicher verfügen. Allerdings beziehen sich die anderen skalierten Parameter serverperfmodehauptsächlich auf die Verarbeitung einer großen Anzahl von Netzwerkverbindungsanfragen, etwas, das Sie wahrscheinlich nicht brauchen werden, es sei denn, Sie betreiben einen echten Webserver mit sehr hoher Last.

    /* 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 auch der Skalierungsfaktor in angewendet bsd_exec_setup. Dies konfiguriert, wie viel Kernel-Speicher reserviert wird, um alle Daten zusammenzustellen, die zum Initialisieren eines Prozesses benötigt werden. Wie ein Prozess ausgeführt wird exec, ist ein ganzes Kapitel in einem Buch über den Unix-Kernel wert, daher werde ich hier nicht darauf eingehen. Die allgemeine Konsequenz dieser Einstellung ist, dass eine größere Zahl mehr Speicher benötigt, aber eine größere Anzahl von Prozessen pro Sekunde erstellt werden kann. (Obwohl dieser Code bis heute/Mojave gleich geblieben ist, änderte sich der Effekt mit der Änderung der scaleBerechnungsweise in High Sierra. Erinnern Sie sich an die obigen Details: In High Sierra und höher ist die Skalierung ungefähr ( memory / 4 GiB) für den normalen Modus und ( memory / 8 GiB) für den Servermodus. Kann also bsd_simul_execstatsä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 bis heute/Mojave, BSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024also für meinen 48-GiB-Mac, reserviert der Kernel etwa 67 MiB Speicher, nur als Pufferspeicher zum Einrichten neuer zu erzeugender Prozesse. Einerseits ist das selbst für einen Webserver eine wahnsinnig hohe Zahl. Andererseits sind 67 MiB Peanuts im Vergleich zu den 48 GiB auf der Maschine.

Der Serverleistungsmodus benötigt also mehr Speicher und führt dazu, dass das System viel wahrscheinlicher leidet, wenn ein Programm außer Kontrolle gerät und Ressourcen verbraucht, aber die Fähigkeit des Systems, viel mehr Hintergrundaufgaben zu bewältigen, erheblich erhöht wird. Ich denke, Apple hat die richtige Entscheidung getroffen, indem es es nicht standardmäßig aktiviert hat, sondern es auch einfach zu aktivieren macht. Ich bin froh, dass sie mit High Sierra jetzt die Grenzen im normalen Modus erhöhen, wenn Sie genug Speicher haben. Ich würde den Servermodus auf allen meinen Computern deaktiviert lassen (und habe ihn deaktiviert), bis ich bemerke, dass sie auf Probleme stoßen, weil so viele Serverprogramme darauf laufen. Schließlich wird die Systemuhr nicht beschleunigt, die Festplattengeschwindigkeit nicht erhöht und die Netzwerk-E/A nur erhöht, wenn Sie Hunderte von Verbindungen haben. Dort'

Wenn Sie jedoch wirklich 2000 Prozesse ausführen müssen, ist der Servermodus Ihre einzige Option, bis Sie High Sierra erreichen. Die gute Nachricht ist, dass es einfach genug ist, es einzuschalten, auszuprobieren und bei Nichtgefallen wieder auszuschalten.

👏🏻! Netter Ratschlag am Schluss: „Ich würde den Servermodus ausschalten […]“.