[Perl] CPU Stats auslesen (wie in top)

tschepe

Well-Known Member
Ich möchte in Perl die CPU Stats verarbeiten also die angaben: user, nice, system, interrupt und idle, eben jene werte die man auch mittels top(1) präsentiert bekommt.
Code:
CPU states:  0.4% user,  0.0% nice,  0.0% system,  0.0% interrupt, 99.6% idle
Aber Erstmal muss ich an diese kommen :rolleyes:, nur wie?
Meine erste Idee war sysctl(1) aber da habe ich auf Anhieb nichts gefunden.

Gruß tschepe
 
tschepe schrieb:
Ich möchte in Perl die CPU Stats verarbeiten also die angaben: user, nice, system, interrupt und idle, eben jene werte die man auch mittels top(1) präsentiert bekommt.
Code:
CPU states:  0.4% user,  0.0% nice,  0.0% system,  0.0% interrupt, 99.6% idle
Aber Erstmal muss ich an diese kommen :rolleyes:, nur wie?
Meine erste Idee war sysctl(1) aber da habe ich auf Anhieb nichts gefunden.

Gruß tschepe

Code:
xenon% top -bn2d0.5 | grep Cpu | tail -n1                                              ~/stuff/downloads (pts/9)
Cpu(s):  3.9% us,  2.0% sy,  0.0% ni, 94.1% id,  0.0% wa,  0.0% hi,  0.0% si

Fällt mir so spontan ein.

mfg dct.c
 
Danke für die Infos, eigentlich habe ich gehoft das es ohne top zu starten funktioniert. Aber da wird wohl kein weg dran vorbei führen.
 
Vielleicht muss ich doch nicht top nutzen.
Ich habe gerade den "Was man schon immer über sysctl wissen wollte"-Thread wieder gefunden.
kern.cp_time: Clock ticks spent in different CPU states
Hört sich genau nach dem an was ich suche.
Code:
sysctl -n kern.cp_time
10620 7175 2805 1113 870475
So was sollte sich gut in Perl verarbeiten lassen. Ich habe auch schon mit Hilfe von Google herausgefunden was die einzelnen werte bedeuten soll:
munin cvs schrieb:
user, nice, system, interrupt und idle
Jetzt brauche ich eigentlich nur noch die "Clock ticks", die seit dem starten vergangen sind.

Code:
#!/usr/bin/perl -w
# CPU Info:
my ($cpuuser, $cpunice, $cpusystem, $cpuinterrupt, $cpuidle) = split(' ', `sysctl -n kern.cp_time`);

# Clock ticks??? = UNIX Timestamp - Uptime (in seconds):
my ($ticks) = time() - (`sysctl -n kern.boottime` =~ /\{ sec = (\d+),.*/);

print "Ticks....: ".$ticks;
print "\nUser.....: ".$cpuuser / $ticks * 100;
print "\nNice.....: ".$cpunice / $ticks * 100;
print "\nSystem...: ".$cpusystem / $ticks * 100;
print "\nInterrupt: ".$cpuinterrupt / $ticks * 100;
print "\nIdle.....: ".$cpuidle / $ticks * 100;
print "\n";
Die Ausgabe von dem obigen Programm:
Code:
Ticks....: 1118173527
User.....: 0.00148241749600999
Nice.....: 0.000641671424582027
System...: 0.000431149538384663
Interrupt: 0.000148366953781405
Idle.....: 0.153974000348756
Eigentlich müsste doch, wenn man alles zusammen zählt, 100% rauskommen, oder?
Ich habe leider nicht so viele Informationen über kern.cp_time rausbekommen.
Sind mit "Clock ticks" wirklich Sekunden gemeint?
Denn sysctl bietet mir folgende Clockrates an:
Code:
kern.clockrate: { hz = 100, tick = 10000, profhz = 1024, stathz = 128 }
hw.clockrate: 1002

Gruß tschepe
 
Zurück
Oben