CPU-Last loggen

Bash, Shell, PHP, Python, Perl, CGI
iruwen
Posts: 9
Joined: 2004-02-25 12:21

CPU-Last loggen

Post by iruwen »

Hi,

eigentlich wollte ich grad mal einfach die CPU-Last auf meinem Rechner mitloggen und dachte mir das geht ja ganz einfach:
top -bin 1 | grep 'CPU states' >> last.log
Dummerweise kommt da immer der gleiche Wert bei raus, top braucht wohl auch zwei Durchläufe um aus der Ã?nderung in /proc/stat die Last zu berechnen. Wenn ich
top -bin 2 | grep 'CPU states'
mach ist der zweite Wert dann auch richtig. Wiederum dummerweise dauert das relativ lange :(
Gibt's ein fertiges Tool das einfach nur die CPU-Last ausgibt oder hat jemand einen Vorschlag wie man das scripttechnisch anders lösen kann?
Ich würd's ja gern mit Perl direkt aus /proc/stat holen aber a) hab ich keine Ahnung wie man das genau berechnet und b) bin ich 'ne absolute Regexp-Lusche ;)

Danke
oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim

Re: CPU-Last loggen

Post by oxygen »

mrtg... könnte aber overkill sein. Vielleicht solltest eher uptime auswerten. Das geht bei weitem einfacher.
iruwen
Posts: 9
Joined: 2004-02-25 12:21

Re: CPU-Last loggen

Post by iruwen »

Code: Select all

#!/usr/bin/perl

open(STAT, "</proc/stat");
 ($junk, $cpu_user, $cpu_nice, $cpu_sys, $cpu_idle) = split(/s+/, <STAT>);
close(STAT);

 $cpu_total1 = $cpu_user + $cpu_nice + $cpu_sys + $cpu_idle;
 $cpu_load1 = $cpu_user + $cpu_nice + $cpu_sys;

sleep 1;

open(STAT, "</proc/stat");
 ($junk, $cpu_user, $cpu_nice, $cpu_sys, $cpu_idle) = split(/s+/, <STAT>);
close(STAT);

 $cpu_total2 = $cpu_user + $cpu_nice + $cpu_sys + $cpu_idle;
 $cpu_load2 = $cpu_user + $cpu_nice + $cpu_sys;

 $cpuusage = int((1000 * ($cpu_load2 - $cpu_load1)) / ($cpu_total2 - $cpu_total1))/10;

exit $cpuusage;
Das scheint's zu tun :)
Ich hätte das aber gerne als return Wert anstatt als exit Code, so frag ich das jetzt im Bashscript als cpuload=$? direkt nach dem Aufruf des Perlscripts ab, hätte aber lieber cpuload=`./cpuload.pl` oder so in der Richtung :)
iruwen
Posts: 9
Joined: 2004-02-25 12:21

Re: CPU-Last loggen

Post by iruwen »

Gnah, einfach
print $cpuusage;
anstelle von
exit $cpuusage;
und im Bashscript
cpuusage=`./cpuusage.pl`
:D
iruwen
Posts: 9
Joined: 2004-02-25 12:21

Re: CPU-Last loggen

Post by iruwen »

/e: Zu blöd für printf
niklas_
Posts: 122
Joined: 2003-08-13 20:46

Re: CPU-Last loggen

Post by niklas_ »

Loadwerte loggen und Grafik erstellen mit rrdtool


Cronjob (jede minute):
rrdtool update loadavg.rrd `date +%s`:`cat /proc/loadavg | sed "s/(([0-9]+.[0-9]+ ){3}).*/1/" | sed "s/ ([^$])/:1/g"`

Graphik erzeugen (kann natürlich auch mit im Cronjob landen):
rrdtool graph loadavg.gif -h 200 -w 900 --start -86400 DEF:avg5=loadavg.rrd:5min:AVERAGE DEF:avg15=loadavg.rrd:15min:AVERAGE DEF:avg30=loadavg.rrd:30min:AVERAGE LINE2:avg5#FF0000 LINE2:avg15#00FF00 LINE2:avg30#0000FF
dani_ch
Posts: 79
Joined: 2003-03-23 17:42

Re: CPU-Last loggen

Post by dani_ch »

Code: Select all

#!/usr/bin/perl
usw.
verstehe ich es richtig, dass hierbei die auslastung des cpu's in prozenten angezeigt wird und das auch bei einem normalen single-cpu-system klappt, oder?

also wenn ich 4.5 zurückbekomme, ist das system zu 4.5% ausgelastet.
suntzu
Posts: 669
Joined: 2002-12-20 19:47
Location: Mönchengladbach

Re: CPU-Last loggen

Post by suntzu »

Was spricht gegen snmp?
rudi
Posts: 69
Joined: 2004-12-08 19:10

Re: CPU-Last loggen

Post by rudi »

niklas_ wrote:Loadwerte loggen und Grafik erstellen mit rrdtool


Cronjob (jede minute):
rrdtool update loadavg.rrd `date +%s`:`cat /proc/loadavg | sed "s/(([0-9]+.[0-9]+ ){3}).*/1/" | sed "s/ ([^$])/:1/g"`

Graphik erzeugen (kann natürlich auch mit im Cronjob landen):
rrdtool graph loadavg.gif -h 200 -w 900 --start -86400 DEF:avg5=loadavg.rrd:5min:AVERAGE DEF:avg15=loadavg.rrd:15min:AVERAGE DEF:avg30=loadavg.rrd:30min:AVERAGE LINE2:avg5#FF0000 LINE2:avg15#00FF00 LINE2:avg30#0000FF
Wobei das nicht ganz läuft...

Code: Select all

sarge:~# rrdtool create loadavg.rrd `date +%s`:`cat /proc/loadavg | sed "s/(([0-9]+.[0-9]+ ){3}).*/1/" | sed "s/ ([^$])/:1/g"`
ERROR: can't parse argument '1121339462:0.01:0.05:0.06'
Scheint am "date +%s" zu liegen. Genau kenne ich mich damit nicht aus.
suntzu
Posts: 669
Joined: 2002-12-20 19:47
Location: Mönchengladbach

Re: CPU-Last loggen

Post by suntzu »

rudi wrote:

Code: Select all

sarge:~# rrdtool create loadavg.rrd `date +%s`:`cat /proc/loadavg | sed "s/(([0-9]+.[0-9]+ ){3}).*/1/" | sed "s/ ([^$])/:1/g"`
ERROR: can't parse argument '1121339462:0.01:0.05:0.06'
Scheint am "date +%s" zu liegen. Genau kenne ich mich damit nicht aus.
http://people.ee.ethz.ch/~oetiker/webto ... te.en.html

Kurz: Du kannst den Teil mit dem date... durch N ersetzen, dann wird automatisch der aktuelle Wert genommen.