7.15.2013

Yamahaルータのメモリリーク暫定対策pythonスクリプトを考えてみた

yamahaルータメモリリーク暫定対策





タイトルほど大層なものではないんだけど、ちょっと仕事絡みで依頼があったので簡単に考えてみることにした。


背景


どこのメーカーのルータでもそうなんだけど、OSとかファームのバグでメモリリークがあったりするんだけど、拠点数が多かったりすると、OSバージョンアップとかファームアップっていうのはめちゃめちゃハードルが高い。

というのも、ファームアップなりOSバージョンアップは結構な人的リソースなり時間なりっていうかなりのパワーをかけて作業しなければならないし、新OSでの業務確認なんかもステークホルダーとのネゴとか偉い人の説得とかまあめんどくさい。特に日本のような特殊なビジネススタイルだとね。

そんでもってリモートバージョンアップの場合は、失敗すると起動不可とかリプレースまで数時間の業務停止とか激烈めんどくさいオンサイト作業と謝罪とリカバリと再発防止策と・・・っていう「クソだる4拍子」で帰宅時間も遅くなってしまう。

この辺をメーカーの人は結構無視して(というか知らないフリして、というか割り切ってんだろうけど)、「ファームアップしてください」とか、無慈悲なバージョンアップ砲を発動してくるんだけど、実態としてはなかなかそんな自由に作業はできなかったりするので、致命的セキュリティリスクとかがなかったりすると、たいていの場合「まあ運用対処で頑張ろうぜ!」みたいな精神論に落ち着く



挙動を考える


そんなこんなの運用対処はメモリーリーク起こしてるルータだけ選り分けてリスタートをぶち込むっていう半沢直樹もびっくりの超攻撃的措置がいいのかなって思う。乱暴な感じもするんだけど、結局はこれが一番シンプルかつ低リスクで費用対効果も高い。というわけなので、pythonでそんなようなスクリプトを考えてみた。

yamahaルータの場合は、show environmentでメモリ使用率が確認できるので、このメモリ使用率にしきい値を設定して、一定の値を超えていた場合にrestartを叩き込むっていうのがシンプルでよさそう。

show environmentの出力サンプルはこちら。
yamahaルータメモリリーク暫定対策


show environmentの場合、boot timeとかmac addressとかその辺の不要なパラメータも出てしまうので、grepでmemoryの行だけを拾ってくるとよい。

show environment | grep CPUのサンプルはこちら。
yamahaルータメモリリーク暫定対策

画像の通り、grepをすることでだいぶいい具合になった。

grepは欲しいパラメータが含まれている行のキーワードをつかむと、その行全体を拾ってきてくれる。ciscoで言うところのincludeオプションみたいなもんですな。


挙動を決める


今回必要になるのはMemoryの部分なので、Memory部分の数値だけを拾ってきて、数値化してあげればいい。

スクリプトの動きとしてはこんな感じがいいかなあと思う。

1.上記の戻り値は行の右から拾ってきた方が目的の数値が拾いやすいので、拾ってきた文字列を右から数値部分のみを抜き出す(上の画像で言うところの28)。
2.拾ってきた数字は文字列なので、この28を数値型に変換。
3.数値に変換できたら、閾値を50に設定して、メモリが50%を超えていたらTrueをprintし、50%以下だとFalseをprintすることにする。



ソースを書いてみる


実際は50%以上だとadminに入ってrestartを叩くように書けばいいけど、今回はめんどくさいのでより分けだけで。

import telnetlib
# telnetでアクセス
tn = telnetlib.Telnet('IPアドレスを入れる')
tn.read_until('assword:')
tn.write('パスワードを入れる' + '¥r')
tn.read_until('>')
# show envして、メモリの行を拾ってくる
tn.write('show environment | grep CPU' + '¥r')
str_env = tn.read_until('used')
# str_memはshow envの数値
str_mem = str_env[-9:-6]
print '現在のメモリ使用率は' + str_mem + '%です'
int_str_mem = int(str_mem)
if int_str_mem > 50:
    print "True"
else:
    print "False"

実際にうちのRTX1100に対してスクリプトをまわしてみた結果はこんな感じ。
現在のメモリ使用率は 28%です
False

実際はこのprint 'False'のところにrestart関連の動作をぶち込むわけ。
再起動のしきい値は環境によっていろいろ変えてあげる必要があるのは、言わずもがな。



障害申告には気合いと根性で対応


結局再起動するので、その数分間は業務停止時間が出てしまうから、メンテナンスタイムにまわすか、夜間にまわすのが良さそう。

あとは、「なんか繋がらないよ」ってユーザ申告に「えぇ!ほっ、ほんとですかぁ!?」って答える演技力を最大限に高めれば、怖いものは何もありません。


僕は演技派です!(確信)


0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...