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.