2014-02-07 7 views
28

Okay, ich bin selbst sehr viel Windows-Benutzer, daher ist mein Wissen über Linux-typische Dinge etwas begrenzt.Verstehen des Lastdurchschnitts im Vergleich zur CPU-Auslastung

Es war jedoch mein allgemeines Verständnis, dass "Load Average" eine Angabe darüber ist, wie viele Prozesse zu einem bestimmten Zeitpunkt ausgeführt werden, im Durchschnitt über die letzte Minute, fünf Minuten und ... fünfzehn Minuten?

Wie auch immer, ich habe meinen Server überwacht, weil wir eine große Eröffnung hatten und viele Leute!

See?

Ich habe top beobachtet und bemerkt etwas, das Gegenteil schien, was ich dachte, ich kannte.

Wenn der Lastdurchschnitt bei 7 liegt, mit 4 hyper-threaded-Prozessoren, sollte das nicht bedeuten, dass die CPU zu ungefähr 7/8 Kapazität arbeitet?

Warum, dann war es 50,0% ID? Wie kann es die halbe Zeit im Leerlauf sein?

Ich erhalte es nicht XD

+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. –

Antwort

87

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; 
} 
+0

Entschuldigung für die Verspätung bei der Rückkehr zu Ihnen - ich habe die Benachrichtigung für diese Frage in meiner Macht Stack Overflowing verpasst haben! Aber +1 und Akzeptiert für eine sehr gründliche Antwort. Vielen Dank! –

+0

Auch skwllsp hat eine detaillierte Antwort gegeben, aber es ist schwer zu verstehen, durch AVG-Last vs. von laufenden Prozessen. so zu verstehen, es gibt einfache Formel, dass für eine einzelne CPU-Maschine durchschnittliche Auslastung 1 bedeutet, 100% CPU-Auslastung ... während 4 CPU-Maschine durchschnittliche Auslastung 4 bedeutet 100% CPU-Auslastung, so AVG-Last 1 für 4 CPU-Maschine bedeutet 25% CPU-Auslastung .. –

Verwandte Themen