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;
}

だれでもじゆうにつかうことができますが、ばぐがあってもないちゃいけません

コメント

  • HiNa (08/10/09 20:15)

    32ビットコンピュータだといろいろマズいという噂がちらほら

名前
メール
コメント

※HTML タグは使えません。HTTP URL には自動リンクが張られます。

Captcha
画像から読み取れる文字を入力: