Comprendre la moyenne de charge par rapport à l'utilisation du processeur [fermé]

OK, je suis moi-même un utilisateur Windows, donc ma connaissance des choses de type Linux-y est un peu limitée.

Cependant, il était de mon point de vue général que "Load Average" est une indication du nombre de traitements exécutés à un moment donné, en moyenne au cours de la dernière minute, cinq minutes et... quinze minutes?

De toute façon, j'ai surveillé mon serveur parce que nous avons eu une grande ouverture et beaucoup de gens!

Voir?

J'ai regardé top et a remarqué quelque chose cela semblait contraire à ce que je pensais savoir.

Si la moyenne de charge est à 7, avec 4 processeurs hyper-threadés, cela ne devrait-il pas signifier que le processeur fonctionne à environ 7/8?

Pourquoi, alors affichait-il 50.0% id? Comment peut-il être inactif la moitié du temps?

Je ne comprends pas XD

28
demandé sur Vivek Vermani 2014-02-07 05:13:53

1 réponses

Tout d'abord, top ne calcule pas load average lui-même. Il lit simplement load average à partir du fichier /proc/loadavg (strace montre que top ouvre /proc/loadavg et le lit ensuite périodiquement). man proc dit ceci pour /proc/loadavg:

/proc/loadavg

Les trois premiers champs de ce fichier sont des chiffres de charge moyenne donnant nombre de tâches dans la file d'attente d'exécution (état R) ou en attente d'E/S disque (état D) moyenne sur 1, 5 et 15 minutes. Ils sont les mêmes que les nombres moyens de charge donnés par temps de fonctionnement(1) et d'autres programmes. Le le quatrième champ est constitué de deux nombres séparés par une barre oblique (/). Le le premier d'entre eux est le nombre de planification du noyau en cours d'exécution entités (processus, threads); ceci sera inférieur ou égal à nombre de processeurs. La valeur après la barre oblique est le nombre de planification des entités qui existent actuellement sur le système. Cinquième champ est le PID du processus qui a été créé le plus récemment sur système.

Donc load average affiche le nombre de tâches dans la file d'attente d'exécution. Et vous êtes montré les trois premières valeurs de /proc/loadavg le top. Si vous exécutez cat /proc/loadavg, vous verrez toutes les valeurs dans le fichier.

En passant, il semble y avoir une erreur dans la description du quatrième champ. J'ai écrit un programme de test simple en C++ qui lit un entier n À partir de l'entrée, puis crée N threads qui exécutent juste une boucle infinitive chacun. Quand je lance mon programme et lui demande de créer 256 threads. J'ai seulement 8 processeurs avec HT. Pourtant, je vois cela dans le fichier:

>cat /proc/loadavg
74.44 21.04 10.59 259/931 17293

Clairement 259 est plus grand que le nombre CPU sur ma machine. Ce poste http://juliano.info/en/Blog:Memory_Leak/Understanding_the_Linux_load_average parle de la même chose - il y a une erreur dans la description de load average. Ceci est une citation:

Il convient de noter que l'explication actuelle dans la page de manuel proc(5) (à partir de la version 3.21 de man-pages, mars 2009) est faux. Il signale l' premier numéro du quatrième champ comme le nombre de cours d'exécution les entités de planification, et ainsi prédit qu'il ne peut pas être supérieur à nombre de processeurs. Cela ne correspond pas à la mise en œuvre réelle, où cela value indique le nombre actuel de threads exécutables

Donc, répondre à vos questions:

Si la moyenne de charge est à 7, avec 4 processeurs hyper-threadés, cela ne devrait-il pas signifier que le processeur fonctionne à environ 7/8?

Non, cela signifie simplement que vous avez 7 en cours d'exécution processus dans la file d'attente de travail en moyenne.

Pourquoi, alors affichait-il 50.0% id? Comment peut-il être inactif la moitié du temps?

Parce que load average ne signifie pas "% de la capacité du processeur". Vos threads n'utilisent simplement que 50% du processeur et 50% du temps pour faire autre chose.

Et enfin. Ci-dessous mon test simple. Pour construire, utilisez g++ -pthread my_test.cpp -o my_test. Exécutez ./my_test 8 et voyez votre temps d'inactivité lorsque les threads s'exécutent constamment et ne passent pas de temps à attendre quoi que ce soit. Ou exécutez ./my_test 128 pour voir cette charge la moyenne peut être beaucoup plus grande que le nombre de CPU.

#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <ctype.h>

static void* __attribute__ ((noinline))
my_thread_func(void * arg)
{
  printf("Thread %lld:\n", (long long)pthread_self());
  volatile long long i = 0;
  while (1) {
    ++i;
  }
  return 0;
}

int
main(int argc, char *argv[])
{
    int num_threads;
    pthread_t *my_threads;

    num_threads = atoi(argv[1]);
    my_threads = new pthread_t[num_threads];

    for (int tnum = 0; tnum < num_threads; tnum++) {
       pthread_create(&my_threads[tnum], NULL, &my_thread_func, NULL);
    }

    sleep (600);

    return 0;
}
89
répondu Sergei Kurenkov 2014-06-04 16:28:24