2012年09月22日

【Matplotlib】温度とFAN回転率解析「ipmiSensor9.py」リリース

 「HP ProLiantサーバー ML110 G7の各温度とFAN回転率推移解析の為に手掛けた「ipmiSensor」作成で必要な「Matplotlib」上の機能について一通り理解出来たので、一つの区切りとして、ここに掲載公開する。
 「Matplotlib」は例えば時系列の副目盛のラベルの回転や、主目盛との併記時の位置合わせ等の様に、オブジェクトに入れ子で包含される個別のインスタンスに対しメソッドを実行することで変更が可能になるものもあり、かゆい処に手が届く様になるには、相応に実行で生成されるインスタンスのクラス構造をマニュアル等で調べ包含されるオブジェクトのメソッドを知ることが不可欠となる。「ipmiSensor.py」では、それらの処理を関数内に組込み、「Matplotlib」の仕様を認識しなくとも、その引数に値を指定するだけで望みの見栄えを追求出来る様に努めている。その仕様は未だ汎用化には程遠い出来だが任意の時系列期間をレンジとして、その期間内に含まれるDB上のデータを折れ線グラフとしてプロットする用途に限定すれば、それ程不自由しない程度にはなったと思う。
 尚、ソースコードの既定の変数を変更せずとも、コマンドオプションとして数値と文字列であれば変数に指定することも出来る。但し、セキュリティ的視点での制限は一切加えていないので今後は適宜変数個別に展開して行く方が望ましいだろう。因みにグラフ化する時系列範囲はstartとendで、凡例の゜配置や列数をl_locationとl_colで指定すると以下の様になる。



[root@www mire]# date; ./ipmiSensor9.py start="2012-09-19 05:55:01" end="2012-09-22 05:55:01" l_col=8 l_location="lower center"
2012年 9月 22日 土曜日 00:13:41 JST
l_col=8
l_location=lower center
HP_ProLiant_ML110_G7_Sensors_Graph_2012-09-19_055501__2012-09-22_001001
2012-09-22 05:55:01
2012-09-19 05:55:01
tm_range= 3 days, 0:00:00
1日〜3日: 1日〜3日: 副目盛は毎時の「時」表示
処理時間: 0:00:03.862130
[root@www mire]#
「HP ProLiant ML110 G7 FANと温度(via ipmi & lm_sensors)」2012-09-19 05:55:01〜2012-09-22 05:55:01

 さて、現状はその程度だが、今後はこの「ipmiSensor.py」のコードは、長期の時系列範囲のグラフは、crondのスクリプトとして定期作成する形で、時々刻々変わる当日分についてはCGIスクリプトとして、Webアクセス時に作成する形で活用することにする。そこで現在は全定義関数を同一ソースコードに置いているが、今後は共通定義分をモジュールとしてsite-packagesに置き、それを各スクリプト側でimportする形の利用となる予定だ。

 「ipmiSensor9.py」のソースコードは以下の通り。(2012-09-22追記: 0.0.9a 凡例背景等の透明度設定を追加した。)
            ~/ipmiSensor9.py (前半)


#!/usr/bin/python2.6
#!/usr/bin/python2.6
#-*- coding: utf-8 -*-
u"""
スクリプト利用
===============

ipmitool sensorで得られるセンサー値をDBにcrondで蓄積、グラフ化


定義関数群
==========

:sensors() : ipmitool sensorで得られるセンサー値を辞書として数値listで返す関数
:prn_sensors() : ipmitool sensorのデータをコンソール出力(sensors()動作check用)
:names_dic() : センサーIDに対する表示名の辞書を返す関数
:query_datas() : DB上のDataを読込む関数
:ins_db() : ipmitool sensor で得られるセンサー値をDBに書込むモジュール
:mk_graph() : DB上のDataをグラフ化する関数
:set_ticks_label(): 目盛ラベルの各種設定値の変更


グラフ化可能な時系列の範囲
==========================

西暦100年1月1日0時〜9900年12月31日23時59分59秒

:datetime.datetime() : 西暦 1年1月1日 〜 9999年12月31日
:datetime.strptime() : 西暦1000年1月1日 〜 9999年12月31日
:自作strptime()関数 : 西暦 1年1月1日 〜 9999年12月31日(未使用)
:Firebird timestamp型: 西暦 100年1月1日 〜 32768年 2月29日
:matplotlib/dates.py : 西暦 100年1月1日 〜 9900年12月31日 """

__author__ = "Mire in Japan"
__date__ = "2012-09-22"
__version__ = '0.0.9a'
__copyright__ = 'Copyright (c) 2012-07-27 Mire'
__license__ = 'GPL'
__url__ = 'http://pythonlife.seesaa.net/article/293580501.html '

__todo__ = u"""
1. 済: 取り敢えず、crondで定期的にDBにぶち込んだデータを取出しグラフ化する初期バージョンを作成
2. 済: DB,pythonコード処理でどの程度速度的に有利かを比較し最適なものを採用: id個別queryとする!!
3. 済: OpenIPMI-python活用によるメリットを探る: ん、探しあてたsampleも動かぬ。深追いせず(笑)。
4. 生成グラフX軸の時系列目盛を期間により多段で変更する様に
5. NET-SNMPの情報活用を附加
6. NET-SNMP-python活用によるメリットを探る
7. RRD的なデータ処理附加の検討
8. Ninoの様なシステム化の可能性を探る"""
__history__ = """
0.0.7 2012-08-25 【機能拡張】期間による目盛間隔の自動調整(副目盛の活用)
Y軸目盛線とグラフ秒が重なる場合に副目盛間隔一つ分進める
【初期設定】ほぼ全ての埋込み初期設定値を関数の引数に変更しカプセル化
グラフ出力期間をstartとendのコマンドオプションで指定可能に
【処理改善】DB Connectionを大元で生成、関数の引数渡しとし生成負荷を低減
0.0.8 2012-09-20 【機能改善】生成グラフX軸の時系列目盛を期間により適切に変更する様に
目盛ラベルの各種設定値の変更を関数化
【障害対策】指定センサーの一部または全てにデータが無い場合の対処加筆
【コメント】mireのpythonコード恒例通り、ほぼ全行コメントで埋め尽くした。
【初期設定】単純な数値と文字列変数についてコマンドオプションで指定可能に
0.0.9 2012-09-21 【Clean Up】Blog掲載制限回避の為、コメントや不要な記述を整理
0.0.9a 2012-09-22 【機能拡張】画像背景色と透明度、凡例背景の透明度設定を追加"""

def sensors():
u"""
ipmitool sensor で得られるセンサー値を
辞書として数値リストで返す関数
"""
from os import popen
# ipmitool sensor > /tmp/result_of_ipmitool_sensor.txt を実行
result_txt = "/tmp/result_of_ipmitool_sensor.txt"
cmd_ipmi_Sensor = "ipmitool sensor > %s" % (result_txt)
pp = popen(cmd_ipmi_Sensor, 'r')
pp.close()

# /tmp/result_of_ipmitool_sensor.txt を
#linesに読込み
fpi = open(result_txt, "r")
lines = fpi.readlines()
fpi.close()

# 各行をリストにして、itemsリストに挿入する
items=[]
for l in lines:
#print l,
itms = l.split('|')
#print itms
item = []
for itm in itms:
i = itm.strip()
try:
i = float(i)
except:
#print 'Error:', item
pass
if i == 'degrees C':
i = u'°C'
elif i == 'unspecified':
i = '%'
elif i == 'discrete':
i = u' '
elif i == 'na':
i = 'N/A'
elif i == 'nc':
i = '(NC)'
elif i == '0x0':
i = 0
item.append(i)
items.append(item)
#print items
#itemname, value, unit, na, na, na, threshold, critical
#makes item files or stdout for other management system
Sensor = {}
for itm in items:
Sensor[itm[0]] = itm[1:]
return Sensor

def prn_sensors():
u"""
ipmitool sensorのデータをコンソール出力
"""
# 関数Sensors()を実行し、項目: 値 単位を表示 ℃
datas = sensors()
#print datas
keys = datas.keys()
keys.sort()
item_name = ('測定項目', '測定値', '単位', '判定', '閾値', '危急')
print '%-24s: %-10s %-4s %-8s %-9s %-9s' % item_name
for k in keys:
s = '%-20s:' % ('\''+k+'\'')
try:
s = s + ' %7.3f' % (datas[k][0])
except:
s = s + ' %-7s' % (datas[k][0])
try:
s = s + ' %-4s %-6s %7.3f %7.3f' % (datas[k][1], datas[k][2]
, datas[k][7], datas[k][8])
except:
s = s + ' %-4s %-6s %7s %7s' % (datas[k][1], datas[k][2]
, datas[k][7], datas[k][8])
print s

def ins_db(datas, now, dsn='127.0.0.1:default.fdb'
, user='SYSDBA', password='pass', charset='UTF-8'):
u"""
ipmtool sensorの吐くデータと測定日時をDB書込み
"""
import fdb # Firebird接続にfdbを活用
conn = fdb.connect(dsn=dsn, user=user, password=password, charset=charset)
cur = conn.cursor()
#print 'datas=', datas
skeys = datas.keys()
skeys.sort()
for key in skeys:
sql_select_id = 'SELECT SENSOR_ID FROM SENSOR WHERE SENSOR_NAME=\'%s\';'
#print key
cur.execute(sql_select_id % (key))
sensor_id = cur.fetchone()
if sensor_id:
sql_ins='INSERT INTO SENSOR_LOG (YMD_HMS, SENSOR_ID, SVALUE) VALUES (\'%s\', %d, %f);'
try:
cur.execute(sql_ins % (now, sensor_id[0], datas[key][0]))
conn.commit()
except:
print 'Error: %s ,%s, %s, %s' % (sql_ins, now, sensor_id[0], datas[key][0])
conn.close()

def names_dic(dsn='127.0.0.1:default.fdb', user='SYSDBA', password='pass'
, charset='UTF-8', conn=None, cur=None):
u"""
センサーIDに対する表示名の辞書を返す関数
"""
names={}
import fdb # Firebird接続にfdbを活用
if cur==None:
if conn==None:
conn = fdb.connect(dsn=dsn, user=user, password=password, charset=charset)
create_conn_in_func = True
else:
create_conn_in_func = False
cur = conn.cursor()
else:
create_conn_in_func = False
sql_qry = 'SELECT a.SENSOR_ID, a.SENSOR_NAME, a.DISP_NAME FROM SENSOR a'
cur.execute(sql_qry)
datas = cur.fetchall()
if create_conn_in_func==True:
conn.close()
for data in datas:
names[data[0]]=data[-1]
return names

def query_datas(sensor_ids=[], dsn='127.0.0.1:default.fdb', user='SYSDBA', password='pass'
, charset='UTF8', start='', end='', conn=None, cur=None, debug=0):
u"""
DB上のDataを読込む関数
"""
import fdb # Firebird接続にfdbを活用
from datetime import datetime
if debug>0:
st = datetime.now()
if cur==None:
if conn==None:
conn = fdb.connect(dsn=dsn, user=user, password=password, charset=charset)
create_conn_in_func = True
else:
create_conn_in_func = False
cur = conn.cursor()
else:
create_conn_in_func = False

if len(sensor_ids)==1: # 単一IDのwhere条件なら
sql_qry = """SELECT b.YMD_HMS, b.SVALUE FROM SENSOR a
LEFT OUTER JOIN SENSOR_LOG b ON a.SENSOR_ID=b.SENSOR_ID
WHERE a.SENSOR_ID=%d""" % (sensor_ids[0]) + """%s%s
ORDER BY b.YMD_HMS;"""
elif len(sensor_ids)>1: # 複数IDのwhere条件有りなら、IDを附加したqueryで全て一括取得
wheres=[]
for id in sensor_ids:
wheres.append('a.SENSOR_ID=%d' % (id))
whereis=' or '.join(wheres)
sql_qry = """SELECT b.YMD_HMS, b.SVALUE, b.SENSOR_ID FROM SENSOR a
LEFT OUTER JOIN SENSOR_LOG b ON a.SENSOR_ID=b.SENSOR_ID
WHERE %s""" % (whereis) + """%s%s
ORDER BY b.YMD_HMS;"""
else: # IDのwhere条件無しなら
sql_qry = """
SELECT b.YMD_HMS, b.SVALUE FROM SENSOR a
LEFT OUTER JOIN SENSOR_LOG b ON a.SENSOR_ID=b.SENSOR_ID
WHERE %s%s
ORDER BY b.YMD_HMS;"""
if not len(start.strip())==0:
ws = ' and b.YMD_HMS>=\'%s\'' % (start)
else:
ws = ''
if not len(end.strip())==0:
we = ' and b.YMD_HMS<=\'%s\'' % (end)
else:
we =''
#print sql_qry % (sensor_ids, ws, we)
cur.execute(sql_qry % (ws, we))
datas = cur.fetchall()
if create_conn_in_func==True:
conn.close()
if debug>0:
et = datetime.now()
print 'query_datas():', et - st
return datas

def set_graph_params(subplot, major_format=None, minor_format=None
, major_locator='day', major_by=None, major_interval=1, major_bymonthday=1
, minor_locator='hour', minor_by=None, minor_interval=1, minor_bymonthday=1
, yearmonth=1, yearday=1, tz=None

, major_label=None
, major_fontcolor=None, major_fontsize=None, major_fontfamily=None
, major_fontstyle=None, major_fontstretch=None, major_fontweight=None
, major_rotation=None, major_dy=0, major_horizontalalignment=None
, major_verticalalignment=None

, minor_label=None
, minor_fontcolor=None, minor_fontsize=None, minor_fontfamily=None
, minor_fontstyle=None, minor_fontstretch=None, minor_fontweight=None
, minor_rotation=None, minor_dy=0, minor_horizontalalignment=None
, minor_verticalalignment=None

, lines_width=None, markers_size=None
):
u""""
目盛設定を行なう関数
主副目盛に指定の時系列LocatorとDateFormatterの各引数を指定し設定
* 目盛ラベル文字列が不要な場合はNoneのままで
*
"""
import matplotlib.dates as mdates #日時様式[for DateFormatter,HourLocator, etc...]

if not major_format==None:
subplot.xaxis.set_major_formatter(mdates.DateFormatter(major_format)) #主目盛ラベル様式
if not minor_format==None:
subplot.xaxis.set_minor_formatter(mdates.DateFormatter(minor_format)) #副目盛ラベル様式

if major_by==None: #主目盛のlistによる間隔指定がないなら、intervalで間隔指定を優先
if major_locator=='second':
subplot.xaxis.set_major_locator(mdates.SecondLocator(interval=major_interval, tz=tz))
elif major_locator=='minute':
subplot.xaxis.set_major_locator(mdates.MinuteLocator(interval=major_interval, tz=tz))
elif major_locator=='hour':
subplot.xaxis.set_major_locator(mdates.HourLocator(interval=major_interval, tz=tz))
elif major_locator=='day':
subplot.xaxis.set_major_locator(mdates.DayLocator(interval=major_interval, tz=tz))
elif major_locator=='month':
subplot.xaxis.set_major_locator(mdates.MonthLocator(bymonthday=major_bymonthday
, interval=major_interval, tz=tz))
elif major_locator=='year':
subplot.xaxis.set_major_locator(mdates.YearLocator(base=major_interval
, month=yearmonth, day=yearday, tz=tz))
else: #そうでないなら、major_byのlistによる間隔指定を優先
if major_locator=='second':
subplot.xaxis.set_major_locator(mdates.SecondLocator(bysecond=major_by
, interval=1, tz=tz))
elif major_locator=='minute':
subplot.xaxis.set_major_locator(mdates.MinuteLocator(byminute=major_by
, interval=1, tz=tz))
elif major_locator=='hour':
subplot.xaxis.set_major_locator(mdates.HourLocator(byhour=major_by
, interval=1, tz=tz))
elif major_locator=='day':
subplot.xaxis.set_major_locator(mdates.DayLocator(bymonthday=major_by
, interval=1, tz=tz))
elif major_locator=='month':
subplot.xaxis.set_major_locator(mdates.MonthLocator(bymonth=major_by
, bymonthday=major_bymonthday
, interval=1, tz=tz))
elif major_locator=='year': #yearではmajor_byは無いが、馬鹿避けで重複記載
subplot.xaxis.set_major_locator(mdates.YearLocator(base=major_interval
, month=yearmonth, day=yearday, tz=tz))

if minor_by==None: #副目盛のlistによる間隔指定がないなら、intervalで間隔指定を優先
if minor_locator=='second':
subplot.xaxis.set_minor_locator(mdates.SecondLocator(interval=minor_interval, tz=tz))
elif minor_locator=='minute':
subplot.xaxis.set_minor_locator(mdates.MinuteLocator(interval=minor_interval, tz=tz))
elif minor_locator=='hour':
subplot.xaxis.set_minor_locator(mdates.HourLocator(interval=minor_interval, tz=tz))
elif minor_locator=='day':
subplot.xaxis.set_minor_locator(mdates.DayLocator(interval=minor_interval, tz=tz))
elif minor_locator=='month':
subplot.xaxis.set_minor_locator(mdates.MonthLocator(bymonthday=minor_bymonthday
, interval=minor_interval, tz=tz))
elif minor_locator=='year':
subplot.xaxis.set_minor_locator(mdates.YearLocator(base=minor_interval
, month=yearmonth, day=yearday, tz=tz))
else: #そうでないなら、minor_byのlistによる間隔指定を優先
if minor_locator=='second':
subplot.xaxis.set_minor_locator(mdates.SecondLocator(bysecond=minor_by
, interval=1, tz=tz))
elif minor_locator=='minute':
subplot.xaxis.set_minor_locator(mdates.MinuteLocator(byminute=minor_by
, interval=1, tz=tz))
elif minor_locator=='hour':
subplot.xaxis.set_minor_locator(mdates.HourLocator(byhour=minor_by
, interval=1, tz=tz))
elif minor_locator=='day':
subplot.xaxis.set_minor_locator(mdates.DayLocator(bymonthday=minor_by
, interval=1, tz=tz))
elif minor_locator=='month':
subplot.xaxis.set_minor_locator(mdates.MonthLocator(bymonth=minor_by
, bymonthday=minor_bymonthday, interval=1, tz=tz))
elif minor_locator=='year': #yearではminor_byは無いが、馬鹿避けで重複記載
subplot.xaxis.set_minor_locator(mdates.YearLocator(base=minor_interval
, month=yearmonth, day=yearday, tz=tz))
set_ticks_label(ticks=subplot.xaxis.get_major_ticks(), label=major_label
, dy=major_dy, rotation=major_rotation
, fontcolor=major_fontcolor, fontsize=major_fontsize
, fontfamily=major_fontfamily, fontstyle=major_fontstyle
, fontweight=major_fontweight, fontstretch=major_fontstretch
, horizontalalignment=major_horizontalalignment
, verticalalignment=major_verticalalignment)
set_ticks_label(ticks=subplot.xaxis.get_minor_ticks(), label=minor_label
, dy=minor_dy, rotation=minor_rotation
, fontcolor=minor_fontcolor, fontsize=minor_fontsize
, fontfamily=minor_fontfamily, fontstyle=minor_fontstyle
, fontweight=minor_fontweight, fontstretch=minor_fontstretch
, horizontalalignment=minor_horizontalalignment
, verticalalignment=minor_verticalalignment)
if not lines_width==None:
## 各要素のマーカーSizeと線幅を太くし視認性を高める ##
lines = subplot.get_lines()
if not markers_size==None:
for l in lines:
l.set_markersize(markers_size)
l.set_linewidth(lines_width)
else:
for l in lines:
l.set_linewidth(lines_width)
else:
if not markers_size==None:
lines = subplot.get_lines()
for l in lines:
l.set_markersize(markers_size)

def set_ticks_label(ticks, label=1, dy=0, rotation=None
, fontcolor=None, fontsize=None #, fontproperties=None
, fontfamily=None, fontstyle='normal'
, fontweight='normal', fontstretch='normal'
, horizontalalignment=None, verticalalignment=None):
u"""
目盛ラベルの各種設定値の変更
(ここで必要なもののみコーディング。目盛ラベルに対する全てを網羅してはいない)
【使い方】
ticks = subplot.xaxis.get_major_ticks()
chgtick(ticks=ticks, label=1, color=None, verticalalignment)
"""
from matplotlib.font_manager import FontProperties
ticks_font = FontProperties(family='times new roman', style='normal'
, size=12, weight='normal', stretch='normal')

for tick in ticks:
if label==2: #適用対象がlabel1なら
ticklabel=tick.label2 # tick.label2
else: #それ以外は
ticklabel=tick.label1 # tick.label2
if not fontsize==None:
tick.label.set_fontsize(fontsize) #目盛ラベル文字列の文字Size
if not fontcolor==None:
ticklabel.set_color(fontcolor) #目盛ラベル文字列の文字色
if not fontfamily==None:
tick.label.set_fontproperties(FontProperties(family=fontfamily #目盛ラベル文字列の
, style=fontstyle, weight=fontweight, stretch=fontstretch)) #フォントプロパティ
if not verticalalignment==None: #目盛ラベル文字列の
ticklabel.set_verticalalignment(verticalalignment) #垂直方向の位置合わせ
if not horizontalalignment==None: #xdate_horizontal_alignment()
ticklabel.set_horizontalalignment(horizontalalignment) #が優先され無効
if not rotation==None:
ticklabel.set_rotation(rotation) #目盛ラベル文字列の傾け角
if not dy==0: #Y座標を増減し主目盛ラベルの
ticklabel.set_position([0, dy]) #配置を縦方向にずらす
続きを読む
posted by Mire at 00:20 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

2012年09月16日

【自宅サーバ構築】10. HP ProLiant ML110 G7温度&FAN回転率解析結果

 自宅サーバ運用では発熱とそれに伴うFAN回転上昇による騒音が生活空間の質を低下させることにつながることが最大の課題となる。またFAN回転上昇は当然その分電力消費量の上昇にもつながるので昨今の反原発キャンペーンによる電力需給逼迫下では省エネにも努めたいところである。

 当方も、この暑い夏の間、色々と対策をしつつ、例のipmiSensor.pyで連続計測を行なって来たのだが、昨今では、秋台風の到来や秋雨前線による雨が増え酷暑の残暑は終焉した模様で、FAN回転数が最高の78.4%になることがなくなったので、これ迄の解析結果を一例として、ここに掲載する。
 数値自体は「HP ProLiant ML110 G7 OSレスモデル 6473360-AHZN」内のセンサーをcrondで採取したものだが、示す数値は設置環境を主要因として決まる。またサーバ機CPUの種類や省エネ設定やCPU稼働率、そしてメモリーやHDD、拡張ボード等の装着状況次第でも様相が大きく変わるものだ。当方では「HP ProLiant ML110 G7 OSレスモデル 6473360-AHZN」(Celeron G530 2.4GHz)に Memory 4G bite, HDD x3を実装し、BIOSでCPU周波数制御をOSに渡し、CentOS6.3標準のCPUSpeed制御の様なkernel制御?に委ねている為、未公開の低負荷状態では概ね最低ステップの1.6GHzの省エネ優先運転となっている。サーバ機を設置しているのは木造2階建ての1階南西角の居室で南東の角の1階にあるが、夏場は家の屋根と南側の隣家の影になることから南側の窓から日が射すことはほとんどないが南側の窓は下方にガラリのついた雨戸を締め輻射熱の侵入を防いでいる。ただ西側は小さな庭を挟み4m幅の公道となっていたりで視界が開けているので西陽だけは容赦なく射してくる。これにはレースと厚手のカーテンで防いでいる。この南側と西側の窓は共に網戸ごしに開放、北角の部屋の入口も開けっ放すことで可能な限り自然換気が出来る様にしている。
 尚、途中からは西側窓の外側にすだれを掛けて日差しを軽減したり、サーバー機の表側に1Lのペットボトルに水を入れたものを3本置き、その水の蓄熱放熱効果で急激な気温変動を低減させる試みをしている。ペットボトル自体が厳密どの程度効果があるのかは判らないが、PCが示す気象の気温に比べ±2度程度低減されている。単体での測定のみで一切比較対象がないのでその検証は他の方の記録に頼るしかない。そこん所、どなたか宜しく ^_^;/


 只、ipmiSensor.pyによる自動測定開始自体は既に回転数が上がりFAN騒音が気になり始めてからの泥縄対応だった為、今夏の全てを網羅出来ていなかった。しかし幸いハンド処理で「date; sudo ipmitool sdr」や「date; sudo ipmitool sensor」を実行したコンソール出力のLogを取得していたので、これらをDBにハンド入力することで早朝気温21度であった7月上旬のころ迄遡り、データ補完させて頂いた。ハンド入力の部分は不定期な間隔での測定なので、マーカーが離れている箇所はサンプリング不足で時々の変動推移とピーク値を表していない。当方の設置場所では早朝の日の出の時刻に最低気温となり日没の時刻頃に最高気温となり各センサー値が変動することを考慮してご覧頂きたい。続きを読む
posted by Mire at 15:15 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

2012年08月06日

【Matplotlib】温度とFAN回転率解析「ipmiSensor4.py」動作せず!!

 前稿「【自宅サーバ構築】9. HP ProLiant ML110 G7で温度とFAN回転率解析」で掲載の首記の「ipmiSensor4.py」が、以下のエラーを吐き突然動かなくなってしまった。



[root@localhost mire]# ./ipmiSensor4.py
/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_gtk.py:621: DeprecationWarning: Use the new widget gtk.Tooltip
self.tooltips = gtk.Tooltips()
0:00:05.943514
[root@localhost mire]# ./ipmiSensor4.py
/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_gtk.py:621: DeprecationWarning: Use the new widget gtk.Tooltip
self.tooltips = gtk.Tooltips()
0:00:05.975883
[root@localhost mire]# ./ipmiSensor4.py
No protocol specified
Traceback (most recent call last):
File "./ipmiSensor4.py", line 365, in
, password=password, charset=charset, start=start, end=end)
File "./ipmiSensor4.py", line 221, in mk_graph
import matplotlib.pyplot as plt #\u30b0\u30e9\u30d5\u63cf\u753b
File "/usr/lib64/python2.6/site-packages/matplotlib/pyplot.py", line 78, in
new_figure_manager, draw_if_interactive, show = pylab_setup()
File "/usr/lib64/python2.6/site-packages/matplotlib/backends/__init__.py", line 25, in pylab_setup
globals(),locals(),[backend_name])
File "/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_gtkagg.py", line 10, in
from matplotlib.backends.backend_gtk import gtk, FigureManagerGTK, FigureCanvasGTK,\
File "/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_gtk.py", line 8, in
import gtk; gdk = gtk.gdk
File "/usr/lib64/python2.6/site-packages/gtk-2.0/gtk/__init__.py", line 64, in
_init()
File "/usr/lib64/python2.6/site-packages/gtk-2.0/gtk/__init__.py", line 52, in _init
_gtk.init_check()
RuntimeError: could not open display
[root@localhost mire]#

続きを読む
posted by Mire at 01:08 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

2012年07月27日

【自宅サーバ構築】9. HP ProLiant ML110 G7で温度とFAN回転率解析

 ここの所気温が急激に上昇し、HP ProLiant ML110 G7 OSレスモデル 6473360-AHZNのファンの音が気になる様になってしまった。記載の順番で言うとOSのinstallと前後してしまうが、HP ProLiant ML110 G7 OSレスモデル 6473360-AHZNの仕様を明確にする意味でも、気温や各温度センサーの値とファンの回転との相関関係を明らかにすることが必要と考えるので、時系列的に前後することになるが、HP ProLiant ML110 G7 OSレスモデル 6473360-AHZNにおけるセンサー温度とファンの回転率の取得と管理について先行して記述させて頂くことにする。

 気温とサーバ機本体の各パーツの発熱量の変動により、ファンの回転数や消費電力は変動する。また、HP ProLiant ML110 G7の場合は、PCIX2ボードを増設することでも、担当区画のFanの回転数が上昇することが知られている。自宅サーバとしての利用では、生活環境の質と固定費負担(省エネ)の観点からとても重要なポイントであるので、ファンの音が騒音として聞こえないことと部屋が暑くならないことがとても大切である。

 最近の気温上昇で28度を超えた辺りから多少うるさく感じる様になった。そこで、入れたてCentOS6上で計測することにし、急遽、その仕組みを自作して試た。

 仕組みとしては結論とし唯一成功したIPMI経由でのセンサー値を5分置きにcrondで、「ipmitool sensor > /tmp/result_of_ipmitool_sensor.txt」の実行を含むpythonコードで、Firefird2.5上のDBとして蓄積、それをPython製のMatlabもどきのMatplotlibを使いグラフ化し、各測定値の相関性を診るもので、MRTGやRRDTOOL等の様にデータ量抑制の考えは、まだ取り入れていないのであくまで暫定的なものである。
 また、ipmitool sensorの吐くデータが回転数は浮動小数点、温度は整数ピッチとなっているが、これは簡易に全てfloatでDBに記録することにしたし、ipmitool sensorの吐くセンサー数や種類は固定で変動しないことを前提にしているので、利用に当たっては、ipmitool sensor事前に実行し、当方の出力結果と比較しDB上のセンサー名管理マスターにその差異を反映させる必要がある。以下が当方のHP ProLiant ML110 G7での出力である。各行の頭にある名称をデータ識別のキーとしているので、その差分を反映頂きたい。
 センサー値の取得には、snmp, lm_sensors, hddtemp, ipmi等があるが、今回の当方のHP ProLiant ML110 G7での試行では、有効なセンサー値はipmiのみでしか取得出来なかったし、さらに残念なことにCPUとHDDの温度については有効な値を取得出来ていない。当方のHP ProLiant ML110 G7 OSレスモデル 6473360-AHZNのCPUは消費電力65WのCeleron G530 2.4GHzで、消費電力と発熱の大半をもたらすものであるが、常に固定の50℃を吐いてくれている。kernel対応の問題もあるとは思うがとても残念なことである。HDDの温度については、RAIDを組まなければS.M.A.R.T情報が有効なので、内蔵RAIDのドライバーの問題と認識している。続きを読む
posted by Mire at 14:35 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

2012年07月03日

【自宅サーバ構築】8. HP ProLiant ML110 G7サーバ機 Smart Update他

 さて、ここ迄来ると気もはやり、直ぐにでもOSのinstallをしたいところだか、そうは問屋が卸さない。自宅サーバ構築と言うことで、稼働目標が有って無い様なものなので購入から随分と経ってしまった為、Firmwareやら何やらと大量にUpdateされてしまっているので、先ずは、HPのサイトからDLし、DVD等を焼く必要が出てしまったのである。2012-06-04に大量に改訂されたからである。
 従って、今回のCentOS6.2のinstallには「HP ProLiantサーバー ML110 G7」同梱のディスクは一切使わず、ダウンロードして、自前で焼いたCD/DVDで対処することになった。今回、「HP ProLiantサーバー ML110 G7」へのOSのinstall時に当方が必要なものは、OS install前のFirmwareのUpdate用に「Smart Update Firmware DVD」、内蔵RAIDを活用する為の設定用に「Smart Start CD」、そして、CentOS6.2のinstall時に使う「HP SmartアレイB110i SATA RAIDコントローラー ドライバー ディスケット for Red Hat Enterprise Linux 6(AMD64/EM64T)」である。本稿では、それらのダウンロード、ディスクの作成、そしてFirmwareのupdate迄を記述する。
続きを読む
posted by Mire at 02:06 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

2012年07月01日

【自宅サーバ構築】7. HP ProLiant ML110 G7サーバ機 内蔵HDDの取付

 前稿で触れた通り、ユーザデータ保持用に同容量のHDDを2台購入した。本稿は、それをHP ProLiantサーバー ML110 G7への取付けについての記述である。続きを読む
posted by Mire at 11:17 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

【自宅サーバ構築】6. HP ProLiant ML110 G7サーバ機 パーティション設計

 「HP ProLiantサーバー ML110 G7」を買ってからの泥縄の仕様決めでかなり時間が経過したが、ようやく設計計画が完成した(笑)。Windowsなら原則同じHDDの単一パーティションに導入するので関係ないが、Linuxの場合は各ディレクトリの用途性質を踏まえて、上手く分割することでバックアップ等の日常保守と障害時の修復作業を効率的に行なうことが出来る上に、運転時の負荷分散効果による安定化等のむメリットが期待出来るからで、具体的動機は以下の通りだ。
  •  デバイスイメージはアンマウントしてからバックアップする必要がある。その為、起動中のLinux自身のアンマウントは出来ないので、通常はシャットダウン後、Knoppix等の他のLinuxを起動させ実施することになる。サーバの場合停止タイミングは、カーネルやその主要ライブラリのupdate等、再起動が必要となることを実施した際となるので、稼働中のアンマウントが100%適わない「/」と「/boot」はできるだけ小さなパーティションに収めたい。
  •  「/usr」「/opt」等システム変更やupdateしない限り変更しない領域、「/var」「/tmp」といったシステムとしてデータを書き込まれる領域、そして「home」等ユーザの要求で書込みが行なわれる領域をパーティション分けすることで、バックアップを効率的に行なうと共に、不慮のシステム障害結果を生まない様にしたい。例えば、ユーザのデータ書込みで、HDDが一杯になったりするとlogが取れなくなったり、一時ファイルの書込みが出来ず一部システムが異常停止したり、HDDのデフラグ進行でサーバ動作が緩慢になる事態を想定頂きたい。各領域を隔離すれば、少なくとも具体的障害内容は単純化されるのだ。無論、空き領域も分割され個別領域の余裕は、単一パーティションよりは厳格に見積もる必要が出る。
  • 当面、冗長化の為のサーバを準備出来ないので、せめて、別HDDに同データのバックアップを取る形で対応したい。
  • ユーザデータはシステムデータと異なり、サーバ管理者単独で再構築不可能なので、Webの動的データや「/home」等のユーザデータはRAIDによる冗長化で運転時の保全性を高めると共にストレージ分割でHDDのヘッドアクセスの競合による動作遅延を軽減したい。
  • 障害時や保守時の起動Linuxも別途installし、その折の暫定運転の確保と、相互にバックアップ作業時に活用したい。
続きを読む
posted by Mire at 02:58 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

2012年05月10日

【自宅サーバ構築】5. HP ProLiant ML110 G7サーバ機 BIOS設定

 BIOS設定は、通常ならOSのinstallや新たな拡張ボード等のパーツを装着する際にしか開くことがないし必要は無い。しかしサーバ機は一度稼働させると管理者の都合のみで頻繁に停止するわけには行かないので、構築時に予めどのような設定が可能でその既定値がどうなっているかを確認して置いた方が良いだろう。

 BIOS設定は他と大差なく、起動時に指定のキーを押すことで行なうが、HP ProLiantサーバー ML110 G7の場合は「F9」キーをタイムアウトしない間に押下する。

続きを読む
posted by Mire at 15:55 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

2012年05月03日

【自宅サーバ構築】4. 作業用KNOPPIX/CentOS Live & Install Diskの作成

 前稿では、HP ProLiantサーバー ML110 G7の通電テストでKNOPPIX6.7.1のDVDを活用した。本稿ではその作成方法を記述すると共に、同様の作業方法となるCentOS6.2のInstall DVDの作成方法を記載して置く。
 KnoppixやCentOS6.2 Live DVDを挿入してbootすると、そのOSをinstallせずに、そのOSを起動することが出来る。そうすることで、そのOSとの相性をチェックしたり機能を体感出来る。
 前稿では、最初から日本語表示となる使い慣れたKnoppixを使いHDDの初期状態の確認を行なったが、動チェックであれば、CentOS6.2 Live DVDの方が適していただろうし、既に、他の調査も終え、CentOS6.2の導入を決めているので、ついでにCentOS6.2のinstall DVDと Live DVDを作成した。
 install以後は、正式なrescueなら、install DVDのrescueモードだが、何らかの動作比較をしたいならCentOS6.2 Live DVDを持っておくことも無駄ではないと思う。
 尚、CentOS6.2 Live DVDは残念ながら、英語版なので表示の違いから同じ様にとは行かない面もあり、それを補完する意味でも、使い慣れたKnoppixは当方にとっては必須である。

 それでは、お題に入る。続きを読む
posted by Mire at 03:58 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

2012年05月02日

【自宅サーバ構築】3. HP ProLiant ML110 G7サーバ機の通電チェック

 サーバ機の仕様を調べて試るとけっこう時間がかかるものだ。実際には通電させてから随分なるが、不確実な記録を残すことを良しとは思えなかったので、記載が遅れた。漸く、iLO 3も含めた仕様確認が終わり、OSのinstall仕様もまとまったので、本稿では、手記の「サーバ機の通電チェック」について記述させて頂く。

 「【自宅サーバ構築】2. HP ProLiant ML110 G7サーバ機仕様確認」では、サーバ機の外観と書面でのチェックは完了したので、HP ProLiantサーバー ML110 G7に通電してのチェックを行なった。
 目的は、OS install 前のHDD設計の為、HDDの初期状態を確認すると共に、電源ON時のファン騒音と振動とBIOS設定を確認することにある。

 単純にOSマシンとするならHDDの初期状態は一切無視して、ドライブ初期化でも良いが、PCにより管理ツールを格納する領域として第一パーティションを占有していることも多い。この場合、チェックツール類をOS install後に使いたくなった場合には諦めなくてはならなくなる。その様なパーティションがあるときは、予めddコマンドでイメージバックアップを取っていつでも初期状態を復元出来る様にすることにしている。

 また、BIOSについては、サーバ構築前に知っておいた方が良いものもある上、実地で調べるには電源を立ち上げた時にのみ可能となるので、稼働してからは難しくなる。調べるのはいつするのか、そう今しかないと言うことだ。

 尚、これ以外には、「iLO 3」と「BIOS設定」については稿を改めて記す。これを経て、初めてサーバOSの設計に移ることになる。会社の仕事だとこんなに悠長には出来ないが、所詮自己責任の自宅サーバなので、サーバ機仕様をじっくりと把握して設計することにした次第だ。
続きを読む
posted by Mire at 19:32 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

2012年04月03日

【自宅サーバ構築】2. HP ProLiant ML110 G7サーバ機仕様確認

 用途にもよるだろうが、普通のPC端末に対しOSを入れサーバー化する場合は、結局その時の気分や成り行き次第で行き当りバッタリの構築作業としがちだ。その結果完成したはずのサーバーは、Install時の記録が不完全で何を何時どうしたのかということが不明確なまま、取り敢えず動くから使っていると言う結構いい加減な運用管理に入ってしまうのだ。このやり方でもPC端末の用途なら、これを起因ととする不利益は全てその端末利用者である自分にかかるので自業自得ともいえるし、直接他人へ迷惑をかけることはない。
 しかし、サーバー専用機では状況異なるのだ。PC端末と比して運用時には管理者がサーバー機を直接操作することは稀であり、精々手元に置いている場合にサーバーの外観を見て悦に入ったり(笑)する以外はSSHやVNCから定期的にログチェックを行なうくらいのものである。逆にサーバー専用機は、サーバーを意識しないユーザ側による24時間365日無休利用を原則とすることが多いのではないだろうか。
 その為、サーバー構築体制としては、先ずは万が一でも障害発生しない様に万全を期し、それでも障害発生した場合にも早期の復旧を図るべく自動定期バックアップやHDDの適正な空き容量の維持等の手当てをしたり、SNMP等で適正な監視の仕組みを作り上げ異常に早く気付き対処出来る様にしたりして、少しでも障害状態を短時間に抑え込むべく努力すべきであり、それでもどうにもならない場合の代替策準備して置くことになる。今回の採用したサーバー専用機「HP ProLiantサーバー ML110 G7」の場合、エントリー系のタワー型サーバー機にも関わらず、例えば、サーバーの正面と背面には、ラック型サーバ機と同じ様に「UIDスイッチ」という階段の照明スイッチと同じ回路のトグルスイッチでボタンの青色LEDが点灯消灯するものが付いている。用途は複数のサーバが並んでいる時に表で点灯させてから背面に回り対象機器を誤らずに特定する為だけのものだが、サーバーというのは、その機器の傍にはいない人に影響を与えるものなので、こんな駄目押し対策の積重ねが何よりも大切なことだと考える。尚、これはiLO3の操作でも点灯するし操作が可能なので、サーバ室の要員と連携する使い方も考えられる。

 従って今回は、開梱して外観の検収がすんでも直ぐにOSのInstallはしない。先ずはサーバ専用機「HP ProLiant ML110 G7」の提供する仕様の把握に努めて、その内容を有効活用したサーバ構築を可能にしたいと思う。ということで、気分的には暫くはお勉強タイムとなる。HPのサーバ専用機は、かつて業者構築のものを使ったことはあるが構築経験はない。そして最後に専用機でサーバー構築を行なって、もう4年゜近くなる。その頃はも技術的にもまだPCIが主流でPCI-Xという規格のカードも存在し紛らわしかったし、HDDもまだIDEとSCSIが沢山売られていた。ても、今ではPCIeやSATAが完全にデファクトスタンダードの地位を占めている。

購入時に仕様を調べるのは、カタログだが、購入後は実機とマニュアルの両方が手元にあるのでそれを見ながら進めることになる。マニュアル嫌いで多少判らなくてもやって試るてから調べることが好きな当方も今回は判る範囲でマニュアルを参考にする。ああ、気が重い(あぁふぅー)

HP ProLiantサーバー ML110 G7  Documentation CD 尚、マニュアルは前稿のURLからでも引くことが出来るが、添付の4. ドキュメンテーションCD(「HP ProLiant ML110 G7 Documentation CD」と記述)からでも、file:///media/HP/docindjpn.html 経由でWeb上のマニュアルのURLを辿ることは出来る。当方は、これをLinuzPC上で以前紹介した100均のSDカードをさしたUSBメモリーアダプタにDLし、Android タブレット ICONIA A500の外部SDにコピーし手軽に閲覧出来る様にした。そうは言ってもマニュアル嫌いなので、マニュアルを全部読む訳ではないが、漏れを少なくする為に、本稿では、以下マニュアルにそって確認して行くことにする。
続きを読む
posted by Mire at 14:14 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする

2012年03月30日

【自宅サーバ構築】1. HP ProLiant ML110 G7発注と開梱検収




 元々は昨年の今頃には構築していた予定だったが、今月の確定申告後、年間収支を検討し、自宅サーバの運営も金銭面で何とかなりそうなので、最初の行動として先ずはサーバ専用機を購入しLinuxでサーバ構築することにした。

 結論でいうと、今は悲しいかな金銭的余裕がそれ程ないし、今回の自宅サーバーの初代機はある意味でプロトタイプ版とも言えるので、サーバとして基本的な性能を持つ最安値のものを物色し、「HP ProLiant ML110 G7 OSレスモデル 6473360-AHZN」(右写真)とその対応メモリー「センチュリー マイクロサーバー/ワークステーション用 PC3-10600/DDR3-1333 2GB ECC 240pin DIMM CD2G-D3UE1333」を3/28早朝に発注した。それが28日夕刻に発送されたので、通常国内配達でもよく物流拠点で一泊くらいすることが多いので土日当たりの配達だろうと思っていたたところ、早いもので、29日昼の時間指定通り配達されて来た。

 以下に、後日の為、今回の仕様決定と発注、開梱検収について記録して置く。続きを読む
posted by Mire at 07:03 | Comment(0) | TrackBack(0) | 自宅サーバ構築管理 | このブログの読者になる | 更新情報をチェックする
月額見放題1,000円開始キャンペーンバナー(画像ありver)
紺碧の艦隊 ルパン三世 GREAT CHASE クリックプロモーション
<< 2013年01月 >>
    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    
カテゴリ
タグクラウド
ファン
利用中のオープンソース
最近のコメント
最近の記事
過去ログ
QRコード
レガシーなアプリはいかが?
Dell 法人のお客様ページ
  • 【法人様向け】デル、お得なキャンペーン情報
  • 法人のお客様向け ストレージソリューション
  • 法人のお客様向け ネットワークソリューション
  • 【SOHO法人様向け】デル・オンライン広告限定ページ
  • デル-個人のお客様ページ
  • 【個人のお客様向け】デル・オンライン広告限定ページ
  • オンライン広告限定キャンペーンページ
  • ソフトウェア&周辺機器 パソコン工房
    ツートップインターネットショップ(twotop.co.jp) マウスコンピューター/G-Tune
  • ×

    この広告は1年以上新しい記事の投稿がないブログに表示されております。