Hallo,
ich habe auf einem meiner raspi ein Problem mit der AvrageLoad -> sie wird mit 98,9% angezeigt, auf des Systemebene (top) aber ist Idle eher bei 93%.
Einige Nachforschungen haben mich zu folgendem Ergebnis gebracht
Ergebnis von /proc/stat:
$ cat /proc/stat
cpu 206533642 0 20558983 4115921835 2607214 0 509538 0 0 0
cpu0 52997304 0 6498842 1023475106 759411 0 484767 0 0 0
cpu1 52116612 0 4799002 1030051292 615143 0 8493 0 0 0
cpu2 51783360 0 4696650 1030089283 580442 0 8075 0 0 0
cpu3 49636366 0 4564489 1032306154 652218 0 8203 0 0 0
intr 11770643452 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3979400020 0 0 0 0 0 6047491 1582094 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 8035321 0 0 208 0 0 0 0 0 0 0 3111507602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6500440 4798 0 0 0 0 5308 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 25350219112
btime 1521912669
processes 8728999
procs_running 1
procs_blocked 0
softirq 1999131084 258992487 538805835 2176553 133463509 9693443 0 227854042 441354977 0 386790238
ich habe mir die Berechnungen ausgeben lassen
4115613319+2607159 => Idle=2150090806
206516081+0+20557279+0+509441+0 => NonIdle=227582801
Total=2377673607, Idle=2150090806, TotalDiff=230189960, IdleDiff=2607159, CPU_Usage=0,9886738804768
Idle sieht ja merkwürdig aus
Sicherheitshalber haben ich das mit bc nachgerechnet
4115613319+2607159
4118220478
206516081+0+20557279+0+509441+0
227582801
Und dann habe ich mit die Zahlen mal angeschaut => das ist ein Überlauf. 4115613319 ist größer als die maximale Integer von 2147483647 (siehe hier).
Dann habe ich mal die intval durch floatval ersetzt und mit einem Testscript geprüft:
<?
$LineOneArray = [ "206488908", "0", "20554736", "4115158297", "2607067", "0", "509315", "0", "0", "0" ];
echo "INTVAL
";
// Idle = idle + iowait
$Idle = intval($LineOneArray[3]) + intval($LineOneArray[4]);
echo "3=$LineOneArray[3], 4=$LineOneArray[4] => Idle=$Idle
";
// NonIdle = user+nice+system+irq+softrig+steal
$NonIdle = intval($LineOneArray[0]) + intval($LineOneArray[1]) + intval($LineOneArray[2]) + intval($LineOneArray[5]) + intval($LineOneArray[6]) + intval($LineOneArray[7]);
echo "0=$LineOneArray[0], 1=$LineOneArray[1], 2=$LineOneArray[2], 5=$LineOneArray[5], 6=$LineOneArray[6], 7=$LineOneArray[7] => NonIdle=$NonIdle
";
// Total = Idle + NonIdle
$Total = $Idle + $NonIdle;
echo "Total=$Total
";
echo "FLOATVAL
";
// Idle = idle + iowait
$Idle = floatval($LineOneArray[3]) + floatval($LineOneArray[4]);
echo "3=$LineOneArray[3], 4=$LineOneArray[4] => Idle=$Idle
";
// NonIdle = user+nice+system+irq+softrig+steal
$NonIdle = floatval($LineOneArray[0]) + floatval($LineOneArray[1]) + floatval($LineOneArray[2]) + floatval($LineOneArray[5]) + floatval($LineOneArray[6]) + floatval($LineOneArray[7]);
echo "0=$LineOneArray[0], 1=$LineOneArray[1], 2=$LineOneArray[2], 5=$LineOneArray[5], 6=$LineOneArray[6], 7=$LineOneArray[7] => NonIdle=$NonIdle
";
// Total = Idle + NonIdle
$Total = $Idle + $NonIdle;
// Differenzen berechnen
echo "Total=$Total
";
Ergebnis
INTVAL
3=4115158297, 4=2607067 => Idle=2150090714
0=206488908, 1=0, 2=20554736, 5=0, 6=509315, 7=0 => NonIdle=227552959
Total=2377643673
FLOATVAL
3=4115158297, 4=2607067 => Idle=4117765364
0=206488908, 1=0, 2=20554736, 5=0, 6=509315, 7=0 => NonIdle=227552959
Total=4345318323
das sieht besser aus.
Nun nähert sich der Wert der Realität an mit 10,4% - passt zwar nicht ganz zu den Werten von Top
%Cpu(s): 6,6 us, 1,5 sy, 0,0 ni, 91,9 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
aber das ist ja nicht 100% zu der gleichen Zeit (so fix kann ich auch nicht tippen).
Da ich das aber natürlich das Modul nicht zu 100% durchblicke bin ich mir nicht sicher, ob meine Interpretation richtig ist.
Wenn Du magst kann ich ein PR machen.
Gruß
demel