Layer 8Ehrlicher Tech-Support
BetriebssystemSchweregrad: Lästig

Linux: Load Average hoch, aber die CPU langweilt sich

uptime meldet eine Last von 8, top zeigt die CPU fast im Leerlauf? Die Last zählt auch Prozesse, die auf Festplatte oder Netzlaufwerk warten.

Aufwand:
ca. 20 Min.
Voraussetzung:
Ein Terminal, uptime und ps aus procps-ng, nproc aus GNU coreutils
Gilt für:
Linux (proc_loadavg(5) aus Linux man-pages 6.19; uptime(1) und ps(1) aus procps-ng; nproc(1) aus GNU coreutils)

Das Symptom

Das Monitoring schlägt Alarm, oder ein Kollege schaut zufällig auf die Kopfzeile von top: load average 8, 9, 7. Auf einem Server mit vier Kernen klingt das nach brennender Hütte. Also wird top geöffnet, um den Schuldigen zu finden, und dort ist nichts. Die CPU-Auslastung steht bei ein paar Prozent, kein Prozess frisst Rechenzeit, die Lüfter drehen gelangweilt. Trotzdem fühlt sich das System zäh an: Ein ls im falschen Verzeichnis hängt, ein Dateidialog braucht ewig, die Anmeldung per SSH dauert.

Die naheliegende Deutung lautet, die Anzeige sei kaputt, oder irgendwo laufe heimlich ein Prozess, den top nicht zeigt. Daraus folgen die üblichen Reflexe: neu starten, mehr Kerne beantragen, wahllos Dienste beenden.

Die „Layer 8“-Wahrheit

Die Anzeige ist nicht kaputt, sie misst nur etwas anderes, als man glaubt. Die Load Average ist keine CPU-Auslastung in Prozent. proc_loadavg(5) definiert die ersten drei Werte in /proc/loadavg als Mittelwerte der „number of jobs in the run queue (state R) or waiting for disk I/O (state D)“. Gezählt werden also zwei Gruppen: Prozesse, die rechnen oder rechnen wollen, und Prozesse, die auf ein Gerät warten. uptime(1) beschreibt die zweite Gruppe unmissverständlich, ein Prozess in diesem Zustand „is waiting for some I/O access, eg waiting for disk.“

Damit löst sich der scheinbare Widerspruch auf. Hängt ein Netzlaufwerk, stockt eine externe Platte oder schreibt eine Sicherung gegen ein langsames Ziel, sammeln sich Prozesse im Zustand D. Sie verbrauchen keine Rechenzeit, deshalb sieht top die CPU im Leerlauf. Sie zählen aber zur Last, deshalb steht dort eine 8. Beide Anzeigen stimmen. Wer nur auf die CPU-Spalte schaut, sucht den Täter im falschen Raum.

Die zweite Falle steckt in der Zahl selbst. uptime(1) schreibt: „Load averages are not normalized for the number of CPUs in a system“. Eine Last von 1 heißt auf einem Rechner mit einem Prozessor Dauerbetrieb, auf einem mit vier laut derselben Seite, dass er drei Viertel der Zeit nichts zu tun hatte. Ohne die Zahl der Recheneinheiten daneben, die nproc liefert, ist jede Lastangabe ein Bruch ohne Nenner.

Die Diagnose dauert deshalb nur ein paar Minuten, wenn man die richtige Frage stellt: nicht wie hoch die Last ist, sondern woraus sie besteht. ps zeigt für jeden Prozess seinen Zustand. Viele D bedeuten Warten auf Ein- und Ausgabe, und dann hilft kein Prozessor der Welt, sondern nur der Blick auf Laufwerk, Verbindung oder den Sicherungsauftrag, der gerade zur falschen Zeit läuft. Viele R bedeuten, dass wirklich gerechnet wird, und erst dann ist die Frage nach mehr Kernen eine vernünftige.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Die Zahlen lesen, bevor jemand handelt

    uptime zeigt Uhrzeit, Laufzeit, angemeldete Benutzer und die drei Mittelwerte der Last über 1, 5 und 15 Minuten. /proc/loadavg enthält dieselben drei Werte plus die Zahl der gerade lauffähigen Prozesse und Threads. Wer beides nebeneinander sieht, weiß, ob die Last steigt oder abklingt, und ob gerade überhaupt viele Prozesse lauffähig sind oder ob die Zahl von etwas anderem kommt.

    uptime
    cat /proc/loadavg
    
  2. 2.

    Mit der Zahl der Prozessoren vergleichen

    Die Last ist laut uptime(1) nicht auf die Zahl der Prozessoren umgerechnet. Eine Last von 8 bedeutet auf einem Rechner mit acht Recheneinheiten etwas völlig anderes als auf einem mit zwei. nproc gibt aus, wie viele Recheneinheiten dem aufrufenden Prozess zur Verfügung stehen; mit --all zählt es alle installierten Prozessoren, ohne Kontingente zu berücksichtigen. Erst mit dieser Zahl im Kopf wird aus der Last eine Aussage.

    nproc
    nproc --all
    
  3. 3.

    Prozesse im Zustand D suchen

    ps kann den Zustand jedes Prozesses ausgeben; ps(1) führt die Kürzel auf, D steht für uninterruptible sleep, in Klammern mit dem Zusatz usually I/O, R für running or runnable. Stehen in der Liste viele Prozesse mit D, sitzt die Last nicht an der CPU, sondern an einem Gerät, auf das gewartet wird. Stehen dort viele mit R, ist die CPU tatsächlich der Engpass. Die Ausgabe zeigt PID und Programmnamen, damit klar wird, wer wartet.

    ps -eo state,pid,comm | grep '^D'
    ps -eo state,pid,comm | grep '^R'
    
  4. 4.

    Den Grund des Wartens eingrenzen

    Die Programmnamen der wartenden Prozesse verraten meist, woran es hängt: ein Sicherungsprogramm, das auf ein Netzlaufwerk schreibt, ein Indexdienst auf einer externen Platte, ein Kopiervorgang auf einen USB-Stick. Hängt ein Netzlaufwerk oder eine Platte antwortet langsam, steigt die Last, ohne dass mehr gerechnet wird. Dann gehört die Aufmerksamkeit der Verbindung, dem Laufwerk oder dem Zeitplan des Sicherungsauftrags, nicht dem Prozessor.

  5. 5.

    Keine CPU-Maßnahmen gegen ein Wartezimmer

    Wer eine hohe Last sieht und sofort mehr Kerne bestellt, Prozesse abschießt oder Prioritäten verstellt, behandelt das falsche Problem, solange die Last aus Prozessen im Zustand D besteht. Mehr Rechenleistung verkürzt keine Wartezeit auf eine Festplatte. Erst wenn die Liste überwiegend lauffähige Prozesse zeigt und die Last dauerhaft über der Zahl der Recheneinheiten liegt, ist die CPU der Engpass, und dann lohnt der Blick darauf, welches Programm rechnet.

Häufige Fragen (FAQ)

?Ist eine Load Average von 4 viel?

Das hängt von der Zahl der Prozessoren ab, und genau das vergessen die meisten. Die Handbuchseite uptime(1) sagt es ausdrücklich: „Load averages are not normalized for the number of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time.“ Eine 4 ist auf einem Rechner mit einem Kern Dauerstau, auf einem mit sechzehn Kernen Gemütlichkeit. Wie viele Recheneinheiten dem eigenen Prozess zur Verfügung stehen, sagt nproc.

?Warum zählt ein Prozess mit, der nur wartet?

Weil die Zahl so definiert ist. proc_loadavg(5) beschreibt die ersten drei Felder von /proc/loadavg als Mittelwerte der „number of jobs in the run queue (state R) or waiting for disk I/O (state D)“. uptime(1) erklärt beide Gruppen: Ein Prozess im lauffähigen Zustand rechnet oder wartet auf die CPU, einer im nicht unterbrechbaren Zustand „is waiting for some I/O access, eg waiting for disk.“ Ein Prozess, der an einer hängenden Platte oder einem langsamen Netzlaufwerk wartet, treibt die Last also hoch, ohne eine einzige Rechenoperation auszuführen.

?Was bedeuten die drei Zahlen hinter load average?

Es sind Mittelwerte über 1, 5 und 15 Minuten; uptime(1) nennt genau diese drei Zeiträume. Daraus lässt sich eine Richtung ablesen: Liegt der Wert für eine Minute deutlich über dem für fünfzehn, ist die Last gerade erst gestiegen; liegt er darunter, klingt sie ab. /proc/loadavg trägt laut proc_loadavg(5) dahinter noch zwei Angaben: die Zahl der gerade lauffähigen Prozesse und Threads samt der Gesamtzahl, getrennt durch einen Schrägstrich, und die PID des zuletzt erzeugten Prozesses.

?Zeigen uptime, top und /proc/loadavg dasselbe?

Für die Last ja. proc_loadavg(5) schreibt über die drei Werte in /proc/loadavg: „They are the same as the load average numbers given by uptime(1) and other programs.“ uptime(1) wiederum verweist darauf, dass dieselben Angaben in der Kopfzeile von w(1) stehen. Unterschiedliche Werkzeuge widersprechen sich hier also nicht; sie lesen dieselbe Quelle. Der Widerspruch, der Leute verunsichert, liegt woanders: zwischen der Last und der CPU-Auslastung, und die messen zwei verschiedene Dinge.

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Auch zu finden unter

Verwandte Fehler

OSLästigheld broken packages

apt: held broken packages

apt bricht wegen kaputter Abhängigkeiten ab? Meist kollidieren Paketquellen oder eine halbe Installation blockiert — mit klaren Wegen heraus.

OSLästigArgument list too long

bash: Argument list too long

Der Befehl bricht mit 'Argument list too long' ab, weil ein * zu viele Dateien liefert. So löst du es mit find und xargs statt Globbing.

OSLästigcommand not found

cron-Job läuft nicht (leeres PATH)

cron führt deinen Job nicht aus oder meldet 'command not found'? cron startet mit fast leerem PATH. So findet der Job seine Programme wieder.

OSLästigFailed to download metadata for repository

dnf: Failed to download metadata for repository

dnf meldet 'Failed to download metadata for repository'? Unerreichbare Spiegel, fehlendes Netz oder ein totes Zusatz-Repo – so reparierst du es.

OSLästigGPG check FAILED

dnf: GPG check FAILED

dnf bricht mit 'GPG check FAILED' ab? Meist fehlt der neue Signaturschlüssel nach einem Repo- oder Versionswechsel. So importierst du ihn sauber nach.