最近 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);
}









