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

野菜カレー (辛さ 35 倍)
カリーライス専門店 エチオピア 本店 (No. 3 – 辛さ 25 – 30 倍) の続きです。2012 年は突然 カリーライス専門店 エチオピア に目覚め、辛さ 30 倍まで
野菜炒め + コンビーフハッシュ (5)
銀座わしたショップ 2014/07/03 (コンビーフハッシュ) でようやく入手したコンビーフハッシュを、まずどんな料理で試すかを考えました。最初から作ったことがないちゃんぽんやチャンプルーよりは、手
タコライス 材料 (LAWRY'S タコミックス)
自宅 de タコライス (OLD EL PASO タコ・シーズニング Part 2) で、ようやく OLD EL PASO タコ・シーズニング + チェダーチーズ + Pace ピカンテソース の組み
Dr. コトー診療所 (屋上 正面)
与那国島 (No. 8 – Dr. コトー診療所 Part 2) の続きです。病室の入口から玄関を眺めます。事務室にちょっと寄り道するとこの絵は何だろう。吉岡秀隆さんのサイン ? (笑)屋
石垣牛炙り握り
石垣島 (No. 2 – まかない屋) の続きです。軽めな量がらも気持ちは満たされた "まかない屋" を後にして 730 交差点に戻り、美崎町を中心に少し散策しました。
琉球泡盛 与那国 100 ml 3 本セット (3)
沖縄の友達から差し入れをいただきました。与那国島好きな私のことを知ってのプレゼント、にふぇーでーびる♪生まれて初めてのひとり旅で、初めて与那国島を訪れて早 2 年弱経ちました。今でもたまに シリーズ
トロピカルビーチ (4)
沖縄本島 (No. 28 – トロピカルビーチ de ビーチパーリー 準備) の続きです。トロピカルビーチ の設備予約で、Web ページでは書かれていない以下の事項を確認しました。予約可能
牛赤身ひき肉 (9)
自宅 de タコライス (S&B タコスシーズニング Part 1) の続きです。タコスミートS&B タコスシーズニング は 1 パックに 2 袋入りで、1 袋 (8g) をひき肉 1
VAIO Fit 13A (背面)
VAIO Fit 13A (到着) 後、カスタマイズを続けています。VAIO は素の Windows 8.1 Pro とは異なるオリジナルのアプリケーションも多々インストールされているので、Virtu
タコライス 材料 (OLD EL PASO タコ・シーズニング)
自宅 de タコライス (OLD EL PASO タコ・シーズニング Part 1) の続きです。OLD EL PASO タコ・シーズニング はまだ 1 袋残っています。今回の必須アイテムであるチェダ
Valid HTML5 Valid CSS3 Another HTML Lint