Comprendre la moyenne maximale et la charge

12

J'observe une moyenne de charge élevée sur une certaine machine (environ 9) dans les trois champs de charge. Je comprends la charge comme le nombre de processus en état "exécuté" / souhaitant actuellement du temps CPU. Ai-je raison de penser que si N processus s'exécutent sur ma machine, cela ne peut pas produire une charge supérieure à N?

De plus, la charge compte-t-elle pour les processus ou les threads? En d'autres termes, un processus multithread peut-il produire une charge supérieure à 1?

Gabriel Schreiber
la source
Notez que (car elles sont généralement planifiées très prochainement), les tâches à l'état "sans interruption" sont également comptées comme en cours d'exécution. Juste un détail, pas quelque chose qui change votre question.
mattdm

Réponses:

7

La charge moyenne est généralement décrite comme «la longueur moyenne de la file d'attente d'exécution». Ainsi, peu de processus ou de threads gourmands en CPU peuvent élever LA au-dessus de 1. Il n'y a aucun problème si LA est inférieure au nombre total de cœurs de CPU. Mais s'il dépasse le nombre de CPU, cela signifie que certains threads / processus resteront dans la file d'attente, prêts à fonctionner, mais en attente de CPU libre.

gelraen
la source
3

Les nombres qui sont utilisés pour calculer la moyenne de la charge sont les tâches en cours d'exécution ou sans interruption et la quantité de travail effectuée dans la tranche de temps de la moyenne mobile. Ces tâches peuvent faire partie d'un processus multithread. Les champs sont flous le plus loin dans le temps en raison des résultats de lissage de l'algorithme utilisé.

Une charge de 1 équivaut à 100% de la valeur d'un processeur. Si vous aviez une application multithread qui réussissait à avoir un nombre de threads actifs supérieur au nombre de CPU disponibles, alors vous pourriez avoir un seul processus pour conduire la charge au-dessus de 1. Ce serait probablement un pic à court terme et non reflété dans le vues de tranche de temps plus longues de la moyenne de charge.

De plus, comme la moyenne de charge a été développée avant qu'il n'y ait des systèmes multicœurs, il est important de diviser les nombres de charges par le nombre total de cœurs disponibles. Si c'est une charge soutenue de 9 sur un système quad core à 4 sockets, alors c'est une charge de 9 sur 16 et ce n'est pas vraiment un problème.

nzwulfin
la source
1
- Je n'ai pas encore vu de système où plusieurs cœurs sur un socket sont exposés à l'espace utilisateur d'une manière qui les fait ressembler à autre chose qu'à plus de CPU. Donc en haut, sur le système quadricœur à 4 sockets, 16 processeurs sont vus. (On peut donc facilement voir que la charge de 9 est inférieure au nombre de CPU.)
mattdm
Je comprends que les nombres sont logarithmiques, ils sont donc juste en dessous ou au-dessus de 1. Un système que j'ai, j'ai vu le système signaler ceci: charge moyenne: 10.41, 9.57, 9.26. Quoi?? Pourquoi un système Linux rapporterait-il une charge moyenne: 0,81, 1,57, 0,98 alors que ce système rapporte une charge moyenne: 10,41, 9,57, 9,26? Tous les Unix ne sont-ils pas les mêmes à ce sujet?
djangofan
3

Voir kernel / sched / loadavg.c qui a un long et excellent commentaire au début expliquant la dérivation de la moyenne de charge à partir d'une moyenne en décroissance exponentielle du nombre de threads exécutables (la "file d'attente d'exécution") plus le nombre de threads ininterrompus (en attente sur E / S ou en attente sur un verrou).

Voici l'essence du commentaire, mais il vaut la peine d'être lu dans son intégralité:

 * The global load average is an exponentially decaying average of
 * nr_running + nr_uninterruptible.
 *
 * Once every LOAD_FREQ:
 *     nr_active = 0;
 *     for_each_possible_cpu(cpu)
 *         nr_active += cpu_of(cpu)->nr_running +
 *                      cpu_of(cpu)->nr_uninterruptible;
 *     avenrun[n] = avenrun[0] *
 *                  exp_n + nr_active *
 *                  (1 - exp_n)

La vraie vie rend le code quelque peu complexe: compteurs par CPU, noyaux tickless, CPU à chaud, manque de code de point flottant nécessitant une implémentation à point fixe de exp (n). Mais il est facile de voir que tous ces éléments travaillent à la mise en œuvre fidèle de la méthode décrite dans le commentaire.

Vous remarquerez que Linux compte les threads , pas seulement les processus, ce qui répond à votre question.

vk5tu
la source
0

Les 3 moyennes de charge sont quelque chose comme une fonction logarithmique tournant autour du nombre 1. Quelque chose de similaire à f (x) = eX (e à l'exposant X). Techniquement, une représentation en virgule fixe d'une fonction de décroissance exponentielle simulant une moyenne. Ils sont additifs, par CPU, donc une charge complète peut ressembler à 4,00 sur un système quadricœur. Le premier nombre est la moyenne de la dernière minute, le second est la moyenne des cinq dernières minutes et le troisième est la moyenne des 15 dernières minutes. Je pensais qu'il fallait déposer ici une réponse qui le mentionne.

djangofan
la source
0

Charge instantanée: nombre de tâches en cours d'exécution ou en attente d'exécution, ou d'une autre manière, le nombre de tâches prêtes à être exécutées

Charge moyenne: la mesure ci-dessus mais moyenne exponentielle avec les échantillons précédents de la même mesure

Ces deux nombres sont illimités et souvent beaucoup plus importants que N.

Pour être clair: le nombre de charges sur Linux inclut les threads, cela ne fait aucun doute. Vous pouvez produire une charge arbitrairement grande avec un seul processus qui crée de nombreux threads.

Plus à ce sujet ici

http://blog.angulosolido.pt/2015/04/linux-load-average-definitive-summary.html

Gustavo Homem
la source