Prozessorlast Raspberry

Hallo Leute,

ich lese mit dem folgenden Skript die Daten meines aktuellen Raspberry (4-Kern Prozessor) aus:

<?
$CatID = IPS_GetCategoryIDByName("Raspberry Pi", 0);

$varid = CreateVariableByName($CatID, "CPU-Temperatur", 2, "~Temperature");
SetValueFloat($varid, (float)substr(exec('vcgencmd measure_temp'), 5, 4));

$varid = CreateVariableByName($CatID, "CPU-Auslastung", 2, "~Humidity.F");
SetValueFloat($varid, 100 - (float)(exec('top -b -n2 -d1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/"')));

$varid = CreateVariableByName($CatID, "CPU-Spannung", 2, "~Volt");
SetValueFloat($varid, (float)substr(exec('vcgencmd measure_volts'), 5, 6));

$varid = CreateVariableByName($CatID, "CPU-Frequenz", 1);
SetValueInteger($varid, (int)substr(exec('vcgencmd measure_clock arm'), 14, 9)/1000000);

return;

function CreateVariableByName($fatid, $name, $type, $profile = "")
{
    $vid = @IPS_GetVariableIDByName($name, $fatid);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $fatid);
        IPS_SetName($vid, $name);

        if($profile !== "")
        {
            IPS_SetVariableCustomProfile($vid, $profile);
        }
    }
    return $vid;
}
?>

Die Werte liegen an dem meisten Tagen bei über 90 %!
Es gibt aber auch Tage wo sie bei max. 10 % liegt.

Ist das Skript so in Ordnung auch für die aktuelle Raspberry Verion?

Kann man ermitteln aus welchem Grund die Last so stark schwankt?

Gruß

Axel

Moin Axel!

Wenn du dich am Raspberry auf der Console einloggst, dann kannst du mit dem Befehl „top“ dir den „Task Manager“ anzeigen lassen und dort beobachten welche Prozesse wie viel CPU und RAM „verbrauchen“.

Gleichzeitig vlt. die IPS-Console in der Meldungen-Ansicht offen lassen und schauen, ob sich da bestimmte Dinge/Aufgaben „decken“…

Grüße,
Chris

Hallo Chris,

die Auslastung unter „top“ auf der Console geht bis max. 14 % hoch, obwohl die Anzeige in IPS zwischen 90 % und 100 % schwankt.

Gruß

Axel

Gib doch mal in der Console beim Raspberry den Befehl aus dem Skript ein, keine Ahnung wie genau der das damit formatiert/anzeigt:
top -b -n2 -d1 | grep „Cpu(s)“ | sed „s/., ([0-9.])% id.*/\1/“

Oder auch nur mal so:
top -b -n2 -d1 | grep „Cpu(s)“

Oder so:
top -b -n2 -d1

…vlt. wird da was falsch geparsed mit dem Befehl!? Oder es wird ein anderer Wert genommen als der Wert den du meinst?!

-Chris-

Hallo Chris,

die erste Abfrage gibt folgendes Ergebnis:

IPS3.JPG

die zweite Abfrage:

IPS2.JPG

die dritte Abfrage:

Axel

Was mache die 100-?
100 - Cpuleistung = 90% Auslastung? Leerlauf?

In Linux „top“ command what are us, sy, ni, id, wa, hi, si and st (for CPU usage)? - Unix & Linux Stack Exchange

id: idle cpu time (or) % CPU time spent idle

Also müsste bei 100 - 97,7 = 2,3% CPU Auslastung sein (Core 1). Aber deine Skript-Abfrage holt sich nur den Wert nach dem Komma, wenn ich das richtig sehe… Und deshalb die dauerhaft zu hohe -angebliche- Auslastung.

Die Linux Expressions liegen mir leider nicht so, ich wüsste nur, wie man den Wert mit preg_match parsen kann :slight_smile:
preg_match(’|.ni,.(.)\sid|’, $string, $match);
…musst du selbst mal ein wenig probieren oder nach einem aktuellen Befehl googeln, um die CPU Auslastung richtig zu parsen.

Zusätzlichen Kram zum Auslesen:
LOAD
cat /proc/loadavg

RAM frei
free | grep Mem | awk ‚{print $3}‘

Gruß,
Chris

Hallo Chris,

in dem von mir verwendeten Skript gibt es folgende Zeile:

SetValueFloat($varid, 100 - (float)(exec(‚top -b -n2 -d1 | grep „Cpu(s)“ | sed „s/., ([0-9.])% id.*/\1/“‘)));

jetzt frage ich mich ob „100 -“ an dieser Stelle richtig ist. Für mich sieht es so aus, dass hier die aktuelle Last von 100 abgezogen wird, d.h. bei tatsächlicher Last von 8 % erhalte ich einen angezeigten Wert von 92 %.

Axel

Ist recht einfach:

[ol]
[li]Fehler ist das der Regex auf Punktnotation geht aber garnicht gesichert ist, dass das verwendete Locale überhaupt Punktnotation verwendet.
[/li][li]Fehler ist das „top“ im Batchmodul mit einer Iteration von 2 gestartet wird. Dadurch gibt es 2 Zeilen die zusammen gesetzt werden.
[/li][/ol]

Meiner Meinung nach sollte das so aussehen.

SetValueFloat($varid, 100 - (float)(exec('LANG=C top -b -n1 -d1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/"')));

Aber so richtig clever ist die Abfrage nicht, da durch die Abfrage die CPU kurz aufgeweckt wird und zu einer höheren Auslastung führt was dann die Auslastung nicht gut wieder spiegelt. Daher verwendet mal oft lieber werte wie LoadAvg oder man errechnet die Auslastun über /proc/stat und rechnet das anders aus.