Comment la «moyenne de charge» est-elle interprétée dans la sortie «supérieure»? Est-ce la même pour toutes les distributions?


12

Je voudrais savoir si la sortie d'un linux basé sur Red-Hat pourrait être interprétée différemment par un linux basé sur Debian.

Pour rendre la question encore plus précise, ce que je recherche, c'est de comprendre comment la "charge moyenne" de la première ligne de la topcommande sur un système Red-Hat est interprétée et comment vérifier cela par la documentation officielle ro code.

[Il existe de nombreuses façons d'aborder ce sujet, qui sont toutes des réponses acceptables à la question]

Une approche potentielle serait de trouver où ces informations sont officiellement documentées.
Un autre serait de trouver la version du code qui topest construite à partir de la distribution et de la version spécifiques sur lesquelles je travaille.

La sortie de commande que j'obtiens est:

    top - 13:08:34 up  1:19,  2 users,  load average: 0.02, 0.00, 0.00
    Tasks: 183 total,   1 running, 182 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 96.8%id,  2.7%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   3922520k total,   788956k used,  3133564k free,   120720k buffers
    Swap:  2097148k total,        0k used,  2097148k free,   344216k cached


Dans ce cas, comment interpréter la valeur moyenne de la charge ?
J'ai réussi à localiser que la charge moyenne est d'environ la dernière minute, à partir d'une source de documentation et qu'elle doit être interprétée après avoir été multipliée par 100, par une autre source de documentation.
Donc, la question est:
est-il chargé à 0,02% ou 2%?
Sources et versions de la documentation:

1) Le premier étoiles avec

    TOP(1)                        Linux User’s Manual                       TOP(1)

    NAME
           top - display Linux tasks

Source: man topdans ma distribution RedHat,
Ubuntu a également la version avec "tâches" qui n'explique pas la moyenne de charge dans:
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html

2) Le second commence par

    TOP(1)                          User Commands                         TOP(1)

   NAME         top

   top - display Linux processes

Source:
http://man7.org/linux/man-pages/man1/top.1.htm

3) Celui-ci commence par:

   TOP(1)

   NAME

   top - display and update information about the top cpu processes

Source: http://www.unixtop.org/man.shtml

Le premier , peut être vu par man topdans RHELou dans online ubuntu documentationet il n'a aucune explication sur le format de sortie (ni sur la moyenne de charge qui m'intéresse) .

La seconde , contient une brève explication, soulignant que la moyenne de charge a à voir avec la dernière minute, mais rien à propos de l'interprétation de sa valeur!

Je cite directement la deuxième source:

2a. Moyennes UPTIME et LOAD
Cette partie se compose d'une seule ligne contenant: le nom du
programme ou de la fenêtre, en fonction de
l'heure actuelle du mode d'affichage et de la durée écoulée depuis le dernier démarrage
nombre total d'utilisateurs
charge moyenne du système au cours des 1, 5 et 15 dernières minutes

Donc, si cette explication est en effet correcte, il suffit juste de comprendre que la moyenne de charge est d'environ la dernière minute.
Mais cela n'explique pas le format du nombre.

Dans la troisième explication, il dit que:

Lorsque vous spécifiez des nombres pour les moyennes de charge, ils doivent être multipliés par 100.

Cette explication suggère que 0,02 signifie 2% et non 0,02%. Mais est-ce exact? De plus, est-ce correct pour toutes les distributions de Linux et potentiellement différentes implémentations de top?
Pour trouver la réponse à cette question, j'ai essayé de parcourir le code en le recherchant en ligne. Mais j'ai trouvé, au moins, deux versions différentes de topRHEL sur le marché! le builtin-top.cet le refactorisé top.c. Tous deux protégés par Red-Hat, comme le dit l'avis au début du code, et il semble donc logique que RHEL en utilise un.
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perf/util/top.c

Donc, avant de plonger dans autant de code, je voulais une opinion sur où se concentrer pour former une compréhension précise de la façon dont la charge du processeur est interprétée?

À partir des informations fournies dans les réponses ci-dessous, en plus d'une recherche personnelle, j'ai trouvé que:

1 - Le topque j'utilise est contenu dans le package procps-3.2.8. Ce qui peut être vérifié en utilisant top -v.
2 - Dans la version procps-3.2.8que j'ai téléchargée sur le site officiel, il semble que l'outil tire directement uptimeses informations du procfsfichier /proc/loadavg(sans utiliser la fonction linux getloadavg()).
3 - Maintenant, pour la topcommande, il n'utilise pas non plus la fonction getloadavg(). J'ai réussi à vérifier que le topfait fait les mêmes choses que leuptimeoutil pour afficher les moyennes de charge. Il appelle en fait la uptimefonction de l' outil, qui obtient ses informations du procfsfichier /proc/loadavg.

Donc, tout pointe vers le /proc/loadavgfichier! Ainsi, pour avoir une compréhension précise du load averageproduit par top, il faut lire le code du noyau pour voir comment le fichier loadavgest écrit.
Il y a aussi un excellent article souligné dans l'une des réponses qui fournit une explication en termes simples des trois valeurs de loadavg.
Donc, malgré le fait que toutes les réponses ont été également utiles et utiles, je vais marquer celle qui a désigné l'article http://www.linuxjournal.com//article/9001 comme "la" réponse à ma question. Merci à tous pour votre contribution!

De plus, à partir de la question Comprendre le sommet et la moyenne de charge , j'ai trouvé un lien vers le code source du noyau qui pointe vers l'endroit où loadavgest calculé. Comme il semble qu'il y ait un énorme commentaire expliquant son fonctionnement, cette partie du code est également disponible C!
Le lien vers le code est http://lxr.free-electrons.com/source/kernel/sched/loadavg.c
Encore une fois, je n'essaye pas de m'engager dans une quelconque forme de plagiat, j'ajoute simplement ceci pour être complet. Donc, je répète que le lien vers le code du noyau a été trouvé à partir de l'une des réponses dans Comprendre le sommet et la charge moyenne ...


Que vous disent les versions? ( top -v)
Fiximan

haut: procps version 3.2.8
Angelos Asonitis

Réponses:


19

La charge CPU est la longueur de la file d'attente d'exécution, c'est-à-dire la longueur de la file d'attente des processus en attente d'exécution.

La uptimecommande peut être utilisée pour voir la longueur moyenne de la file d'attente d'exécution au cours de la dernière minute, des cinq dernières minutes et des 15 dernières minutes, tout comme ce qui est généralement affiché par top.

Une valeur de charge élevée signifie que la file d'attente d'exécution est longue. Une valeur faible signifie qu'elle est courte. Ainsi, si la moyenne de charge d'une minute est de 0,05, cela signifie qu'en moyenne pendant cette minute, 0,05 processus étaient en attente d'exécution dans la file d'attente d'exécution. Ce n'est pas un pourcentage. C'est, AFAIK, le même sur tous les Unices (bien que certains Unices puissent ne pas compter les processus en attente d'E / S, ce que je pense que Linux; OpenBSD, pendant un certain temps seulement, a également compté les threads du noyau, de sorte que la charge était toujours de 1 ou plus).

L' toputilitaire Linux obtient les valeurs de charge du noyau, qui les écrit /proc/loadavg. En regardant les sources procps-3.2.8, nous voyons que:

  1. Pour afficher les moyennes de charge, la sprint_uptime()fonction est appelée top.c.
  2. Cette fonction vit proc/whattime.cet appels loadavg()à proc/sysinfo.c.
  3. Cette fonction s'ouvre simplement LOADAVG_FILEpour lire les moyennes de charge.
  4. LOADAVG_FILEest défini précédemment comme "/proc/loadavg".

Merci beaucoup pour votre réponse, est-ce officiellement documenté quelque part?
Angelos Asonitis

1
@AgelosAssonitis Cet article LinuxJournal de 2006 peut être intéressant. Il pointe vers quelques fichiers source dans l'arborescence des sources du noyau Linux que vous voudrez peut-être consulter. Je ne suis pas un utilisateur Linux, donc je ne peux pas dire si ces fichiers sont toujours là dans la dernière incarnation du noyau: linuxjournal.com/article/9001
Kusalananda

Article intéressant en effet! Je regarde juste dans le paquetage procps pour voir si en effet la commande top prend sa valeur dans le fichier / proc / loadavg et si c'est la même chose que le résultat de la fonction getloadavg ().
Angelos Asonitis

@AgelosAssonitis L'endroit incontournable pour la documentation des moyennes de charge est votre arbre source du noyau. POSIX ne définit pas la charge CPU et ne mentionne nulle part les mots "charge moyenne". Les utilitaires topet uptimene sont pas des utilitaires POSIX et la getloadavg()fonction de bibliothèque n'est pas non plus définie dans POSIX (elle a cependant une lignée BSD).
Kusalananda

Donc, d'après ce que je comprends, il n'y a pas de documentation officielle pour comprendre la formation de ces valeurs autres que la source du noyau lui-même, est-ce correct? Avant d'y arriver, cependant, j'ai encore besoin de lier la valeur présentée dans tople fichier procfs loadavg ...
Angelos Asonitis

7

La moyenne de charge est généralement calculée par le noyau. Des applications telles que topet uptimepeuvent utiliser l' getloadavg(3)appel de bibliothèque pour y accéder (il est censé être portable sur différentes versions d'Unix). Sous Linux, cela se traduit généralement par une lecture de /proc/loadavg. Sur FreeBSD, c'est un appel système.

Par exemple:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  double ld[3];

  int i=getloadavg(ld,3);
  printf("Load %.2f %.2f %.2f\n",ld[0],ld[1],ld[2]);
}

uptimeet les topdeux font des appels similaires pour obtenir leurs données.

Désormais, les moyennes de charge de 1/5/15 minute correspondent au nombre de processus dans la file d'attente d'exécution. Différents systèmes d'exploitation peuvent calculer cela de différentes manières; la plus grande différence est normalement de savoir si les processus en attente d'E / S (par exemple bloqués sur le disque) comptent comme exécutables ou non. Sous Linux, ils le sont.

Ainsi, une moyenne de charge de 3,4 signifie qu'il y avait en moyenne 3,4 processus sur la file d'attente d'exécution dans la fenêtre d'exemple (1, 5, 15 minutes).

Cependant, une moyenne de charge élevée ne signifie pas nécessairement un serveur surchargé. Si vous avez 16 cœurs, votre charge moyenne peut être de 16 sans stress. Vous pouvez également avoir un grand nombre d' fork()appels d' application, ce qui peut entraîner la création / la destruction d'un grand nombre de processus, entraînant une moyenne de charge élevée, mais sans impact massif sur les performances du serveur. Il ne doit être utilisé qu'à titre indicatif, avec d'autres mesures telles que% CPU occupé.


4

La moyenne de charge n'est pas quelque chose de spécifique à un outil ou à une distribution en particulier, c'est une mesure fournie par le noyau, ou plus précisément, le planificateur, c'est donc une mesure indépendante de la distribution. La mesure est enregistrée dans le système de fichiers proc/proc

Sur son interprétation, la métrique de charge moyenne n'est pas une indication de la force du processeur, mais de la quantité de travail à faire. Je ne pense pas qu'il soit vraiment nécessaire de le multiplier par quoi que ce soit, car il s'agit d'une mesure directe du nombre de processus dans un état exécutable ou ininterrompu.

Essayez de consulter les deux pages de manuel suivantes: getloadavg(3)et uptimepour plus d'informations.

La métrique de charge moyenne peut être un concept difficile à comprendre au début, je pense que beaucoup de gens pensent que c'est une indication de la force du processeur, mais ce n'est pas vraiment ça.


1
Ok, mais sommes-nous absolument certains que la moyenne de charge décrite dans la getloadavg()description de la fonction est la même moyenne de charge que la topcommande dans rhel affiche? Je pose cette question car j'ai effectué une recherche en texte intégral dans le contenu non goudronné du package procps-3.2.8 (qui est indiqué par la commande top -v) et il n'y a pas une seule mention de la fonction getloadavg ()! Donc, peut-être que top calcule la charge moyenne d'une manière différente ....
Angelos Asonitis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.