le calcul de la moyenne de charge est mieux considéré comme une moyenne mobile des processus dans la file d’attente d’exécution de Linux marquée en cours d’exécution ou sans interruption. Les mots « pensée de » ont été choisis pour une raison: c’est ainsi que les mesuressont destinés à être interprétés, mais pas exactement ce qui se passe derrière le rideau. C’est à ce stade de notre voyage que la réalité de itall, comme la mécanique equantum, semble ne pas correspondre à la manière intuitive telle qu’elle se présente.,
Les moyennes de charge que les commandes top et uptime affichent sont obtenues directement à partir de /proc. Si vous utilisez le noyau Linux 2.4 ou une version ultérieure, vous pouvez lire ces valeurs vous-même avec la commande cat/proc/loadavg. Cependant, c’est le noyau Linux qui produit ces valeurs dans /proc. Plus précisément, minuterie.c et sched.h travaillez ensemble pour le calcul. Pour comprendre quelle minuterie.c fait pour gagner sa vie, le concept de découpage du temps et le compteur jiffy aident à compléter l’image.
dans le noyau Linux, chaque processus dispatchable reçoit une quantité fixe de temps sur le CPU par répartition., Par défaut, ce montant est de 10 millisecondes,ou 1/100e de seconde. Pour cette courte période, le processus est assignéun processeur physique sur lequel exécuter ses instructions et autorisé à prendre overthat processeur. Le plus souvent, le processus abandonnera le contrôle avant que les 10 ms ne soient activés via des appels de socket, des appels d’E/S ou des appels au noyau. (Sur un processeur Intel 2.6 GHz, 10ms est assez de temps pour environ 50 millions d’instructions pour se produire. C’est plus qu’assezle temps de traitement pour la plupart des cycles d’application.,) Si le processus utilise un temps CPU entièrement alloué de 10 ms,une interruption est déclenchée par le matériel et le noyau reprend le contrôle du processus. Le noyau ensuite promptementpénalise le processus pour être un tel porc. Comme vous pouvez le voir, ce timeslicing est un concept de conception important pour que votre système semble fonctionner en douceur à l’extérieur. C’est aussi le véhicule qui produit les valeurs moyennes de charge.
La Tranche de temps de 10 ms est un concept suffisamment important pour justifier une valeur quantique., Il n’y a pas nécessairement quelque chose de spécial à propos de 10ms, mais il y a la valeur quantum en général, car quelle que soit la valeur à laquelle il est défini (il est configurable,mais 10ms est la valeur par défaut), il contrôle à quelle fréquence au minimum le noyau prend le contrôle du système à partir des applications. L’un des manychores que le noyau effectue lorsqu’il reprend le contrôle est d’incrémenter le compteur jiffies. Le compteur jiffies mesure le nombre de tiques Quantum qui se sont produites depuis le démarrage du système. Quand la minuterie de thequantum apparaît, minuterie.c est entré dans une fonction du noyau appelée timer.,c: do_timer (). Ici, toutes les interruptions sont désactivées afin que le code ne fonctionne pas avec des cibles en mouvement. Le compteur jiffies est incrémenté de 1 et le calcul de la charge moyenne est vérifié pour voir s’il doit l’être computed.In en réalité, le calcul de la charge moyenne n’est pas vraiment calculé sur chaque tick quantique, mais conduit par une valeur variable basée sur le réglage de Fréquence Hz et testée sur chaque tick quantique. (HZ ne doit pas être confondu avec la cote MHz du processeur. Cette variable définit le pulserate d’une activité particulière du noyau Linux et 1HZ est égal à un quantum ou10ms par défaut.,) Bien que la valeur HZ puisse être configurée dans certaines versions du noyau, elle est normalement définie sur 100. Le code de calcul utilisela valeur HZ pour déterminer la fréquence de calcul. Plus précisément,la minuterie.c: la fonction calc_load () exécutera l’algorithme de moyenne toutes les 5 * HZ, ou à peu près toutes les cinq secondes. Voici cette fonction dans itsentirety:
le tableau avenrun contient les trois moyennes dont nous avons discuté. La fonction Thecalc_load () est appelée par update_times (), également trouvée dans timer.c, et est le code responsable de la fourniture de la fonction calc_load () avec le paramètre theticks., Malheureusement, cette fonction ne révèle pas sonl’aspect le plus intéressant: le calcul lui-même. Cependant, cela peutêtre situé facilement dans sched.h, un en-tête utilisé par une grande partie du noyau code.In là, la macro CALC_LOAD et ses valeurs associées sont disponibles:
Voici où les pneus rencontrent la chaussée. Il devrait maintenant être évident que la réalité ne semble pas correspondre à l’illusion. Au moins, ce n’est certainement pas le type de moyenne que la plupart d’entre nous enseignent à l’école. Mais c’est une moyenne tout de même., Techniquement, c’est une fonction exponentialdecay et est la moyenne mobile de choix pour la plupart des systèmes UNIX ainsi que Linux. Examinons ses détails.
la macro prend en compte trois paramètres: le compartiment load-average (l’un des trois éléments d’avenrun), un exposant constant et le nombre de processus en cours d’exécution/non interruptibles actuellement dans la file d’attente d’exécution. Les constantes d’exposant possibles sont listées ci-dessus: EXP_1 pour la moyenne de 1 minute, EXP_5 pour la moyenne de 5 minutes et EXP_15 pour la moyenne de 15 minutes. Le point important à remarquer est que la valeur diminueavec l’âge., Les constantes sont des nombres magiques calculés par la fonction mathématique ci-dessous:
quand x=1, puis y=1884; quand x=5, puis y=2014; et quand x=15, puis y=2037. Le but des nombres magiques est qu’il permet à la macro CALC_LOAD d’utiliser une représentation en point fixe de précision des fractions. Les magicnumbers ne sont alors rien de plus que des multiplicateurs utilisés contre la moyenne runningload pour en faire une moyenne mobile. (Les mathématiques offix-point représentation sont au-delà de la portée de cet article, donc je ne vais pasattempter une explication.,) Le but de la fonction de décroissance exponentielle est que non seulement elle lisse les creux et les pointes en maintenant une ligne de tendance utile, mais elle diminue avec précision la qualité de ce qu’elle mesure en tant qu’activité vieillit. Au fur et à mesure que le temps avance, les événements CPU successifs augmententleur importance sur la moyenne de charge. C’est ce que nous voulons, carune activité CPU plus récente a probablement plus d’impact sur l’état actuel que sur les événements anciens., En fin de compte, les moyennes de charge donnent une tendance lisse de 15 minutes à la minute actuelle et nous donnent une fenêtre intonon seulement l’utilisation du processeur mais aussi la demande moyenne pour les processeurs. Comme la moyenne de charge dépasse le nombre de processeurs physiques, plus le processeur est utilisé et plus il y a de demande. Et, plus il recule, moins il y a de demande. Avec cette compréhension, la moyenne de charge peut être utilisée avec le pourcentage de CPU pour obtenir une vue plus précise de l’activité de CPU.,
j’espère que cela servira non seulement d’interprétation pratique des moyennes de charge de Linux, mais qu’il illuminera également certaines des ombres mathématiques sombres derrière elles. Pour plus d’informations, une étude de la fonction exponentialdecay et de ses applications apporterait plus de lumière sur le sujet. Mais pour les plus pratiques, tracer la moyenne de chargevs. un nombre contrôlé de processus (c’est-à-dire la modélisation des effets de l’algorithme CALC_LOAD dans une boucle contrôlée) vous donnerait une idée de la relation réelle et de la façon dont le filtre en décomposition s’applique.