Zuerst top
hat load average
sich nicht berechnen. Es liest gerade load average
aus der /proc/loadavg
Datei (strace
zeigt, dass top
öffnet /proc/loadavg
und liest dann daraus periodisch). man proc
sagt dies für /proc/loadavg
:
/proc/loadavg
Die ersten drei Felder in dieser Datei sind durchschnittliche Auslastung Zahlen die Zahl der Arbeitsplätze in der Task-Liste (Zustand R) oder warten auf Disk-I geben/O (Zustand D) gemittelt über 1, 5 und 15 Minuten. Sie sind die gleichen wie die durchschnittliche Auslastung von Uptime (1) und anderen Programmen. Das vierte Feld besteht aus zwei Zahlen, die durch einen Schrägstrich (/) getrennt sind. Die erste dieser ist die Anzahl der aktuell ausgeführten Kernel-Scheduling Entities (Prozesse, Threads); Dies ist kleiner oder gleich der Anzahl der CPUs. Der Wert nach dem Schrägstrich ist die Anzahl der Kernel- Scheduling-Entitäten, die derzeit auf dem System vorhanden sind. Das fünfte Feld ist die PID des Prozesses, der zuletzt am System erstellt wurde.
So zeigt load average
die Anzahl der Jobs in der Ausführungswarteschlange an. Und Sie werden die ersten drei Werte von /proc/loadavg
durch die top
angezeigt. Wenn Sie cat /proc/loadavg
ausführen, sehen Sie alle Werte in der Datei.
Durch die Art und Weise scheint es ein Fehler in der Beschreibung des vierten Feldes zu sein. Ich habe ein einfaches Testprogramm in C++ geschrieben, das eine Ganzzahl N aus der Eingabe liest und dann N Threads erstellt, die jeweils nur eine Infinitivschleife ausführen. Wenn ich mein Programm starte und es frage, 256 Threads zu erstellen. Ich habe nur 8 Prozessoren mit HT. Aber ich sehe das in der Datei:
>cat /proc/loadavg
74.44 21.04 10.59 259/931 17293
Klar 259 ist größer als die Anzahl der CPU auf meinem Rechner. Dieser Beitrag http://juliano.info/en/Blog:Memory_Leak/Understanding_the_Linux_load_average spricht über das gleiche - es ist ein Fehler in der Beschreibung von load average
.Dies ist ein Zitat:
Es ist erwähnenswert, dass die aktuelle Erklärung in proc (5) -Manualseite (Stand-man-pages-Version 3.21 März 2009) ist falsch. Es meldet die erste Nummer des vierten Felds als die Anzahl der derzeit ausgeführten Scheduling-Entitäten und prognostiziert, dass es nicht größer als die Anzahl der CPUs sein kann. Das bedeutet nicht, die reale Umsetzung entspricht, wobei dieser Wert die aktuelle Anzahl der runnable Themen berichtet
Also, Ihre Fragen zu beantworten:
Wenn die Last durchschnittlich bei 7, mit 4 Hyper- ist Threaded-Prozessoren, sollte das nicht heißen, dass die CPU auf ca. 7/8 Kapazität arbeitet?
Nein, es bedeutet nur, dass Sie im Durchschnitt 7 laufende Prozesse in der Jobwarteschlange haben.
Warum, dann war es 50,0% ID? Wie kann es die halbe Zeit im Leerlauf sein?
Da load average
bedeutet nicht "% der CPU-Kapazität". Ihre Threads verwenden einfach nur 50% der CPU und 50% der Zeit, um etwas anderes zu tun.
Und schließlich. Unten ist mein einfacher Test. Verwenden Sie g++ -pthread my_test.cpp -o my_test
. Führen Sie ./my_test 8
aus und sehen Sie Ihre Leerlaufzeit, wenn Threads ständig ausgeführt werden und keine Zeit darauf warten, auf irgendetwas zu warten. Oder führen Sie ./my_test 128
aus, um zu sehen, dass der Lastdurchschnitt viel größer als die Anzahl der CPUs sein kann.
#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;
}
Vielleicht werden diese etwas Hilfe anbieten: http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages, http://en.wikipedia.org/wiki/Load_ % 28computing% 29 und http://www.linuxjournal.com/article/9001. –