fetus Diary
2008/07/31(木) - CPUの動作クロックを取得するmunin用プラグイン
/proc/cpuinfo があって、それが私の想定するフォーマットで、perl が入っているシステム専用。
# いきなり Release 4 なのは気にしたら負けだと思います
同じ目的のプラグインは MuninExchange に存在するんだけど、これがあまりにもあんまりなプラグイン(コア数ハードコーディング…)なので作った。まあ、あってもあんまり役には立たないプラグインな気がするけど。
適当に作ったので、取得ルールが正しいのかどうかはわからない。一応、物理 CPU ごと(の最初に見つかった論理 CPU)に動作周波数を出しているつもり。
#!/usr/bin/perl
#use 5.008;
use strict;
#use bigint;
if($ARGV[0] eq 'autoconf') {
if(-r '/proc/cpuinfo') {
print "yes\n";
exit 0;
} else {
print "no\n";
exit 1;
}
}
my @data = GetCpuInfo();
if($ARGV[0] eq 'config') {
printf("graph_title CPU speed\n");
printf("graph_args --base 1000 -l 0\n");
printf("graph_vlabel frequency [Hz]\n");
printf("graph_info This graph shows the cpu-speed for each cpu, as reported by the kernel\n");
printf("graph_category system\n");
my @order_tmp;
foreach my $hash (@data) {
push(@order_tmp, int($hash->{'id'}));
printf("cpu%d.label CPU %d\n", $hash->{'id'}, $hash->{'id'});
printf("cpu%d.info CPU %d, %s\n", $hash->{'id'}, $hash->{'id'}, $hash->{'name'});
printf("cpu%d.type GAUGE\n", $hash->{'id'});
printf("cpu%d.draw LINE2\n", $hash->{'id'});
printf("cpu%d.min 0 \n", $hash->{'id'});
}
@order_tmp = sort(@order_tmp);
printf("graph_order cpu%s\n", join(" cpu", @order_tmp));
exit 0;
}
foreach my $hash (@data) {
printf("cpu%d.value %d\n", $hash->{'id'}, $hash->{'freq'});
}
exit 0;
sub GetCpuInfo() {
my @physicals;
my @grubbed;
my @logicals = ReadCpuInfo();
foreach my $logical_ (@logicals) {
my %logical = %{$logical_};
my $physical_id = exists($logical{'physical id'}) ? $logical{'physical id'} : 0;
if(!in_array($physical_id, @grubbed)) {
my %data;
$data{'id'} = $physical_id;
$data{'name'} = exists($logical{'model name'}) ? $logical{'model name'} : '(unknown)';
#$data{'freq'} = $logical{'cpu MHz'} * 1000 * 1000;
$data{'freq'} = sprintf('%d000', $logical{'cpu MHz'} * 1000);
push(@physicals, \%data);
push(@grubbed, $physical_id);
}
}
return @physicals;
}
sub ReadCpuInfo() {
my $cpuinfo = '';
open(my $fh, '/proc/cpuinfo') or die $!;
while(my $line = <$fh>) {
$line =~ tr/\x0a\x0d//d;
$cpuinfo .= $line . "\n";
}
close($fh);
my @result;
my @logical_cpus = split(/\n\n/, $cpuinfo);
foreach my $logical_cpu (@logical_cpus) {
my %data;
foreach my $line (split(/\n/, $logical_cpu)) {
if($line =~ /^(.+?)\s+:\s+(.*)$/) {
$data{CpuInfoNormalize($1)} = CpuInfoNormalize($2);
}
}
push(@result, \%data);
}
return @result;
}
sub CpuInfoNormalize($) {
my($data, ) = @_;
$data =~ s/\s+/ /g;
$data =~ s/^\s+//;
$data =~ s/\s+$//;
return $data;
}
sub in_array($@) {
my($val, @array) = @_;
foreach my $element (@array) {
if($val =~ /^[[:digit:]]+$/ && $element =~ /^[[:digit:]]+$/) {
return 1 if ($val == $element);
} else {
return 1 if ($val eq $element);
}
}
return 0;
}
だれでもじゆうにつかうことができますが、ばぐがあってもないちゃいけません
- 08/07/31
22:1022:11
コメント
HiNa (08/10/09 20:15)
32ビットコンピュータだといろいろマズいという噂がちらほら