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

ビーフカレー + カレーソース
欧風カレー ボンディ (魚介カレー) の後は 10 月に訪れましたが、いつも訪れる小川町店ではすでに魚介カレーがメニューから消えていました。この時と 12 月にも 欧風カレー ボンディ (チキンカレー
カフェテリア・スタイル
レンタルサーバ (ホスティングサービス) にカフェテリア・スタイルと聞くと、違和感を感じるかもしれません。世間では BTO (Build to Order) の方が通りが良いでしょう。現在の 共有サー
Firefox Logo
年末年始は FreeBSD, Windows ともにデスクトップ環境をアップデート・整理する時間に当てました。個人的にブックマークは FreeBSD デスクトップ, Windows (VirtualB
hp dv5
2014/02 頃、5 年以上使って来たノート PC (hp dv5 has broken again and again) に 5 度目の故障が発生しました。hp のサポートセンターに問い合わせても
ニヘデビール ブラックエール
久高島 (No. 4 – フボー御嶽 〜 ヤグル川) の続きです。安座真港 11:30 発で到着し、久高港発 15:00 で帰ることにしていたので、2 時間程周遊した後は、待合所付近でゆっ
玄米おにぎり + びっく・もっく (からあげ弁当 おかずのみ)
タマチャンショップ (国産 21 世紀雑穀米) で白米以外のご飯に目覚め始めていますが、なくなる直前に 東急ストア でお試しサイズとして、あきたこまち 1kg を玄米で購入しました。袋の裏側を見ながら
豚骨醤油 青ネギラーメン (1)
先日、愛知の友達の投稿でネギ入れ放題のラーメンを見てスイッチが入ってしまい、オフィス周辺で調べてはみたものの、調べた限りはカレーとラーメンの聖地 "神保町" でも見当たりません。小
おかずセレクト (2013/03/19)
ミニストップ (ベルギーチョコソフト) の続きです。自宅の近辺には見掛けませんが、オフィス周辺には歩いて 1 分程度の距離に 2 件 もあります。神田錦町 1 丁目店は少なくとも 10 年以上はあり、
しお定食
出張 2 週間目の木曜日、そろそろ胃も疲れてくる頃ですがそんな気配は微塵も見せず、さて今日も普段行けないメンバーを揃えて 5 人で出発しました。当初 沖縄出張 (No. 2 ? 海鮮食堂 太陽) で天
くるくまスペシャル
沖縄本島 (No. 35 – 富士家ぜんざい) の続きです。今回は 09/19 – 09/24 の 5 泊 6 日の旅程で、09/22 からはセカンドステージです。初日は久しぶ
Valid HTML5 Valid CSS3 Another HTML Lint