VMware ESXiホストを担う Lenovo x3650M5 サーバが、空調の切れる週末の日中に環境 温度 がしきい値を越えたことで、自動シャットダウンしていました。搭載されている IMM から各種 温度 やシステムの状態を定期的に取得し、 ThingSpeak へアップロードするスクリプトを急造しました。
オーバーヒートによる自動シャットダウン
週末や夜間には空調の切れる部屋に設置しているVMware ESXiホストが週明け出社してみるとオフラインに。他のホストは稼働しているので停電とも思えず、Lenovo x3650M5サーバ内蔵のIMMへアクセスしてイベントログを確認。
曰く、日曜の昼過ぎに環境温度がしきい値を越えたため、シャットダウンシーケンス発動…
現在の温度と共に実際のしきい値を確認すると、デフォルトで50℃とあるのでサーバの環境温度がこれを越えたということでしょう。ともあれ、現在の温度が正常に戻っているので、IMM越しにESXiホストを始動。
IMMからSSH越しに温度取得
今後に備えて、このサーバに対する定期的な温度監視をするに当たり、その観測手段としてまず思い付くのが、ブラウザではなくターミナル越しのIMMアクセスで便利なIMM CLIでした。
予め、IMMのWebUIの IMM Management → Security ページにある、 SSH Server タブでSSH Serverを有効にしておきます。
なお、IMMで使われるホストキーがだいぶ古いので、SSH接続試行時にまず、 no matching host key type found と突き返されるはずなので、アクセスの前にクライアント側の設定で例外許可を加えておきます。
|
1 2 3 |
Host 192.168.0.225 HostKeyAlgorithms ssh-dss,ssh-rsa PubkeyAcceptedAlgorithms +ssh-rsa |
SSHログイン後、各温度センサの状態は以下の要領で取得することができました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
system> temps Temperatures are displayed in degrees Fahrenheit/Celsius WR W T SS HS --------------------------------------------------------------------------------------- PCH Temp 203.00/95 212.00/100.00 143.60/62.00 221.00/105.00 230.00/110.00 Ambient Temp 102.20/39 109.40/43.00 82.40/28.00 116.60/47.00 122.00/50.00 RS1 RR Amb Temp 143.60/62 149.00/65.00 100.40/38.00 167.00/75.00 176.00/80.00 RS2 RR Amb Temp 143.60/62 149.00/65.00 104.00/40.00 167.00/75.00 176.00/80.00 MID1 RR Amb Temp 143.60/62 149.00/65.00 95.00/35.00 167.00/75.00 176.00/80.00 MID2 RR Amb Temp 143.60/62 149.00/65.00 95.00/35.00 167.00/75.00 176.00/80.00 RAID RR Amb Temp 143.60/62 149.00/65.00 100.40/38.00 158.00/70.00 167.00/75.00 PSU FR Amb Temp 134.60/57 140.00/60.00 89.60/32.00 158.00/70.00 163.40/73.00 CPU1 VR Temp 212.00/100 221.00/105.00 105.80/41.00 230.00/110.00 239.00/115.00 CPU2 VR Temp 212.00/100 221.00/105.00 111.20/44.00 230.00/110.00 239.00/115.00 DIMM AB VR Temp 212.00/100 221.00/105.00 93.20/34.00 230.00/110.00 239.00/115.00 DIMM CD VR Temp 212.00/100 221.00/105.00 93.20/34.00 230.00/110.00 239.00/115.00 DIMM EF VR Temp 212.00/100 221.00/105.00 93.20/34.00 230.00/110.00 239.00/115.00 DIMM GH VR Temp 212.00/100 221.00/105.00 93.20/34.00 230.00/110.00 239.00/115.00 CPU 1 Temp N/A N/A 116.60/47.00 N/A N/A CPU 2 Temp N/A N/A 123.80/51.00 N/A N/A |
何度か取得してみて分かったことは、センサから得られる温度値は摂氏の整数値までということ。摂氏からの変換値に過ぎない華氏に小数点以下があるのは、計測工学における有効数字の考え方からすると疑念も。
IMMからSNMPによる温度取得
IMM CLIで温度センサ値を容易に得られることは分かりましたが、ちょっと情報量が多くて定期的なモニタリングにおけるテキスト成形が手間なことから、計測値だけを得る手段として、SNMPのIMM-MIBを試してみようと思います。
まず、IMMのWebUIの IMM Management → Network ページにある、 SNMP タブで SNMPv1 と SNMPv3 を有効にした上で、コミュニティ名やユーザを適宜設定しておきます。
IMM-MIB (oid: 1.3.6.1.4.1.2.3.51.3 )の仕様はこちらのページを参考。
温度センサ関連の2つの oid を snmpwalk で読み取ってみました。
|
1 2 |
tempDescr : 1.3.6.1.4.1.2.3.51.3.1.1.2.1.2 tempReading : 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3 |
例えば環境温度だけを取得したければ、以下の要領でsnmpwalkを実行します。
|
1 2 |
$ snmpget -v 3 -l noAuthNoPriv -u USERID -Ovq 192.168.0.225 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.2 25 |
また、IMM WebUIログイン後に表示されるシステムの状態も、SNMP IMM-MIBの以下の oid で取得可能です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
currentSysPowerStatus [1.3.6.1.4.1.2.3.51.3.5.1.1.0] poweredOff(0), sleepS3(1), poweredOn(255) systemState [1.3.6.1.4.1.2.3.51.3.5.1.4.0] systemPowerOfforStateUnknown(0), systemPowerOnorStartingUEFI(1), systemInUEFI(2), uEFIErrorDetected(3), bootingOSorInUnsupportedOS(4), oSBooted(5), suspendToRAM(6) |
ThingSpeakへデータを上げるまで
ThingSpeakに新しいチャンネルを作成し、APIを通じた書き込みキーをコピーしておきます。
なお、ThingSpeakのチャンネル内には、最大で8つのフィールドを設定することができるので、今回は様々な温度の中から次のパラメータを選抜しました。
|
1 2 3 4 5 6 7 |
1: Ambient 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.2 2: PCH 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.1 3: CPU1 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.17 4: CPU2 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.18 5: RAID 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.7 6: currentSysPowerStatus 1.3.6.1.4.1.2.3.51.3.5.1.1.0 7: systemState 1.3.6.1.4.1.2.3.51.3.5.1.4.0 |
snmpwalk で必要なデータを集め、それらを curl でThingSpeak APIへ投げつけるシェルスクリプトを、突貫工事で製作。
|
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 |
#!/bin/bash # VARIABLES IMMHost=192.168.0.225 IMMUser=USERID TSapi=https://api.thingspeak.com/update TSkey=################## # FUNCTIONS function check_numeric () { # VALIDITY CHECK if [ $# != 1 ]; then echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"`] Function ERR: Too few arguments." 1>&2 return 1 fi # NUMERIC TEST expr "$1" + 1 >/dev/null 2>&1 if [ $? -lt 2 ]; then # Numeric return 0 else # Non-Numeric return 1 fi } ## AMBIENT snmpRes=`snmpget -v 3 -l noAuthNoPriv -u $IMMUser -Ovq $IMMHost 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.2` check_numeric $snmpRes [ $? -eq 0 ] && Amb=$snmpRes || Amb="" ## PCH snmpRes=`snmpget -v 3 -l noAuthNoPriv -u $IMMUser -Ovq $IMMHost 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.1` check_numeric $snmpRes [ $? -eq 0 ] && PCH=$snmpRes || PCH="" ## CPU1 snmpRes=`snmpget -v 3 -l noAuthNoPriv -u $IMMUser -Ovq $IMMHost 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.17` check_numeric $snmpRes [ $? -eq 0 ] && CPU1=$snmpRes || CPU1="" ## CPU2 snmpRes=`snmpget -v 3 -l noAuthNoPriv -u $IMMUser -Ovq $IMMHost 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.18` check_numeric $snmpRes [ $? -eq 0 ] && CPU2=$snmpRes || CPU2="" ## RAID snmpRes=`snmpget -v 3 -l noAuthNoPriv -u $IMMUser -Ovq $IMMHost 1.3.6.1.4.1.2.3.51.3.1.1.2.1.3.7` check_numeric $snmpRes [ $? -eq 0 ] && RAID=$snmpRes || RAID="" ## currentSysPowerStatus snmpRes=`snmpget -v 3 -l noAuthNoPriv -u $IMMUser -Ovq $IMMHost 1.3.6.1.4.1.2.3.51.3.5.1.1.0` check_numeric $snmpRes [ $? -eq 0 ] && SysPowerStatus=$snmpRes || SysPowerStatus="" ## systemState snmpRes=`snmpget -v 3 -l noAuthNoPriv -u $IMMUser -Ovq $IMMHost 1.3.6.1.4.1.2.3.51.3.5.1.4.0` check_numeric $snmpRes [ $? -eq 0 ] && systemState=$snmpRes || systemState="" ## THINGSPEAK curl -d "key=$TSkey&field1=$Amb&field2=$PCH&field3=$CPU1&field4=$CPU2&field5=$RAID&field6=$SysPowerStatus&field7=$systemState" "$TSapi" |
これを cron に登録して数分おきに実行するように設定、しばらく運用してみました。
さらに、スマートフォンアプリでThingSpeakウィジェットを作っておけば、いつでもどこでもサーバの状態を監視できるようになります。








