33 votes

Que fait réellement serverperfmode=1 sous MacOS ?

La mise en marche est décrite aquí mais il n'y a pas de détails.

Il y a une vague description :

Le mode Performance modifie les paramètres système de votre Mac. Ces Ces modifications permettent de mieux tirer parti de votre matériel pour les applications exigeantes.

Qu'est-ce qui change réellement dans le système/noyau ?

19voto

klanomath Points 63400

L'activation du mode Performance du serveur augmente essentiellement certains paramètres du noyau/réseau liés au nombre maximal de processus et de connexions possibles/autorisés et modifie certains paramètres de mémoire/temporisateurs :

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

L'objectif est de permettre l'ouverture d'un plus grand nombre de fichiers (particulièrement nécessaire pour les serveurs web) et de connexions afin de servir plus de clients en même temps et de supprimer plus rapidement les threads d'un seul serveur de la mémoire/mémoire virtuelle (si j'interprète correctement certaines modifications).


Dans le passé, Apple a publié un système d'exploitation différent et maintenant que le serveur se charge au-dessus du système d'exploitation grand public, certains réglages de base peuvent aider le système d'exploitation à exécuter des processus pour 25 utilisateurs qui se connectent à un serveur au lieu d'être réglé pour une seule personne utilisant le système d'exploitation. Ces réglages ne sont qu'un point de départ - quiconque souhaite que son serveur fonctionne sous une charge élevée doit personnaliser et surveiller les choses à un niveau bien plus détaillé que l'activation ou la désactivation du mode performance.

De plus, ces limites servent principalement à empêcher les mauvais logiciels de faire tomber un serveur en épuisant des ressources limitées comme les canaux de signalisation des communications entre processus (ipc). Sur un système où un seul utilisateur est en cours d'exécution, vous voulez arrêter un processus en fuite plus tôt que si des dizaines de processus sont en cours d'exécution pour des dizaines d'utilisateurs. La "performance" peut être considérée comme l'élévation de certaines limites strictes, par opposition à "servir un fichier ou une page Web plus rapidement".

12voto

Old Pro Points 5634

Mode performance du serveur (alias. perfmode o serverperfmode ) modifie un certain nombre de paramètres du noyau, réservant beaucoup plus de mémoire pour le noyau afin de fournir des limites beaucoup plus élevées et ainsi permettre l'exécution de beaucoup plus de processus, l'ouverture de fichiers et la gestion de connexions réseau, entre autres choses. Tous les paramètres s'échelonnent en fonction de la quantité de mémoire installée, dans certaines limites. rien ne change si vous n'avez pas au moins 16 GiB de mémoire installée . Les chiffres de @klanomath correspondent à une mémoire installée de 16 Go.

Voici une brève description tirée d'un ancien document de soutien d'Apple sur le serveur 10.6 :

  • Pour chaque 8GB de mémoire installée, 2500 processus et 150 000 vnodes sont disponibles.
  • Le nombre maximum de threads est fixé à cinq fois. (5x) le nombre de processus maximum. (Cela semble ne plus être vrai)
  • Un seul ID utilisateur (uid) peut utiliser jusqu'à 75% du nombre maximum de processus.
  • Un seul processus peut allouer jusqu'à 20% de la valeur maximale des threads.

En mode performance avec 48 Go de mémoire, je vois :

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

Si vous voulez vraiment approfondir le sujet, vous pouvez lire le code réel. Le code ci-dessous provient d'El Capitan 10.11.6. Le mode serveur est toujours le même (jusqu'au dernier code publié, qui date d'OS X 10.14 Mojave), mais le mode normal a bénéficié d'une amélioration des performances à partir d'OS X 10.13 High Sierra si vous disposez d'au moins 12 Go de mémoire (changements inclus dans les commentaires du code).

El scale_seutp met en place la fonction scale comme floor(memsize / 8 GiB) si le mode Performance du serveur est activé et si au moins 16 Go de mémoire sont installés. Sinon, il est égal à zéro, sauf si vous disposez d'au moins 3 Go de mémoire, auquel cas il est égal à 2, ou à , à partir de High Sierra , memsize / 4 GiB. (La valeur de task_max au début de l'extrait de code est défini lorsque le noyau est construit, et on ne sait pas très bien comment il est défini par Apple lors de la distribution d'OS X. C'est probablement 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; 
    }

Note complémentaire : Remarquez que dans l'exemple ci-dessus scale_setup est que le facteur d'échelle pour serverperfmode est la mémoire système divisée par 8 Go, tandis que pour le mode normal, c'est la mémoire système divisée par 4 Go. Ainsi, un ordinateur doté de 32 Go de mémoire aura un facteur d'échelle deux fois plus élevé en mode normal qu'en mode performance, ce qui rend encore moins probable l'utilisation de la fonction serverperfmode sur une machine avec beaucoup de mémoire.

El scale est appliqué dans bsd_scale_setup (uniquement pour un noyau 64 bits) ou ici pour High Sierra . Ceci modifie les paramètres du noyau qui sont discutés ci-dessus et qui sont visibles par l'intermédiaire de sysctl . Notez que si le Mode Performance du Serveur n'est pas activé, la fonction seulement La chose qui est mise à l'échelle est maxproc (532 -> 1064) et maxprocperuid (266 -> 709) jusqu'à High Sierra, quand maxfiles y maxfilesperproc sont également améliorés si vous avez au moins 12 Go de mémoire. Cela dit, les autres paramètres mis à l'échelle dans serverperfmode concernent principalement la gestion d'un grand nombre de demandes de connexion au réseau, ce dont vous n'aurez probablement pas besoin à moins de faire fonctionner un véritable serveur Web avec une charge très élevée.

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

Enfin, le facteur d'échelle est également appliqué dans bsd_exec_setup . Cela configure la quantité de mémoire du noyau qui est réservée pour assembler toutes les données nécessaires à l'initialisation d'un processus. La façon dont un processus est exec d est digne d'un chapitre entier dans un livre sur le noyau Unix, je ne m'y attarderai donc pas ici. La conséquence de haut niveau de ce paramètre est qu'un nombre plus grand prend plus de mémoire, mais permet la création d'un plus grand nombre de processus par seconde. (Bien que ce code soit resté le même jusqu'à aujourd'hui/Mojave, l'effet a changé avec le changement dans la façon dont le système de gestion de la mémoire est utilisé. scale est calculé dans High Sierra. Rappelez-vous les détails ci-dessus : dans High Sierra et les versions ultérieures, l'échelle est approximativement ( memory / 4 GiB ) pour le mode normal et ( memory / 8 GiB ) pour le mode serveur. Donc bsd_simul_execs peut effectivement baisser lorsque vous passez en mode serveur).

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

Pour El Capitan jusqu'à aujourd'hui/Mojave, BSD_PAGEABLE_SIZE_PER_EXEC = 264 * 1024 Ainsi, pour mon Mac de 48 Go, le noyau réservera environ 67 Mo de mémoire juste comme espace tampon pour la mise en place des nouveaux processus à lancer. D'un côté, c'est un nombre follement élevé, même pour un serveur web. D'autre part, 67 Mio est une bagatelle par rapport aux 48 Go de la machine.

Ainsi, le mode Performance du serveur consomme plus de mémoire et rend le système beaucoup plus susceptible de souffrir si un programme consomme des ressources de manière incontrôlée, mais il augmente considérablement la capacité du système à gérer beaucoup plus de tâches d'arrière-plan. Je pense qu'Apple a pris la bonne décision en ne l'activant pas par défaut mais en la rendant facile à activer. Je suis heureux qu'avec High Sierra ils augmentent maintenant les limites en mode normal si vous avez assez de mémoire. Je laisserais le mode serveur désactivé (et je l'ai laissé désactivé) sur tous mes ordinateurs jusqu'à ce que je remarque qu'ils ont des problèmes parce que j'ai beaucoup de programmes de serveur qui tournent dessus. Après tout, il n'accélère pas l'horloge du système, il n'augmente pas la vitesse du disque et il n'augmente les E/S du réseau que si vous avez des centaines de connexions. Il y a de fortes chances que votre pare-feu/routeur ait du mal à suivre si vous arrivez à un point où le mode serveur a un réel impact sur le débit de votre réseau.

D'un autre côté, si vous avez vraiment besoin d'exécuter des processus 2000, le mode serveur est votre seule option jusqu'à ce que vous passiez à High Sierra. La bonne nouvelle, c'est qu'il est assez facile de l'activer, de l'essayer et, si vous ne l'aimez pas, de le désactiver.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X