最近 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 が大半のため、安定運用のための検知としても役立ちます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | #!/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 ); } |