Wie wird der „Lastdurchschnitt“ in der „Top“ -Ausgabe interpretiert? Ist es für alle Distributionen gleich?

12

Ich würde gerne wissen, ob die Ausgabe eines Red-Hat-basierten Linux von einem Debian-basierten Linux anders interpretiert werden könnte.

Um die Frage noch spezifischer zu machen, möchte ich verstehen, wie der "Lastdurchschnitt" aus der ersten topBefehlszeile eines Red-Hat-Systems interpretiert wird und wie dies durch den offiziellen Ro-Code der Dokumentation überprüft werden kann.

[Es gibt viele Möglichkeiten, sich diesem Thema zu nähern, die alle akzeptable Antworten auf die Frage sind.]

Ein möglicher Ansatz wäre, herauszufinden, wo diese Informationen offiziell dokumentiert sind.
Eine andere Möglichkeit wäre, die Codeversion zu finden, die topin der spezifischen Distribution und Version, an der ich arbeite, erstellt wurde.

Die Befehlsausgabe, die ich erhalte, lautet:

    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


Wie kann ich in diesem Fall den Lastdurchschnitt interpretieren ? Wert?
Ich habe festgestellt, dass die durchschnittliche Last ungefähr in letzter Minute von einer Dokumentationsquelle stammt und dass sie nach Multiplikation mit 100 von einer anderen Dokumentationsquelle interpretiert werden sollte.
Die Frage ist also:
Ist es 0,02% oder 2% geladen?
Dokumentationsquellen und -versionen:

1) Der erste Stern mit

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

    NAME
           top - display Linux tasks

Quelle: man top In meiner RedHat-Distribution hat
Ubuntu auch die Version mit "Aufgaben", die den Lastdurchschnitt nicht erklärt:
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html

2) Der zweite beginnt mit

    TOP(1)                          User Commands                         TOP(1)

   NAME         top

   top - display Linux processes

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

3) Dieser beginnt mit:

   TOP(1)

   NAME

   top - display and update information about the top cpu processes

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

Die erste ist man topin RHELoder in zu sehen online ubuntu documentationund enthält keine Erklärung für das Ausgabeformat (noch für den Lastdurchschnitt, an dem ich interessiert bin). .

Die zweite enthält eine kurze Erklärung, in der darauf hingewiesen wird, dass der Lastdurchschnitt mit der letzten 1 Minute zu tun hat, aber nichts über die Interpretation seines Wertes!

Ich zitiere direkt aus der zweiten Quelle:

2a. UPTIME- und LOAD-Durchschnittswerte
Dieser Teil besteht aus einer einzelnen Zeile, die Folgendes enthält:
Programm- oder Fensternamen, abhängig von der
aktuellen Zeit und der Zeitdauer seit dem letzten Start des Anzeigemodus
- Gesamtzahl der Benutzer
Systemlast avg in den letzten 1, 5 und 15 Minuten

Wenn diese Erklärung tatsächlich richtig ist, reicht es gerade aus zu verstehen, dass der Lastdurchschnitt ungefähr die letzte Minute beträgt.
Das Format der Nummer wird jedoch nicht erklärt.

Im dritten Erklärung heißt es:

Wenn Sie Zahlen für Lastmittelwerte angeben, sollten Sie diese mit 100 multiplizieren.

Diese Erklärung legt nahe, dass 0,02 2% und nicht 0,02% bedeutet. Aber ist das richtig? Ist es außerdem korrekt für alle Linux-Distributionen und potenziell unterschiedliche Implementierungen von top?
Um die Antwort auf diese Frage zu finden, habe ich versucht, den Code durch Online-Suche durchzugehen. Aber ich habe mindestens zwei verschiedene Versionen von topRHEL gefunden! das builtin-top.cund das umgestaltete top.c. Beide sind von Red-Hat urheberrechtlich geschützt, wie in der Mitteilung am Anfang des Codes angegeben, und daher erscheint es logisch, dass RHEL eine davon verwendet.
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perf/util/top.c

Bevor ich mich mit so viel Code befasste, wollte ich eine Meinung darüber, wo ich mich konzentrieren sollte, um ein genaues Verständnis dafür zu erhalten, wie die CPU-Last interpretiert wird.

Aus den Informationen in den Antworten unten habe ich zusätzlich zu einer persönlichen Suche Folgendes herausgefunden:

1 - Die von topmir verwendeten Informationen sind im Paket procps-3.2.8 enthalten. Welches kann mit überprüft werden top -v.
2 - In der Version procps-3.2.8, die ich von der offiziellen Website heruntergeladen habe, scheint es, dass das Tool uptimeseine Informationen direkt aus der procfsDatei /proc/loadavgbezieht (ohne die Linux-Funktion zu verwenden getloadavg()).
3 - Für den topBefehl wird die Funktion jetzt ebenfalls nicht verwendet getloadavg(). Ich habe es geschafft zu überprüfen, ob das toptatsächlich die gleichen Dinge tut wie dasuptimeWerkzeug zum Anzeigen der Lastmittelwerte. Es ruft tatsächlich die uptimeFunktion des Tools auf, die seine Informationen aus der procfsDatei erhält /proc/loadavg.

Also zeigt alles auf die /proc/loadavgDatei! Um ein genaues Verständnis des von load averageerzeugten zu erhalten top, muss man den Kernel-Code lesen, um zu sehen, wie die Datei loadavggeschrieben wird.
Es gibt auch einen ausgezeichneten Artikel, auf den in einer der Antworten hingewiesen wird, der die Begriffe eines Laien zur Erklärung der drei Werte von enthält loadavg.
Trotz der Tatsache, dass alle Antworten gleichermaßen nützlich und hilfreich waren, werde ich die Antwort, die auf den Artikel http://www.linuxjournal.com//article/9001 verwies, als "die" Antwort auf meine Frage markieren . Vielen Dank für Ihren Beitrag!

Zusätzlich habe ich aus der Frage Grundlegendes zum Top- und Lastdurchschnitt einen Link zum Quellcode des Kernels gefunden, der auf die Stelle verweist, an der loadavgberechnet wird. Wie es scheint, gibt es einen großen Kommentar, der erklärt, wie es funktioniert, auch dieser Teil des Codes ist in C!
Der Link zum Code lautet http://lxr.free-electrons.com/source/kernel/sched/loadavg.c. halber
Auch hier versuche ich nicht, mich auf irgendeine Form von Plagiaten einzulassen, sondern füge dies der Vollständigkeit halber hinzu. Ich wiederhole also, dass der Link zum Kernel-Code aus einer der Antworten in Grundlegendes zum Top- und Lastdurchschnitt gefunden wurde ...

Angelos Asonitis
quelle
Was sagen Ihnen die Versionen? ( top -v)
Fiximan
oben: Procps Version 3.2.8
Angelos Asonitis
Siehe auch
BowlOfRed

Antworten:

19

Die CPU-Auslastung ist die Länge der Ausführungswarteschlange, dh die Länge der Warteschlange der Prozesse, die darauf warten, ausgeführt zu werden.

Der uptimeBefehl kann verwendet werden, um die durchschnittliche Länge der Ausführungswarteschlange in der letzten Minute, den letzten fünf Minuten und den letzten 15 Minuten anzuzeigen, genau wie dies normalerweise von angezeigt wird top.

Ein hoher Ladewert bedeutet, dass die Ausführungswarteschlange lang ist. Ein niedriger Wert bedeutet, dass er kurz ist. Wenn der Lastdurchschnitt von einer Minute 0,05 beträgt, bedeutet dies, dass in dieser Minute durchschnittlich 0,05 Prozesse darauf warteten, in der Ausführungswarteschlange ausgeführt zu werden. Es ist kein Prozentsatz. Dies ist, AFAIK, auf allen Unices gleich (obwohl einige Unices möglicherweise keine Prozesse zählen, die auf E / A warten, was Linux meiner Meinung nach tut; OpenBSD zählte nur für eine Weile auch Kernel-Threads, so dass die Last immer 1 oder 1 betrug Mehr).

Das Linux- topDienstprogramm ruft die Ladewerte vom Kernel ab, in den sie geschrieben werden /proc/loadavg. Wenn procps-3.2.8wir uns die Quellen ansehen, sehen wir Folgendes:

  1. Zur Anzeige der Lastmittelwerte wird die sprint_uptime()Funktion aufgerufentop.c .
  2. Diese Funktion lebt in proc/whattime.cund ruft loadavg()aufproc/sysinfo.c .
  3. Diese Funktion wird einfach geöffnet LOADAVG_FILE , um die Lastmittelwerte zu lesen.
  4. LOADAVG_FILEist früher definiert als "/proc/loadavg".
Kusalananda
quelle
Vielen Dank für Ihre Antwort. Ist dies irgendwo offiziell dokumentiert?
Angelos Asonitis
1
@AgelosAssonitis Dieser LinuxJournal-Artikel aus dem Jahr 2006 könnte interessant sein. Es verweist auf einige Quelldateien im Linux-Kernel-Quellbaum, die Sie möglicherweise anzeigen möchten. Ich bin kein Linux-Benutzer, daher kann ich nicht sagen, ob diese Dateien noch in der neuesten Version
Kusalananda
Interessanter Artikel! Ich schaue nur in das procps-Paket, um zu sehen, ob der Befehl top tatsächlich seinen Wert aus der Datei / proc / loadavg bezieht und ob dies dasselbe ist wie das Ergebnis der Funktion getloadavg ().
Angelos Asonitis
@AgelosAssonitis Der definitive Ort für die Dokumentation von Lastdurchschnitten ist Ihr Kernel-Quellbaum. POSIX definiert nicht die CPU-Auslastung und erwähnt nirgendwo die Worte "Auslastungsdurchschnitt". Die Dienstprogramme topund uptimesind keine POSIX-Dienstprogramme, und die getloadavg()Bibliotheksfunktion ist auch in POSIX nicht definiert (es gibt jedoch eine BSD-Linie).
Kusalananda
Soweit ich weiß, gibt es keine offizielle Dokumentation, um die Bildung dieser Werte zu verstehen, außer der Kernelquelle selbst. Ist das richtig? Bevor ich dort topankomme , muss ich noch den Wert in die procfs-Datei loadavg einbinden ...
Angelos Asonitis
7

Der Lastdurchschnitt wird normalerweise vom Kernel berechnet. Anwendungen wie topund uptimekönnen den getloadavg(3)Bibliotheksaufruf verwenden, um darauf zuzugreifen (er soll für verschiedene Unix-Versionen portierbar sein). Unter Linux führt dies normalerweise zu einem Lesen von /proc/loadavg. Unter FreeBSD ist es ein Systemaufruf.

Beispielsweise:

#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]);
}

uptimeund topbeide führen ähnliche Anrufe durch, um ihre Daten zu erhalten.

Jetzt sind die Lastmittelwerte von 1/5/15 Minuten die Anzahl der Prozesse in der Ausführungswarteschlange. Unterschiedliche Betriebssysteme können dies auf unterschiedliche Weise berechnen. Der größte Unterschied besteht normalerweise darin, ob Prozesse, die auf E / A warten (z. B. auf der Festplatte blockiert), als ausführbar gelten oder nicht. Unter Linux sind sie.

Ein Lastdurchschnitt von 3,4 bedeutet also, dass sich durchschnittlich 3,4 Prozesse in der Ausführungswarteschlange innerhalb des Beispielfensters befanden (1, 5, 15 Minuten).

Ein hoher Lastdurchschnitt bedeutet jedoch nicht unbedingt einen überlasteten Server. Wenn Sie 16 Kerne haben, kann Ihr Lastdurchschnitt 16 ohne Stress betragen. Es können auch viele Anwendungsaufrufe auftreten fork(), die dazu führen können, dass eine große Anzahl von Prozessen erstellt / zerstört wird, was zu einem hohen Auslastungsdurchschnitt führt, ohne jedoch die Serverleistung massiv zu beeinträchtigen. Es sollte nur als Leitfaden verwendet werden, zusammen mit anderen Metriken wie% CPU beschäftigt.

Stephen Harris
quelle
4

Der Lastdurchschnitt ist nicht spezifisch für ein bestimmtes Tool oder eine bestimmte Verteilung, sondern eine vom Kernel bereitgestellte Messung, genauer gesagt der Scheduler. Daher handelt es sich um eine verteilungsunabhängige Messung. Die Messung wird im proc-Dateisystem aufgezeichnet/proc

Bei der Interpretation gibt die durchschnittliche Auslastungsmetrik nicht an, wie hart die CPU arbeitet, sondern wie viel Arbeit erledigt werden muss. Ich glaube nicht, dass es wirklich notwendig ist, es mit irgendetwas zu multiplizieren, da es eine direkte Messung der Anzahl von Prozessen in einem ausführbaren oder unterbrechungsfreien Zustand ist.

Schauen Sie sich die folgenden zwei Manpages an: getloadavg(3)und uptimefür weitere Informationen.

Die Metrik der durchschnittlichen Last kann zunächst ein schwer zu verstehendes Konzept sein. Ich denke, viele Leute denken, dass dies ein Hinweis darauf ist, wie hart die CPU arbeitet, aber das ist es nicht wirklich.

pmyjavec
quelle
1
Ok, aber sind wir absolut sicher, dass der in der getloadavg()Funktionsbeschreibung beschriebene topLastdurchschnitt der gleiche Lastdurchschnitt ist, den der Befehl in rhel anzeigt? Ich frage dies, weil ich eine Volltextsuche im nicht geteerten Inhalt des Pakets procps-3.2.8 (was durch den Befehl angezeigt wird top -v) durchgeführt habe und die Funktion getloadavg () nicht einmal erwähnt wird! Also, vielleicht berechnet top den Lastdurchschnitt auf eine andere Art ...
Angelos Asonitis