vmstat funktioniert nicht

bananenBrot

Well-Known Member
Hi,
ich wollte über vmstat jede Minute die CPU Last greppen bis mir aufgefallen ist, dass vmstat (zumindest bei mir) scheinbar nicht funktioniert.

Code:
$ vmstat
 procs      memory      page                    disks     faults         cpu
 r b w     avm    fre   flt  re  pi  po    fr  sr md0 ad0   in   sy   cs us sy id
 3 0 0    247M  9980k    10   0   0   0    11   4   0   0 2012  100  198  1  0 99
 procs      memory      page                    disks     faults         cpu
 r b w     avm    fre   flt  re  pi  po    fr  sr md0 ad0   in   sy   cs us sy id
 1 0 0    247M  9784k    10   0   0   0    11   4   0   0 2012  100  198  1  0 99
 procs      memory      page                    disks     faults         cpu
 r b w     avm    fre   flt  re  pi  po    fr  sr md0 ad0   in   sy   cs us sy id
 1 0 0    233M    15M    10   0   0   0    11   4   0   0 2012  100  198  1  0 99

Wie man sehen kann, bleibt CPU Idle bei 99 obwohl im Hintergrund defintiv Last produziert wurde (kann man ja auch bei procs sehen)

Woran kann das liegen?

Gruß + danke!
 

bananenBrot

Well-Known Member
Wenn die 1 wirklich bedeutet, dass nur 1 Prozess läuft, dann ist da einiges mehr mit vmstat im Argen.
Es läuft ein apache, auf dem ein User (ich) wie bekloppt Seiten abgefragt hab während der "Messung"
 

döna

Well-Known Member
Kenn mich da net so aus, aber vom Prinzip her könnte es ja möglich sein,
dass Apache nur ein Prozess ist, welcher mehrere Threads hat.
Weiterhin wäre es wohl möglich, dass der Rest, also Seiten abfragen alles
um die CPU herum über DMA funktioniert.

Leider sind obiges nur Mutmaßungen und ich kann nichts genaueres dazu
sagen.
 

Yamagi

Possessed With Psi Powers
Teammitglied
Man muss da zwei Dinge sehen:

1. Prozessaccount unter FreeBSD war, ist und wir für immer problematisch bleiben, wenn Threads im Spiel sind. Es ist schon deutlich besser geworden, aber es gibt immer noch Randfälle wo einzelne Threads nicht mit einbezogen werden können. Das liegt einfach in der nun fast 35 Jahre alten Systemarchitektur begraben und wie schon in etlichen Diskussionen zu dem Thema festgestellt wurde, kann man keine endgültige, allgemeingültige Lösung finden, ohne wirklich üble Kompatiblitätsbrüche zu akzeptieren. Müssen wir halt mit leben, genau mit "200%" CPU-Last auf Dual-Core-Systemen. Dich wird es hier aber nicht beißen (ist eh unwahrscheinlich darauf zu treffen), da Apache keine Threads nutzt. Es arbeitet mit Forks.

2. Apache ist einfach sehr effizient (entgegen allem FUD) und moderne Prozessoren sind schnell. Um mehr als 2 bis 3 Prozent CPU-Last zu erzeugen, braucht es schon recht aufwändiger CGI-Scripte oder aber viel Gewalt in Form von entsprechend vielen Clients. Das gilt insbesondere dann, wenn nur statische Seiten ausgeliefert werden und sendfile() (was die Standardeinstellung ist) genutzt wird. Daher würde ich erst einmal kein generelles Problem sehen.
 

bananenBrot

Well-Known Member
In top war der httpd bei der Messung die ganze Zeit bei 11% aber das ist auch recht träge.
Aber tatsächlich - wenn ich yes laufen lasse, dann verändert sich die Anzeige in vmstat.
Mensch ist httpd effizient :D

Mensch das sind Probleme: "Meine CPU Auslastung ist zu niedrig"... Dass ich mal so Probleme äußere...
 

bananenBrot

Well-Known Member
Aha - ich hab mich doch nicht geirrt.
Jetzt hab Ichs.

Wenn ich vmstat aufrufe, kommt IMMER die Zeile mit 98% Idee (die erste Zeile wenn ich vmstat 1 aufrufe)
2 0 0 255M 8176k 9 0 0 0 9 2 0 0 2086 1060 453 1 2 98

Wenn ich vmstat 1 aufrufe und die erste Zeile vergesse, dann kommen die richtigen Werte
2 0 0 255M 8176k 84 0 0 0 28 0 0 0 3330 11243 4659 4 16 80

Also ist das erste Ergebnis immer falsch. Ist das ein Bug?

Vor allem: Wenn ich das über ein Script auswerten will, nimmt das Script immer die falschen Werte.
 

lme

FreeBSD Committer
Ne, kein Bug. In der ersten Zeile sind immer die Durchschnittswerte seit dem letzen Boot. Ist bei iostat auch so.
 

bananenBrot

Well-Known Member
Tatsächlich steht das in der man page.
Aber leider etwas versteckt wie ich finde.
Dann ist vmstat gar nicht für "live" snapshots des systemstatus geeignet.
 

bananenBrot

Well-Known Member
Das bekomm ich leider nicht anständig weiterverarbeitet.
Ich suche eine Möglichkeit die Werte in einem script weiterzuverarbeiten
 

Columbo0815

Kaffeemann
Teammitglied
Von scripten habe ich keine Ahnung, also sorry, wenn ich Mist rede: Warum nimmst du nicht einfach die Werte aus der Zeile die du brauchst? Geht das nicht?
 

DSBusr

Digilog native
Wenn ich vmstat 1 aufrufe und die erste Zeile vergesse, dann kommen die richtigen Werte
Guten Morgen.

Das kommt sicherlich auch darauf an, was du für die 'richtigen' Werte halten möchtest.
Es kommt ein Wert, der relativ zum vorherigen ist.
Also zum Beispiel ein vmstat 2 3 bringt dir drei Ergebniszeilen mit Messwerten im Messabstand von zwei Sekunden.
Code:
# vmstat 2 3
 procs      memory      page                    disks     faults         cpu
 r b w     avm    fre   flt  re  pi  po    fr  sr md0 ad0   in   sy   cs us sy id
 1 0 0   3101M   408M  2204   0   4   4  2672   0   0   0  452 3361 1701  3  2 96
 0 0 0   3070M   416M  2000   0   0   0  4444   0   0  20 1444 5444 2942 25  4 72
 0 0 0   3070M   416M   418   0   0   0   555   0   0   2  272  805 1079  0  0 99
#

Im Beispiel heisst das, dass der Server in den zwei Messintervall Sekunden von Zeile 1 zu Zeile 2 2942 Contextswitches gemacht hat. In den zwei Sekunden von Zeile 2 auf 3 wiederum 1079.
Analog verhält es sich mit der CPU Auslastung.
Das die erste Zeile die Werte seit Boot hat wurde ja schon geschrieben.
Aber du kannst auch problemlos längere Intervalle abfragen, um auf 'bessere' Messwerte zu kommen.

Mal ins Blaue:
Code:
# vmstat 10 2 | tail -1
 0 0 0 3136172  421580    21   0   0   0   219   0   0  13  321  419 1349  0  0 100
#
Die Datenerhebung läuft zehn Sekunden und danach ist klar, dass die CPU in diesen zehn Sekunden im Grunde vor sich hin pennt.
Je länger du misst, desto genauer wird die Messung. Aber das Messscript läuft eben auch entsprechend länger.

Für eine Scriptlösung würde beispielsweise das hier gehen, um die Idlewerte prozentual in einer Variable zu haben
Code:
# cpuidle=`vmstat 10 2 | tail -1 | awk '{print $19}'`
# echo $cpuidle
100
#

Ich kenne nicht dein Ziel. Aber ich befürchte, du verrennst dich gerade weil du annimmst, vmstat liefert absolute Zahlen. Das macht das Tool nicht.

Was möchtest du denn eigentlich erreichen?
edit
Habs gerade gesehen.
Lass das Messcript minütlich starten. Aber mache bitte nicht 60 Sekunden lange Messungen. Irgendwann überholt sich das gegenseitig.
Wenn du 10-15 Sekunden als relativen Wert heranziehst ist das sicherlich eine gute Abwägung zwischen Aufwand und Ertrag der ganzen Geschichte..
/edit

Grüße
Mario
 
Zuletzt bearbeitet:

bananenBrot

Well-Known Member
Soweit ich sehen kann gut! Die Datenbank ist voll und neben CPU nehme ich noch RAM dazu.
Ich hab noch ein altes Handy per USB und Prepaid Karte angesteckt - und SMS Informationen bei Schwellenwertüberschreitung klappt auch.
Ich hab auch nochmal über diese Messintervalle nachgedacht. Das Prinzip find ich gut.
Ich habe das dynamisch angepasst:
10 Sekunden Intervall jede Minute - wenn die CPU da über 95% ist, dann wird das Intervall jede Minute 10 Sekunden hochgesetzt. Wenn ich bei 50 Sekunden und immer noch 95% bin, dann löst irgendwann der Schwellenwert aus (falls der Zeitraum nicht in die "Ignoreliste" fällt.)
 

DSBusr

Digilog native
Hallo nochmal,

das klingt ja weit fortgeschritten. Noch eine Idee dazu.
CPU Auslastung in Prozent ist meiner Meinung nach überbewertet.
Man kauft doch entsprechende CPUs um sie auch zu benutzen. Heißt, wenn man fast immer im Bereich von 90% CPU Last unterwegs ist hat man alles richtig gemacht und nicht zuviel Geld beim Händler gelassen.
Ich weiß, das Thema kann man kontrovers diskutieren.

Vielleicht wirfst du noch einen Blick auf die Ausgabe der Systemlast. Zum Beispiel beim Kommando uptime oder top.
Das liefert drei Zahlen für die durchschnittliche Belastung der letzten 5/10/15 Minuten.
Und zwar die Anzahl der Prozesse, die in der CPU Pipeline anstanden und auf eine Zeitscheibe zur Ausführung warteten.

Man kann sagen, dass auf einem Single CPU Rechner alles unter 1.0 unkritisch ist und über 1.0 eine Überlast (sprich Rechner läuft langsamer) sein kann. Bei Mehrkernrechnern kann man die Anzahl der Kerne hochrechnen. Ein Achtkerner ist bei einer Last kleiner 8.0 nicht überlastet.
Hyperthreading kann das ganze ein bisschen unscharf machen. Aber in der Realität sehe ich keine wirklichen Unterschiede.

Als globalen Messansatz kenne ich nichts besseres als diese Art der Lastauswertung und Bewertung.


Grüße
Mario
 
Oben