Home » FreeBSD » FreeBSD ACPI Thermal Check Tool (Tag: , )

最近 Drive Network では 共有サーバ ビジネスセレクト に使用する機器を変更しました。(Drive Network Rack Gallery 2012 (Part 4))

ハードディスクに SAS 2.5″ 300GB を 4 本積み、かつ高い利用率のためなのか、ディスクの速度は低下していませんが筺体内の熱がやや高めな状況が続いています。

現在利用している機器は _TC1, _TC2, _TSP が -1 で、hw.acpi.thermal.tz0.passive_cooling を 0 -> 1 に変更しても Operation not supported by device と無視されます。原因の調査や調整には少々時間がかかると判断しました。

一定の温度 (_CRT) を超えると OS 自体が自律停止します。その兆候を事前に検知するためのツールです。

高温を呼び起こすケースは、お客様のデータ領域におけるプログラムの暴走や過度な brute force attack が大半のため、安定運用のための検知としても役立ちます。

#!/usr/bin/perl -w
#
# atcheck.pl (ACPI Thermal Check Tool)
#

#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#// use Module
#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

use strict;

#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#// Controller
#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    #// ----------------------------------------------------------
    #// Option Parse
    #// ----------------------------------------------------------

    my @basename = split(/\//, $0);
    my $basename = pop(@basename);

    #// ----------------------------------------------------------
    #// Item Set
    #// ----------------------------------------------------------

    my $item = {
        mkdir    => '/bin/mkdir',
        cat      => '/bin/cat',
        chmod    => '/bin/chmod',
        ps       => '/bin/ps',
        hostname => '/bin/hostname',
        mail     => '/usr/bin/mail',
        awk      => '/usr/bin/awk',
        grep     => '/usr/bin/grep',
        chown    => '/usr/sbin/chown',

        touch    => '/usr/bin/touch',
        sysctl   => '/sbin/sysctl',

        dir      => '/home/tools/atcheck/',
        check0   => 'hw.acpi.thermal.tz0.temperature',
        check1   => 'hw.acpi.thermal.tz0._CRT',
        maddr    => 'trouble@example.jp',
        limit_tz => 75.0,

        base     => $basename,
        file     => '/tmp/.' . $basename
    };

    if ( !-d $item->{dir} ) {
        `$item->{mkdir} $item->{dir}`;
        `$item->{chmod} 750 $item->{dir}`;
    }

    #// ----------------------------------------------------------
    #// Start
    #// ----------------------------------------------------------

    #// List

    $item = mklog($item);
    if ( !-e $item->{log} ) { `$item->{touch} $item->{log}`; }

    my ($temp, $upper) = check_at($item);

    if ($temp >= $item->{limit_tz}) {
        my $msg = "temperature $temp" .'C / ' . $upper . 'C (' .
                  sprintf("%.1f", $item->{limit_tz}) . "C)\n";

        report($item, $msg);
    }

#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#// Model
#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

sub utime2date {
    my ($sec, $min, $hours, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($_[0]);

    my $years    = $year + 1900;
    my $this_mon = sprintf("%02d",$mon + 1);

    $mday  = sprintf("%02d", "$mday");
    $hours = sprintf("%02d", "$hours");
    $min   = sprintf("%02d", "$min");
    $sec   = sprintf("%02d", "$sec");

    my $date = "$years/$this_mon/$mday $hours:$min:$sec";

    return $date;
}

sub mklog {
    my ($item) = @_;

    my $time  = utime2date(time());
    my $time0 = substr(utime2date(time()), 0, 10);
    my $file  = $time0; $file =~ s/\///g;

    $item->{log}  = $item->{dir} . $file;
    $item->{time} = $time;

    return $item;
}

sub check_at {
    my ($item) = @_;

    my @line = `$item->{sysctl} $item->{check0} $item->{check1}`;

    my $check0 = _check_at($item, 'check0', $line[0]);
    my $check1 = _check_at($item, 'check1', $line[1]);

    my $msg = "$check0\t$check1";

    open  LIST, ">>$item->{log}";
    print LIST $item->{time} . "\t$msg\n";
    close LIST;

    print $msg . "\n";

    return ($check0, $check1);
}

sub _check_at {
    my ($item, $target, $check) = @_;

    chomp $check;

    $check =~ s/$item->{$target}: //;
    $check =~ s/C$//;

    return $check;
}

sub report {
    my ($item, $msg) = @_;

    my $host = `$item->{hostname}`; chomp $host;
    my $time = utime2date(time());

    my $file = $item->{file};
    my $subj = "Info: acpi tz ($host)";

    my $body = <<"BODY";
$time => $msg
BODY

    open  FILE, "+>$file";
    print FILE $body;
    close FILE;

    `$item->{mail} -s "$subj" $item->{maddr} < $file`;

    unlink($file);
}

Random Select

ゴーヤーチャンプルー定食
すっかり全メニュー制覇の勢いで ニライカナイ に通っていますが、まだそばと同じくらい沖縄ご飯の本命とも言える "ゴーヤーチャンプルー" を試していません。夜の居酒屋でおつまみとして
ブルーシール 川平食堂
石垣島 (No. 9 ? 川平湾 Part 3) の続きです。スタート地点から 5 分程歩いていますが、まだまだ続いていそうです。海が近づきつつあります。行き止まりが見えて来ました。スローペースとは言
魯肉飯 (ランチセット, 大盛り)
一茶一会 (印度チキンカレー) から日を空けずして再び訪れました。気になっていた魯肉飯 (豚の角煮) にチャレンジしてみたかったからです。前回訪れた週末の看板には、印度チキンカレーの横に "
ミートソース (メン 大)
柏や (鳥から揚定食) の続きです。やはり気になっていたミートソースに行くしかありません。柏や (ナポリタン) では特大は並の 2.7 倍とありましたし、ナポリタンも並は試していないので、まずは標準を
ビーフ + 野菜カレー (ルー大盛り, 辛さ 70 倍)
カリーライス専門店 エチオピア 本店 (No. 13 – 辛さ 70 倍メドレー 1) を投稿した時は、まさか全メニューを辛さ 70 倍で横断するとは思っていませんでしたが、我ながら凝り性
うまい ! がすごい。クリーミー生サーバー (4)
うまい ! がすごい。クリーミー生サーバー (Part 1) の続きです。1 度にシール 6 枚分まで登録出来るので、コツコツ続けていると、テストで満点という訳ではありませんが、何だかいい気分♪82
おにぎり
飲食業界に長かったこともあり、お金を節約したい時や自分の味が食べたくなる時はお弁当を作ることがあります。以前の職場ではハンバーグすら手こねから作ったこともありました。当時はコンロが 1 つしかない環境
ロース豚丼 十勝仕立て 大盛
ここ最近、手速く食事を済ます場合は松屋が多く、行動半径内には 2 店舗あるにも関わらず、久しく吉野家に入った記憶がありませんでした。ふと思い出したかの様に、ある日最寄り駅そばの吉野家の前を通ると、以前
radserv X
radserv X (FreeBSD 9.1-RELEASE, Root mount waiting) の続きです。FreeBSD 9.1-RELEASE の radserv X へのインストールは
印度チキンカレー (大盛り)
カリーライス専門店 エチオピア 本店 (No. 7 – 辛さ 65 – 70 倍) でついに辛さ 70 倍を極めた後、しばらくは堅気な辛さ ? で気を抜いてカレーを食べたいと思
Valid HTML5 Valid CSS3 Another HTML Lint