labunix's blog

labunixのラボUnix

稼働率についてbash+awkで計算してみた。

■稼働率についてbash+awkで計算してみた。

 参考

 高信頼システム構築標準教科書 - 仮想化と高可用性 -(Ver1.0.1)
 http://www.lpi.or.jp/linuxtext/system.shtml

■以下の5種類で稼働率が求められる。

 ・修理時間の合計=修理時間x故障回数
 ・稼働時間=あるべき稼働時間-修理時間の合計

 ・MTBF(Mean Time Between Failure
	システムが故障してから次に故障するまでの時間

  MTBF=稼働時間の合計/故障回数

 ・MTTR(Mean Time To Repair)
	故障したシステムの復旧に要する時間

  MTTR=修理時間の合計/故障回数

 ・稼働率=MTBF/(MTBF+MTTR)

■あるべき稼働時間を200h、故障回数を1回、修理時間に10hかかる場合の稼働率。

$ echo "あるべき稼働時間=,200h,故障回数=,1time,修理時間=,10h" | \
  awk -F\, '{print $2,$4,$6}' | \
  awk '{MTBF=($1-($2*$3))/$2;MTTR=($2*$3);print "あるべき稼働時間="($1/1) \
    "h,稼働時間="$1-MTTR"h,MTBF="MTBF \
    "h,MTTR="MTTR \
    "h,稼働率="(MTBF/(MTBF+MTTR))*100"%"}' | \
  sed s/","/"\n"/g
あるべき稼働時間=200h
稼働時間=190h
MTBF=190h
MTTR=10h
稼働率=95%

■「あるべき稼動時間」としたのは、
 メンテナンスやインシデント対応等の稼動しているだけでマイナスとなる要素を除く為である。

$ echo '240h,(10日)-メンテナンス=,1time,24h,+インシデント対応=,1time,16h' | \
  awk -F, '{print $1-($3*$4+$6*$7)"h"}'
200h

■あるべき時間を例えば以下のようにする。
 ※6時間のメンテナンスを月1回行う場合

$ echo "6 24" | awk '{print $1/$2"d"}'
0.25d

$ echo ",365d,メンテナンス,12time,0.25d" | awk -F\, '{print ($2-($4*$5))*24"h"}'
8688h

■あるべき稼働時間に対して故障率99%を目指す。
 故障回数を1回とすると、「MTBF/あるべき稼働時間=0.99」なので、

$ echo "あるべき稼働時間=,8688h,故障回数=,1time,修理時間=,86.88h" | \
  awk -F\, '{print $2,$4,$6}' | \
  awk '{MTBF=($1-($2*$3))/$2;MTTR=($2*$3);print "あるべき稼働時間="($1/1) \
    "h,稼働時間="$1-MTTR"h,MTBF="MTBF \
    "h,MTTR="MTTR \
    "h,稼働率="(MTBF/(MTBF+MTTR))*100"%"}' | \
  sed s/","/"\n"/g
あるべき稼働時間=8688h
稼働時間=8601.12h
MTBF=8601.12h
MTTR=86.88h
稼働率=99%


■また、MTTRは下記のように素因数分解できるのであれば、
 割り切れる範囲での故障回数に対しての修理時間が見積もれる。

$ echo "86.88" | tr -d '.' | factor
8688: 2 2 2 2 3 181

$ echo "86.88" | tr -d '.' | factor | \
  sed s/".*\: "// | sed s/" "/"\n"/g | sort -u | \
  for n in `xargs`;do echo "86.88 $n" | awk '{print $2"time",$1/$2"h"}'; done
181time 0.48h
2time 43.44h
3time 28.96h

■各目標は以下のように求められる。

$ echo `seq 0.990 0.001 0.999` | \
  for n in `xargs`;do echo "8688 $n" | \
    awk '{MTBF=($1*$2);MTTR=$1-MTBF;print $2,"MTBF="MTBF,"MTTR="MTTR}'; \
  done
0.990 MTBF=8601.12 MTTR=86.88
0.991 MTBF=8609.81 MTTR=78.192
0.992 MTBF=8618.5 MTTR=69.504
0.993 MTBF=8627.18 MTTR=60.816
0.994 MTBF=8635.87 MTTR=52.128
0.995 MTBF=8644.56 MTTR=43.44
0.996 MTBF=8653.25 MTTR=34.752
0.997 MTBF=8661.94 MTTR=26.064
0.998 MTBF=8670.62 MTTR=17.376
0.999 MTBF=8679.31 MTTR=8.688

$ echo "8.688 60" | awk '{print $1*$2"min"}'
521.28min

■Windows 2000やWindows XPシステムでは、デフォルトでは最大10分(600秒)となっている。

 参考

 2.ARPプロトコルの動作
 http://www.atmarkit.co.jp/fwin2k/network/baswinlan011/baswinlan011_03.html

■94つ並ぶフォーナインを目標とすると、年間52分ほどしか止められないことになる。
 例えば、「10分でクリアされるARPテーブルの再読み込み」が許されるのは5回まで。

$ echo `seq 0.9990 0.0001 0.9999` | \
  for n in `xargs`;do echo "8688 $n" | \
    awk '{MTBF=($1*$2);MTTR=$1-MTBF;print $2,"MTBF="MTBF,"MTTR="MTTR}'; \
  done
0.9990 MTBF=8679.31 MTTR=8.688
0.9991 MTBF=8680.18 MTTR=7.8192
0.9992 MTBF=8681.05 MTTR=6.9504
0.9993 MTBF=8681.92 MTTR=6.0816
0.9994 MTBF=8682.79 MTTR=5.2128
0.9995 MTBF=8683.66 MTTR=4.344
0.9996 MTBF=8684.52 MTTR=3.4752
0.9997 MTBF=8685.39 MTTR=2.6064
0.9998 MTBF=8686.26 MTTR=1.7376
0.9999 MTBF=8687.13 MTTR=0.8688

$ echo "0.8688 60" | awk '{print $1*$2"min"}'
52.128min

■ファイブナインだと、年間10分ほどしか止められないことになる。
 むしろ、同じIPで異なるMACアドレスの冗長化では許されないレベル。

 ※MACアドレスが変更されるフェイルオーバー、フェイルバックが発生すると、計2回で20分。
  フェイルバックしないとしてもARPテーブルの自動クリアに10分かかるので目標を達成できない。

$ echo `seq 0.99990 0.00001 0.99999` | \
  for n in `xargs`;do echo "8688 $n" | \
    awk '{MTBF=($1*$2);MTTR=$1-MTBF;print $2,"MTBF="MTBF,"MTTR="MTTR}'; \
  done
0.99990 MTBF=8687.13 MTTR=0.8688
0.99991 MTBF=8687.22 MTTR=0.78192
0.99992 MTBF=8687.3 MTTR=0.69504
0.99993 MTBF=8687.39 MTTR=0.60816
0.99994 MTBF=8687.48 MTTR=0.52128
0.99995 MTBF=8687.57 MTTR=0.4344
0.99996 MTBF=8687.65 MTTR=0.34752
0.99997 MTBF=8687.74 MTTR=0.26064
0.99998 MTBF=8687.83 MTTR=0.17376
0.99999 MTBF=8687.91 MTTR=0.08688

$ echo "0.08688 60" |  awk '{print $1*$2"min"}'
5.2128min