labunix's blog

labunixのラボUnix

CPUクーラを交換、1時間毎に温度情報をsyslogに転送する。

■CPUクーラを交換、1時間毎に温度情報をsyslogに転送する。
 今回はCPUクーラをリテール品から新規で購入した品に交換する。

 リテール品とはメーカーがエンドユーザー向けに出荷した正規品のこと。
 純正品とも呼ばれる。

 E97378-001 (Core i7 870のリテール品)

$ awk '/model name/{a[$0]+=1}END{for(n in a){print a[n],n}}' /proc/cpuinfo
8 model name	: Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz

■Core i7 870は第一世代の古いCPUで温度が上昇しやすい傾向はあるものの、
 グリス寿命か純正品のファンコントローラの寿命を疑っていた。
 時間が無かったので長いこと放置していたが、
 せっかくCPUクーラを購入したので、グリスを塗布するだけの切り分けは今回は行わず、
 素直にCPUクーラも交換するにした。

 CPU温度について調べてみる。
 http://labunix.hateblo.jp/entry/20181110/1541838190

 CPUの温度上昇による無応答、シャットダウンに対応する。
 http://labunix.hateblo.jp/entry/20181108/1541681890

■購入の基準はPWMのために4ピンであることという条件以外は特になかったので、
 アルミ+銅はリテール品と同じ、風量と騒音値が良さそうだったのと、
 単純に安かった以下を購入。

 MONOCHROME PRO
 https://kakaku.com/item/K0000572696/

 若干リテール品よりも大きかったが、特に干渉することもなかったので、
 仮設置して起動、問題なさそうだったのを確認してから、
 バックプレートをつけるためにマザボを一度外して本設置とした。

■ファンクーラの寿命について
 ファンクーラの寿命は40,000時間(5年にちょっと届かない程度)らしい。
 この意味でもグリスを塗布するだけの切り分けは不要に思える。

$ echo 40000 | awk '{print $1/24/365"年"}'
4.56621年

■20181110日までのログからすると、温度異常を検知したのは9862007回だった。
 調べてはいないが、high 83°C ~ crit 99°Cの間の検知回数がTotal eventで、crit超えると電源OFFとなると推測。

$ ls -l --time-style '+%Y/%m/%d %H:%M:%S' /var/log/syslog*
-rw-r----- 1 root adm  25654 2019/04/28 20:17:01 /var/log/syslog
-rw-r----- 1 root adm 872748 2019/04/28 19:48:45 /var/log/syslog.1
-rw-r----- 1 root adm   3597 2018/11/10 00:09:08 /var/log/syslog.2.gz
-rw-r----- 1 root adm  59259 2018/11/09 00:09:57 /var/log/syslog.3.gz
-rw-r----- 1 root adm   4514 2018/11/08 00:08:46 /var/log/syslog.4.gz
-rw-r----- 1 root adm  12610 2018/11/07 00:08:39 /var/log/syslog.5.gz
-rw-r----- 1 root adm  52728 2018/11/06 00:07:14 /var/log/syslog.6.gz
-rw-r----- 1 root adm   9012 2018/11/05 00:08:52 /var/log/syslog.7.gz

$ sudo zcat /var/log/syslog.[2-7].gz | \
  awk 'BEGIN{max=0}/temperature/&&/total events/{gsub("\\)","",$NF);if(max<$NF){max=$NF}}END{print max}'
9862007

■交換後、アイドル時は2025°C前後、ピーク時でも45°C程度、GPUは35°C程度になった。
 過去のsensors出力結果はアイドル時6065°C、GPUもつられて65°C程度だったので、
 十分改善されている。

$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +23.0°C  (high = +83.0°C, crit = +99.0°C)
Core 1:       +23.0°C  (high = +83.0°C, crit = +99.0°C)
Core 2:       +26.0°C  (high = +83.0°C, crit = +99.0°C)
Core 3:       +22.0°C  (high = +83.0°C, crit = +99.0°C)

nouveau-pci-0100
Adapter: PCI adapter
GPU core:     +0.90 V  (min =  +0.88 V, max =  +1.08 V)
temp1:        +35.0°C  (high = +95.0°C, hyst =  +3.0°C)
                       (crit = +105.0°C, hyst =  +5.0°C)
                       (emerg = +135.0°C, hyst =  +5.0°C)


$ sensors -u
coretemp-isa-0000
Adapter: ISA adapter
Core 0:
  temp2_input: 25.000
  temp2_max: 83.000
  temp2_crit: 99.000
  temp2_crit_alarm: 0.000
Core 1:
  temp3_input: 22.000
  temp3_max: 83.000
  temp3_crit: 99.000
  temp3_crit_alarm: 0.000
Core 2:
  temp4_input: 25.000
  temp4_max: 83.000
  temp4_crit: 99.000
  temp4_crit_alarm: 0.000
Core 3:
  temp5_input: 22.000
  temp5_max: 83.000
  temp5_crit: 99.000
  temp5_crit_alarm: 0.000

nouveau-pci-0100
Adapter: PCI adapter
GPU core:
  in0_input: 0.900
  in0_min: 0.880
  in0_max: 1.080
temp1:
  temp1_input: 35.000
  temp1_max: 95.000
  temp1_max_hyst: 3.000
  temp1_crit: 105.000
  temp1_crit_hyst: 5.000
  temp1_emergency: 135.000
  temp1_emergency_hyst: 5.000

■sysstat(sar)では取得されていない情報なので、
 以下のように簡単なワンライナーを作成する。

$ /usr/bin/sensors | \
    awk '{if($0 ~ /Core/){a[$1$2]=$3}else{if($1 ~ /temp1/){gsub("temp1","GPU",$1);a[$1]=$2}}} \
     END{for(n in a){print n,a[n]}}'
GPU: +35.0°C
Core0: +25.0°C
Core1: +23.0°C
Core2: +27.0°C
Core3: +23.0°C

■上記を少し変形してsyslogに送るためにloggerを使う。
 以下のsocatを使うような制限は無いので、素直にloggerを使う。

 socatを使ってrsyslogに任意のログを記録する。
 http://labunix.hateblo.jp/entry/20180429/1525006357

$ cat /etc/cron.hourly/mysensors
#!/bin/bash

/usr/bin/sensors | \
  awk '{if($0 ~ /Core/){a[$1$2]=$3}else{if($1 ~ /temp1/){gsub("temp1","GPU",$1);a[$1]=$2}}} \
    END{for(n in a){printf "%s %s",n,a[n]","}print ""}' | logger

$ sudo chmod +x /etc/cron.hourly/mysensors
$ sudo /etc/cron.hourly/mysensors

$ sudo find /etc/cron* -type f | grep cron.hourly `xargs`
/etc/crontab:17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly

■毎時17分に実行され、rootユーザとして出力されているのがcron。それ以外は手動実行のログ。

$ sudo awk '/GPU/{gsub($4,"dummy-host",$4);print}' /var/log/syslog
Apr 28 21:10:06 dummy-host labunix: GPU: +35.0°C,Core0: +25.0°C,Core1: +22.0°C,Core2: +27.0°C,Core3: +22.0°C,
Apr 28 21:17:01 dummy-host root: GPU: +35.0°C,Core0: +26.0°C,Core1: +23.0°C,Core2: +27.0°C,Core3: +22.0°C,
Apr 28 21:17:10 dummy-host labunix: GPU: +36.0°C,Core0: +26.0°C,Core1: +23.0°C,Core2: +26.0°C,Core3: +22.0°C,

■sudoコマンドで実行しても実行元ユーザになる。

$ sudo /etc/cron.hourly/mysensors
$ sudo awk '/GPU/{gsub($4,"dummy-host",$4);print}' /var/log/syslog
Apr 28 21:10:06 dummy-host labunix: GPU: +35.0°C,Core0: +25.0°C,Core1: +22.0°C,Core2: +27.0°C,Core3: +22.0°C,
Apr 28 21:17:01 dummy-host root: GPU: +35.0°C,Core0: +26.0°C,Core1: +23.0°C,Core2: +27.0°C,Core3: +22.0°C,
Apr 28 21:17:10 dummy-host labunix: GPU: +36.0°C,Core0: +26.0°C,Core1: +23.0°C,Core2: +26.0°C,Core3: +22.0°C,
Apr 28 21:21:41 dummy-host labunix: GPU: +36.0°C,Core0: +26.0°C,Core1: +23.0°C,Core2: +27.0°C,Core3: +22.0°C,

■なので、5列目がrootでGPUを含むログを探せば過去の傾向を追えるようになる。

$ sudo awk '$5 ~ /root/&&/GPU/{print}' /var/log/syslog

■CSV化

$ sudo awk '/:17:/&&$5 ~/root/ \
   {gsub($4,"dummy-host",$4);gsub($5,"",$0); \
    gsub("°C","",$0);gsub(": \\+|  *",",",$0);print $0}' /var/log/syslog /var/log/syslog.1 | sort -uV
Apr,30,00:17:01,dummy-host,GPU,42.0,Core0,40.0,Core1,38.0,Core2,39.0,Core3,35.0,
Apr,30,01:17:01,dummy-host,GPU,42.0,Core0,39.0,Core1,36.0,Core2,39.0,Core3,36.0,
Apr,30,02:17:02,dummy-host,GPU,41.0,Core0,39.0,Core1,36.0,Core2,39.0,Core3,34.0,
Apr,30,03:17:01,dummy-host,GPU,41.0,Core0,34.0,Core1,33.0,Core2,37.0,Core3,32.0,
Apr,30,04:17:01,dummy-host,GPU,39.0,Core0,36.0,Core1,33.0,Core2,36.0,Core3,31.0,
Apr,30,05:17:01,dummy-host,GPU,39.0,Core0,31.0,Core1,29.0,Core2,33.0,Core3,28.0,
Apr,30,06:17:01,dummy-host,GPU,39.0,Core0,29.0,Core1,27.0,Core2,30.0,Core3,26.0,
Apr,30,07:17:01,dummy-host,GPU,38.0,Core0,28.0,Core1,25.0,Core2,29.0,Core3,25.0,
Apr,30,08:17:01,dummy-host,GPU,38.0,Core0,29.0,Core1,26.0,Core2,29.0,Core3,25.0,
Apr,30,09:17:01,dummy-host,GPU,38.0,Core0,29.0,Core1,26.0,Core2,30.0,Core3,25.0,
Apr,30,10:17:01,dummy-host,GPU,38.0,Core0,29.0,Core1,25.0,Core2,29.0,Core3,25.0,
Apr,30,11:17:01,dummy-host,GPU,38.0,Core0,29.0,Core1,26.0,Core2,30.0,Core3,25.0,
Apr,30,12:17:01,dummy-host,GPU,39.0,Core0,30.0,Core1,27.0,Core2,31.0,Core3,26.0,
Apr,30,13:17:01,dummy-host,GPU,39.0,Core0,29.0,Core1,26.0,Core2,30.0,Core3,25.0,
Apr,30,14:17:01,dummy-host,GPU,39.0,Core0,30.0,Core1,27.0,Core2,30.0,Core3,26.0,
Apr,30,15:17:01,dummy-host,GPU,40.0,Core0,30.0,Core1,28.0,Core2,32.0,Core3,27.0,
Apr,30,16:17:01,dummy-host,GPU,39.0,Core0,30.0,Core1,26.0,Core2,30.0,Core3,26.0,
Apr,30,17:17:01,dummy-host,GPU,39.0,Core0,29.0,Core1,27.0,Core2,30.0,Core3,26.0,
Apr,30,18:17:01,dummy-host,GPU,39.0,Core0,30.0,Core1,26.0,Core2,30.0,Core3,26.0,
Apr,30,19:17:01,dummy-host,GPU,41.0,Core0,31.0,Core1,29.0,Core2,32.0,Core3,28.0,
Apr,30,20:17:01,dummy-host,GPU,40.0,Core0,27.0,Core1,27.0,Core2,30.0,Core3,27.0,
Apr,30,21:17:01,dummy-host,GPU,41.0,Core0,31.0,Core1,28.0,Core2,32.0,Core3,28.0,
Apr,30,22:17:01,dummy-host,GPU,39.0,Core0,30.0,Core1,27.0,Core2,31.0,Core3,26.0,
Apr,30,23:17:01,dummy-host,GPU,39.0,Core0,27.0,Core1,27.0,Core2,30.0,Core3,26.0,
May,1,00:17:01,dummy-host,GPU,39.0,Core0,28.0,Core1,26.0,Core2,31.0,Core3,26.0,
May,1,01:17:02,dummy-host,GPU,39.0,Core0,30.0,Core1,26.0,Core2,30.0,Core3,26.0,
May,1,02:17:01,dummy-host,GPU,39.0,Core0,29.0,Core1,26.0,Core2,30.0,Core3,26.0,
May,1,03:17:01,dummy-host,GPU,38.0,Core0,29.0,Core1,26.0,Core2,29.0,Core3,26.0,
May,1,04:17:01,dummy-host,GPU,39.0,Core0,28.0,Core1,27.0,Core2,30.0,Core3,25.0,
May,1,05:17:01,dummy-host,GPU,39.0,Core0,30.0,Core1,27.0,Core2,30.0,Core3,26.0,
May,1,06:17:01,dummy-host,GPU,39.0,Core0,29.0,Core1,26.0,Core2,29.0,Core3,25.0,
May,1,07:17:01,dummy-host,GPU,39.0,Core0,29.0,Core1,26.0,Core2,30.0,Core3,25.0,
May,1,08:17:01,dummy-host,GPU,39.0,Core0,28.0,Core1,26.0,Core2,30.0,Core3,25.0,
May,1,09:17:01,dummy-host,GPU,39.0,Core0,29.0,Core1,26.0,Core2,30.0,Core3,25.0,
May,1,10:17:01,dummy-host,GPU,39.0,Core0,30.0,Core1,26.0,Core2,30.0,Core3,25.0,
May,1,11:17:01,dummy-host,GPU,39.0,Core0,30.0,Core1,26.0,Core2,30.0,Core3,25.0,
May,1,12:17:01,dummy-host,GPU,39.0,Core0,31.0,Core1,27.0,Core2,31.0,Core3,27.0,
May,1,13:17:01,dummy-host,GPU,39.0,Core0,30.0,Core1,27.0,Core2,30.0,Core3,26.0,
May,1,14:17:01,dummy-host,GPU,40.0,Core0,31.0,Core1,27.0,Core2,30.0,Core3,26.0,
May,1,15:17:01,dummy-host,GPU,41.0,Core0,32.0,Core1,28.0,Core2,32.0,Core3,28.0,
May,1,16:17:01,dummy-host,GPU,40.0,Core0,30.0,Core1,28.0,Core2,31.0,Core3,27.0,
May,1,17:17:01,dummy-host,GPU,40.0,Core0,30.0,Core1,28.0,Core2,32.0,Core3,27.0,
May,1,18:17:01,dummy-host,GPU,39.0,Core0,31.0,Core1,27.0,Core2,31.0,Core3,26.0,
May,1,19:17:01,dummy-host,GPU,40.0,Core0,30.0,Core1,27.0,Core2,32.0,Core3,27.0,
May,1,20:17:01,dummy-host,GPU,40.0,Core0,29.0,Core1,28.0,Core2,30.0,Core3,27.0,