Unerklärliche hohe CPU-Auslastung nach längerer Laufzeit

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Community,

    dies ist mein erster Beitrag hier. Ich bin "Senior"-Programmer und beschäftige mich beruflich erst seit ein paar Jahren mit Linux.

    Bei einem aktuellen Projekt mit einem Raspberry PI passiert nach längerer Betriebszeit (mehrere Tage, so ca. 10) ein für mich unerklärlicher Effekt. Die CPU-Auslastung geht dauerhaft von knapp 2% auf ca. 70% hoch und verharrt dort bis zum nächsten "Reboot". Es handelt sich dabei um einen "Raspberry Pi 3 Model B Plus Rev 1.3" aufgesteckt auf eine selbst layoutete Platine.

    Das Image auf der SD-Karte ist ein Raspian-lite (Buster oder Stretch), wo nachträglich nur Samba, FTP, Apache2, etc. (was man so braucht) installiert wurde. Die projekt-bezogene Applikation ist eine einfach Anwendung, die mit QT5 erstellt wurde. Im Dateianhang findet ihr 3 Screenshots, wovon:

    - EM4_3.png die Prozess-Übersicht von "top" direkt nach einem "Reboot" zeigt (die 15-Min-CPU-Auslastung liegt hier noch bei 7%, geht aber später noch weiter herunter)

    - EM4_2.png einen Mitschrieb von 48h von CPU-Temp. und CPU-Load (15-Min.-Intervall) zeigt. Das Diagramm läuft zeitlich von rechts nach links!

    - EM4_1.png die Prozess-Übersicht von "top" nach dem Hochschnellen der CPU-Auslastung zeigt. Die Prozess-Auslastung (ca. 5%) der selbst-geschriebenen Applikation EM4000 hat sich nicht geändert! Der Effekt trat hier ca. 10 Tage nach dem letzten Reboot auf (wie in der Kopfzeile von "top" erkennbar)

    Den 15-Min.-CPU-Auslastungs-Wert liest die Applikation mittels Kernel-Funktion "getloadavg()".

    Wie kann ich feststellen, was hier der Grund für diese plötzliche CPU-Auslastungs-Erhöhung sein?

    Mein Eindruck ist, dass hier eine fehlerhafter Wert aus dem Kernel kommt, denn die CPU-Temperatur steigt nicht signifikant an, was ich bei höherer CPU-Auslastung erwartet hätte?

    Die CPU-Temperatur extrahiere ich übrigens aus der Datei "/sys/class/thermal/thermal_zone0/temp".

  • Unerklärliche hohe CPU-Auslastung nach längerer Laufzeit? Schau mal ob du hier fündig wirst!

  • Ich verstehe ehrlich gesagt nicht, wie du auf die angebliche Auslastung von 70% kommst.

    Die beiden top-Screenshots zeigen beidesmal eine CPU-Idle von ca. 98%

    Findest du in der 3. Zeile von oben unter deinem roten Rahmen.

    Meine Pis

    Pi B Rev 2 24/7 - DHCP-Server im Heimnetz
    Pi 2B Rev 1.1 Home-Infocenter (Domoticz) - Kamera auf Garten
    Pi 2B Rev 1.1 Testgerät mit USV, Musikplayer, Kodi,
    Pi 3B Rev 1.2 Videos aus Netzwerk (an Rückseite des TV moniert)
    Pi 3B+ Rev 1.3 mit 3.5-TouchDisplay, Peppy-Web-Radio
    Pi 4B - 4GB Rev 1.1 Testgerät - Argon-ONE-Gehäuse

    Pi Zero Testgerät

    Pi Zero W Rev 1.1 Motion-Eye auf Garten

  • Moin zusammen,

    einen neuen Screenshot vom "Fehlerzustand" kann ich erst wieder machen, wenn er auftritt. Unten habe ich aber mal einen aktuellen Screenshot nach Drücken von "1" gemacht, wo man erkennen kann, dass die CPU-Auslastung (oben rechts in rot eingerahmt) bei 0,00 0,05 0,01 (also 0%, 5%, 1% => 1 Min.-, 5 Min.- und 15 Min.-Intervall) liegt.

    Im "Fehlerfalle" sind es (siehe Screenshot EM4_1.png) => 0,82 0,79 0,75 also 82%, 79% und 75%, oder nicht?

    Wie gesagt, ich bin noch relative Laie in Linux und hatte gedacht, dass die Werte hinter "load average" der CPU-Auslastung entsprechen, die man auch per "getloadavg()" auslesen kann?

    Mache ich einen Denkfehler?

  • Hallo allerseits,

    ich bin ein wenig enttäuscht über die wenigen Reaktionen hier :(

    Ich dachte, hier tummeln sich Linux-Cracks, die seit Jahrzehnten ;) den ganzen Tag nichts anderes als Linux programmieren?

    Ich erwarte nicht unbedingt sofort eine Lösung, aber einen Lösungsweg bzw. Rückfragen, Hinweise auf Diagnose-Tools, etc.

    Oder muss ich mich in Geduld üben, da nicht jeder hier täglich online ist?

    Grüße

    Peter

    • Offizieller Beitrag

    einen neuen Screenshot vom "Fehlerzustand" kann ich erst wieder machen, wenn er auftritt.

    Ohne ohne im "Fehlerfall" die tatsächliche Auslastung der einzelnen CPUs zu sehen, kann man imho nicht viel dazu sagen.

  • ..., Hinweise auf Diagnose-Tools, etc.

    Z. B. zeige auch die Ausgaben von:

    Code
    mpstat -P ALL
    sar -u ALL 5

    von deinem PI, wenn er hohen CPU-Verbrauch hat.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Hi allerseits,

    ich wollte mich mal wieder melden, aber leider ohne weiteres Auftreten des Effektes. Jetzt läuft die Kiste schon über 3 Wochen mit einer Durchschnitts-CPU-Last von 1% (wie es soll).

    Es ist zum verrückt werden, wenn man drauf wartet, passiert es nicht :(

    Grüße

    Peter

  • Sooooooooooooo, jetzt ist der Effekt doch endlich wieder aufgetreten und die Ausgabe von "top 1" erbrachte ein erstaunliches :huh: Ergebnis (siehe Screenshots).

    Alle vier "CPU"s liegen bei einer Auslastung von unter 1% und trotzdem zeigt Linux eine Gesamt-Auslastung von über 70%.

    Da ich auch nicht wirklich das Gefühl habe, die Rechenleistung der Himbeere hätte sich großartig geändert, scheint es sich hier um eine Fake-Auslastung zu handeln, oder?

    Kann das ein Fehler im Kernel sein?

  • Hallo PeterLinux,

    es handelt sich wohl um eine Fehlinterpretation deinerseits bzgl. der Angabe zu LoadAverage. Zum Betriebssystem Linux gibt es da einige recht gute Seiten, die Dich da mit Informationen versorgen.

    Für mich besagen Deine Angaben, dass Dein RPi im Schnitt für über 20 % mit Nichtstun (Idle) beschäftigt ist. Und das in der letzten, in den letzten 5 und den letzten 15 Minuten.

    Auch Werte über 1 sind nicht schlimm, denn diese werden so interpretiert, dass z.B. bei einem LoadAverage von 2 genau 1 Prozess auf irgendwas wartet (I/O, CPU, ...). Bei Deinen 133 laufenden Prozessen ist 1 wartender Prozess annähernd "gar nichts".

    Bei einem System wie Deinem (mit 4 CPU-Kernen) sieht die Interpretation anders aus. Da musst Du die LoadAverage-Angabe durch die Anzahl Deiner CPU-Kerne dividieren. Das macht dann knapp 20 % Auslastung und über 80 % Nichtstun (Idle). Bei 4 CPU wäre demnach alles bis zu einem LoadAverage von 4 akzeptabel - wenn auch recht schwer zu erreichen. Denn dazu müsstest Du auf jeder CPU eine Aufgabe (Programm) so laufen lassen, dass 100% der CPU beansprucht werden. Kann man so programmieren, ist aber schlechte Praxis. Jede Schleife im EventHandler hat eine Verzögerung, durch die die Auslastung "gedämpft" wird - oder sollte eine solche Verzögerung haben.

    Die anderen mehr systembedingten Programme laufen im Hintergrund des Betriebssystems und verursachen in Summe selten mehr als 2 bis 4 % der CPU-Last.

    Was vermutest Du, sei das Problem und seine Auswirkung nun genau?


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    4 Mal editiert, zuletzt von Andreas (7. November 2021 um 11:45)

  • Mich würde eher beunruhigen, dass der Hauptspeicher langsam aufgefressen wird und nach 25 Tagen schon in den Swapbereich reicht. Weitere 1 - 2 Wochen und der Pi bleibt stehen.

    Servus !

    @TO: Die weiteren (gerade schlafenden) Prozesse (Pfeil dowm Taste) zeigem keine Auffälligkeiten ?

    RTFM = Read The Factory Manual, oder so

  • Weitere 1 - 2 Wochen und der Pi bleibt stehen.

    Bei 803.3 Buff/Cache eher unwahrscheinlich.

    Dass swap genutzt wird, ist wahrscheinlich auf die default swappiness von 60 zurückzuführen. Nichts beunruhigendes.

    Wenn du nichts zu sagen hast, sag einfach nichts.

    2 Mal editiert, zuletzt von llutz (7. November 2021 um 15:43)

  • Was vermutest Du, sei das Problem und seine Auswirkung nun genau?

    Hallo Andreas,

    danke für deine ausführliche Antwort, aber so ganz verstanden habe ich alles nicht.

    Ob der "LoadAverage" nun über "alles" oder nur pro CPU-Kern gilt, ist ja eigentliche erst mal egal. Es geht ja nicht um den absoluten Wert, sondern um den schlagartigen Wechsel von einem Niveau auf ein anderes.

    Mein System läuft zwei bis drei Wochen friedlich bei 1% LoadAverage und springt dann plötzlich auf 75% und verharrt dort bis zum nächsten Reboot.

    Neben dem Kernel läuft nur meine C++-QT-Applikation, die zyklisch jede Minute (oder Vielfache davon) Daten speichert (Datensammler).

    Den Hinweis von RTFM finde ich aber spannend. Auf den Speicherverbrauch bzw. der Speicherauslagerung hatte ich bisher im Dateil noch nicht geachtet. Zwar zeigt meine "Freier RAM-Speicher" konstant um die 80% an, aber vielleicht ist eine Art Fragmentierung des RAMs die Ursache für die plötzliche Mehrarbeit der CPU? Vielleicht wird diese "Arbeit" nicht in "top" angezeigt und findet nur irgendwo im Hintergrund von Linux statt?

    Nach dem Reboot ist der RAM-Speicher ja wieder "jungfräulich" und alles fängt wieder von vorne an!

    Ich prüfe mal meine Applikation auf das Speicher-Handling. Vielleicht kann ich da etwas ändern, was diesen Effekt nicht mehr auftreten lässt...

    Grüße

    Peter

  • ... Hintergrund von Linux statt?

    Gib mal:

    Code
    sudo sysctl -w vm.swappiness=1

    und schreib/ergänze die Zeile:

    Code
    vm.swappiness = 1

    in die Datei "/etc/sysctl.conf

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • In deinem top-Screenshot siehst du, dass lediglich 94MB aktiv genutzt werden und 803MB für Buffer/Cache. Die 803MB würden Anwendungen sofort zur Verfügung stehen, sofern es benötigt wird. Freier (unbenutzter) Speicher ist vergeudeter Speicher!

    Du hast definitiv kein volllaufenden Speicher, bzw. lässt sich ein solcher nicht aus obigem top-Screenshot herauslesen.

    Wenn du nichts zu sagen hast, sag einfach nichts.

    Einmal editiert, zuletzt von llutz (7. November 2021 um 17:30)

  • Ein ganz hervorragender Eintrag zur Historie und Interpretation des Load-Wertes:

    https://www.brendangregg.com/blog/2017-08-0…d-averages.html

    Und hier eine Betrachtung "seltsamer" Load-Peaks, die sich aus den mathematischen Berechnungsformeln ergeben:

    https://blog.avast.com/investigation-…s-every-7-hours

    Büssel was zu lesen, noch härter zu verdauen, aber ausgesprochen aufschlußreich :) Vielleicht auch Erklärungen für dein Phänomen in den beiden Artikeln?

    Grüße

    ghmartin77

  • Moin zusammen,

    ich habe heute morgen wie von rpi444 angeregt mal das "sysstat"-Paket installiert und "mpstat -P ALL" und "sar -u ALL 5" ausgeführt. ScreenShot siehe Anlage.

    Ich finde dort keine anderen weiterführende Infos, außer das dort - wie bei "top" - die CPU-Auslastung bei wenige Prozent liegt (idle > 98%), was m.E. auch stimmen muss.

    Daher jetzt die Frage: Wie kann ich aus meiner Applikation den Wert für "idle" (wie bei "mpstat" und "sar") ermitteln?

    Ich würde dann einfache meine angezeigte CPU-Auslastung in % aus "100% - %idle" errechnen und "loadavg" ignorieren.

  • Moin allerseits,

    HEUREKA, ich habe die Ursache durch Zufall gefunden!!!!

    Ich hatte das System ja jetzt nicht neu gestartet und es wurden weiterhin immer noch die hohe Auslastungen angezeigt.

    Heute wollte ich dann eine Programmänderung kompilieren und stelle fest, dass die Verbindung zu meinem Entwicklungs-PC nicht mehr funktioniert :huh:

    Ich hatte dazu den NFC-Client installiert, der mir den Zugriff auf mein Windows-Laufwerk erlaubte.

    Ich habe dann: "systemctl restart nfs-client.target" ausgeführt und schon nach wenigen Sekunden ging die CPU-Auslastung herunter :)

    Da dieser Dienst nur für Entwicklungs-Tätigkeiten benötigt wird, habe ich ihn erst mal "disabled" und starte ihn dann bei Bedarf.

    Sachen gibbet ;)

    Grüße

    Peter

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!