coretemp/usbrh/rrdtool

KERNCONF

書式
このドライバをカーネルにコンパイルするためには、次の行を利用者のカーネル
設定ファイルに置きます:
     device coretemp
もう一つの方法として、ブート時にモジュールとしてドライバをロードするため
には、次の行を loader.conf(5) に置きます:
     coretemp_load="YES"
FreeBSD/SMP: 1 package(s) x 1 core(s) x 2 HTT threads
FreeBSD/SMP: 1 package(s) x 1 core(s) x 2 HTT threads
coretemp0: <CPU On-Die Thermal Sensors> on cpu0
coretemp1: <CPU On-Die Thermal Sensors> on cpu1
  • sysctl -a | grep temp
    • あれれ?dmesgで該当デバイスを認識しているのは間違いのだけど、何故か動作しないなあ。
  • kldload coretemp
    • あれれ?こちらだとちゃんと表示される。一体何なんだ?/boot/loader.confの記述はしてもしなくても同じだし、何かがおかしくなっているのかな。
    • まあ、とりあえずは再起動したらこの呪文を唱えることにすればよいのだけど、安定稼働しだしたら再起動なんて一年単位でしないマシンなので、一年後にこのことを覚えていられるかどうかが最大の不安だ。
sysctl -a | grep temp
hw.usb.template: 0
dev.cpu.0.temperature: 40.0C
dev.cpu.1.temperature: 40.0C
dev.coretemp.0.%desc: CPU On-Die Thermal Sensors
dev.coretemp.0.%driver: coretemp
dev.coretemp.0.%parent: cpu0
dev.coretemp.1.%desc: CPU On-Die Thermal Sensors
dev.coretemp.1.%driver: coretemp
dev.coretemp.1.%parent: cpu1

RRDTool

rrdtool create
rrdtool create usbrh.rrd                            \
               --start "08/01/2010 00:00"           \                               
               --step 300                           \
               DS:TEMPERATURE_CPU:GAUGE:600:U:100   \
               DS:TEMPERATURE_HDD:GAUGE:600:U:100   \
               DS:TEMPERATURE_ROOM:GAUGE:600:U:100  \
               DS:HUMIDITY:GAUGE:600:U:100          \
               RRA:AVERAGE:0.5:1:1200               \
               RRA:AVERAGE:0.5:6:1400               \
               RRA:AVERAGE:0.5:24:1550              \
               RRA:AVERAGE:0.5:288:1594             \
               RRA:MAX:0.5:1:1200                   \
               RRA:MAX:0.5:6:1400                   \
               RRA:MAX:0.5:24:1550                  \
               RRA:MAX:0.5:288:1594                 \
               RRA:MIN:0.5:1:1200                   \
               RRA:MIN:0.5:6:1400                   \
               RRA:MIN:0.5:24:1550                  \
               RRA:MIN:0.5:288:1594                 \
               RRA:LAST:0.5:1:1200                  \
               RRA:LAST:0.5:6:1400                  \
               RRA:LAST:0.5:24:1550                 \
               RRA:LAST:0.5:288:1594
rrdtool update
  • 基本は、rrdtool update UNIXTIME:DS1:DS2:DS3:DS4の形にデータを持ってくればよい。DS1がCPU温度、DS2がHDD温度、DS3が室温、DS4が湿度。
    • DS1はcoretemp + sysctlにて取得する。
sysctl -h dev.cpu.0.temperature | sed -e "s/dev.cpu.0.temperature: \(.*\)C/\1/g"
    • DS2はsmartctlにて取得する。
      • /usr/ports/sysutil/smartctl
      • コマンド実行にroot権限が必要。
      • 最近のsedってすごいんだな。perl互換の正規表現なんて使えるようになってるんだ。
smartctl -A /dev/ad4 | grep "194 Temperature_Celsius" | sed -e "s/.\{87\}\(.*\) (Lifetime .*)/\1/g"
    • DS3とDS4はusbrhにて取得する。
      • zshの変態仕様のおかげで結構楽できました。
      • 配列扱えるわ、小数扱えるわ、演算は分かりやすいわ、調べてみれば数学用のライブラリなんてものまで持ってるとか。
      • 配列の第一要素へのアクセスが、[0]でなくて[1]なのは何かの思想なんだろうか。
RESULT=(`/usr/local/bin/usbrh -1 | sed -e "s/Temperature: \(.*\) C Humidity: \(.*\) %/\1 \2/g"`)
TEMPERATURE_ROOM=${RESULT[1]}
HUMIDITY=${RESULT[2]}
    • 全部纏めるとこんな感じ。とりあえず、rrdtool updateまで。
#! /usr/local/bin/zsh

(( TEMPERATURE_CPU  = 0.0 ))
(( TEMPERATURE_HDD  = 0.0 ))
(( TEMPERATURE_ROOM = 0.0 ))
(( HUMIDITY         = 0.0 ))

TEMPERATURE_CPU=`sysctl -h dev.cpu.0.temperature | sed -e "s/dev.cpu.0.temperature: \(.*\)C/\1/g"`

TEMPERATURE_HDD=`smartctl -A /dev/ad4 | grep "194 Temperature_Celsius" | sed -e "s/.\{87\}\(.*\) (Lifetime .*)/\1/g"`

RESULT=(`/usr/local/bin/usbrh -1 | sed -e "s/Temperature: \(.*\) C Humidity: \(.*\) %/\1 \2/g"`)
TEMPERATURE_ROOM=${RESULT[1]}
HUMIDITY=${RESULT[2]}

rrdtool update /home/cutxout/public_html/usbrh/usbrh.rrd N:$TEMPERATURE_CPU:$TEMPERATURE_HDD:$TEMPERATURE_ROOM:$HUMIDITY
rrdtool graph
  • 暫定的にこんなデザインで動かしはじめました。色とグラフの組み合わせはいじってみると面白そうだ。今後の課題に。
  • MRTGと同様にdaily, weekly, monthly, yearlyにする場合、--startのパラメータを調整するだけで残りは同じ。
--start=-173100 
--start=-605100
--start=-3629100
--start=-31536000
rrdtool graph   /home/cutxout/public_html/usbrh/usbrh-day.png                      \
               --imgformat=PNG                                                     \
               --start=-173100                                                     \
               --end=-300                                                          \
               --base=1000                                                         \
               --height=200                                                        \
               --width=600                                                         \
               --title="Temperature and Humidity (Daily)"                          \
               --vertical-label="Celsius / Percent"                                \
               DEF:a="/home/cutxout/public_html/usbrh/usbrh.rrd":TEMPERATURE_CPU:AVERAGE         \
               DEF:b="/home/cutxout/public_html/usbrh/usbrh.rrd":TEMPERATURE_HDD:AVERAGE         \
               DEF:c="/home/cutxout/public_html/usbrh/usbrh.rrd":TEMPERATURE_ROOM:AVERAGE        \
               DEF:d="/home/cutxout/public_html/usbrh/usbrh.rrd":HUMIDITY:AVERAGE                \
               AREA:a#00663B:"CPU  Temperature"                                    \
               GPRINT:a:MAX:"MAX\:%5.2lf %S"                                       \
               GPRINT:a:MIN:"MIN\:%5.2lf %S"                                       \
               GPRINT:a:AVERAGE:"AVERAGE\:%5.2lf %S"                               \
               GPRINT:a:LAST:"LAST\:%5.2lf %S\n"                                   \
               AREA:b#009959:"HDD  Temperature"                                    \
               GPRINT:b:MAX:"MAX\:%5.2lf %S"                                       \
               GPRINT:b:MIN:"MIN\:%5.2lf %S"                                       \
               GPRINT:b:AVERAGE:"AVERAGE\:%5.2lf %S"                               \
               GPRINT:b:LAST:"LAST\:%5.2lf %S\n"                                   \
               AREA:c#00CC77:"ROOM Temperature"                                    \
               GPRINT:c:MAX:"MAX\:%5.2lf %S"                                       \
               GPRINT:c:MIN:"MIN\:%5.2lf %S"                                       \
               GPRINT:c:AVERAGE:"AVERAGE\:%5.2lf %S"                               \
               GPRINT:c:LAST:"LAST\:%5.2lf %S\n"                                   \
               LINE2:a#00663B:                                                     \
               LINE2:b#009959:                                                     \
               LINE2:c#00CC77:                                                     \
               LINE1:d#C90929:"ROOM Humidity   "                                   \
               GPRINT:d:MAX:"MAX\:%5.2lf %S"                                       \
               GPRINT:d:MIN:"MIN\:%5.2lf %S"                                       \
               GPRINT:d:AVERAGE:"AVERAGE\:%5.2lf %S"                               \
               GPRINT:d:LAST:"LAST\:%5.2lf %S\n"

感想

  • RRDToolは食わず嫌いの典型例だったようだ。一見複雑怪奇なコマンドラインアプリにありがちな反応だけど、マニュアルを片手にいじり倒してみると、複雑なのはその通りとしか言いようがないですわ。
  • こういうグラフはExcelでは作れないので、簡単に作れるようにしておくと便利そうなきがする。手持ちのデータを使おうとしたときの最大の問題は、リポジトリにデータを収納するところなんだよな。
  • はまりかけたのは、UNIXTIMEの扱い。Nが現在時刻を表すことと、-300のような表記が許されることに気づけなかったら、使うのを諦めていたと思う。
  • zshも10年以上使ってきた割には、シェルスクリプトを組んだのは初めてだったりする。これを機に、ちょっとだけ勉強してみることにしましょう。

zshの本 (エッセンシャルソフトウェアガイドブック)

zshの本 (エッセンシャルソフトウェアガイドブック)