dstat で iostat の await 相当を取る

※まだいじってる最中なので間違いが多分に含まれている可能性あり。というか多分間違ってます。ほとんど自分の備忘録。

dstat で await 相当を取るプラグインはそのままだと正しく動かなそうというお話。
python真面目に見たの初めてだったので苦戦した。。

  • プラグイン

https://github.com/dagwieers/dstat/blob/master/plugins/dstat_disk_wait.py
(修正してみたもの) https://github.com/mhnsr/work/blob/master/dstat_disk_wait.py

  • 出力のおかしいところ

何故か IO しているのに 0.0 が出る。iostat結果と全然合わない。

  • 分かったこと

await を計算しているところが long 同士で計算しているので計算結果も多分long。結果、小数点以下がバッサリ削られている。
rwait,wwait を try ~ except ZeroDivisionError の1ブロックで全部処理しているので、rwait,wwaitどちらか一方でもIOPS 0だと結果が 0 に塗りつぶされてしまう。

  • 現状のパッチ状態
diff -w dstat_disk_wait.py dstat_disk_wait.py.org
69,81c69,77
<                 rd_ios = self.set2[name][0] - self.set1[name][0]
<                 if rd_ios:
<                     rd_await = float((self.set2[name][1] - self.set1[name][1])) / float(rd_ios)
<                 else:
<                     rd_await = 0.0
<
<                 wr_ios = self.set2[name][2] - self.set1[name][2]
<                 if wr_ios:
<                     wr_await = float((self.set2[name][3] - self.set1[name][3])) / float(wr_ios)
<                 else:
<                     wr_await = 0.0
<
<                 self.val[name] = ( rd_await, wr_await )
---
>                 self.val[name] = (
>                     ( (self.set2[name][1] - self.set1[name][1]) * 1.0 )
>                     /
>                     ( (self.set2[name][0] - self.set1[name][0]) * 1.0 )
>                     ,
>                     ( (self.set2[name][3] - self.set1[name][3]) * 1.0 )
>                     /
>                     ( (self.set2[name][2] - self.set1[name][2]) * 1.0 )
>                 )
  • 残りの課題

この状態でテストしていると Readのみ、Writeのみの時の await 結果は iostat と大体一致するが、Read/Write を同時発生させた場合の rwait+wwait の数字が iostat の await とどうも一致しない。sysstat側ソースも単純に足し合わせている感じなので差の発生原因が不明。もう少し計算結果の正確性についてテストが必要そう。
sysstat 10.x 系で r_await, w_wait を出してみたところ、こちらの結果は大体あってる状態。なので累積させるところの計算式を見直せばいいか、もうこのままでも良いかなと思う。

とりあえずここまで。