再現調査

お昼ぐらいオフィスに行って事前に下調べしてあった iostat-tool の不具合修正をする。

前職でディスクI/Oの振る舞いを調査していたときに iostat のアウトプットを直接みてもわからないので視覚化するツールを作った。例えば、iostat -ymxt 1 のアウトプットは次のようなログになる。

06/13/2018 02:10:50 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.47    0.00    0.24    0.18    0.00   99.11

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdd               0.07    45.88    1.57    0.59     0.08     0.18   246.55     0.26  121.04    1.28  436.94   2.07   0.45
sdh               0.07    45.78    1.59    0.60     0.08     0.18   245.64     0.22  101.97    1.17  367.51   1.89   0.41
sdb               0.25    74.42    5.70    0.87     0.57     0.29   268.00     0.32   49.24   38.06  123.00   1.83   1.20
sdg               0.07    45.84    1.57    0.60     0.08     0.18   246.12     0.26  118.32    1.24  426.10   2.05   0.44
sdc               0.10    46.79    1.62    0.63     0.09     0.19   246.47     0.16   72.62   11.13  232.29   1.39   0.31
sde               0.07    45.79    1.56    0.60     0.08     0.18   246.16     0.21   98.68    1.10  351.50   1.83   0.39
sdj               0.07    45.88    1.56    0.60     0.08     0.18   245.68     0.21   95.91    1.07  341.03   1.80   0.39
sdf               0.07    45.76    1.58    0.60     0.08     0.18   245.70     0.19   85.95    1.03  308.11   1.79   0.39
sdk               0.07    46.68    1.56    0.61     0.08     0.18   247.68     0.28  128.43    1.25  455.92   2.17   0.47
sdi               0.07    45.67    1.57    0.60     0.08     0.18   244.58     0.21   96.74    1.11  344.99   1.84   0.40
sda               0.16    15.06    0.15    1.95     0.01     0.07    72.69     0.13   61.45    3.77   65.84   8.24   1.73

当時 rhel6 相当のディストリビューションで検証していた。そのため、その iostat のバージョンしかテストしてなかった。その後、時間が経って新しい項目が増えたり、同じ項目でも名前が変わったりしたみたい。vagrant で bento/centos-8 の環境を構築して man iostat や iostat のアウトプットを出力しながら確認した。

CentOS 8.3 の systat 11.7.3 のバージョンのアウトプットはこんな感じ。

09/26/21 03:35:19
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00    1.00

Device            r/s     w/s     rMB/s     wMB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
sda              1.00    0.00      0.01      0.00     0.00     0.00   0.00   0.00    1.00    0.00   0.00     8.00     0.00   2.00   0.20

時刻のフォーマットが違う

これは sysstat のバージョンによるものではないけど、ロケールの LC_TIME のエンコーディング指定を変えると時刻のフォーマットが変わることに気づいた。これも en 環境しかチェックしてなかったから今回 ja でも正しく時刻をパースできるように修正した。

old: 06/13/2018 02:10:50 PM  # LC_TIME="en_US.UTF-8"
new: 09/26/21 03:35:19       # LC_TIME="ja_JP.UTF-8"

Device の軽微な変更と項目の変更

新しいフォーマットだと Device: のコロン文字がなくなってたりしてパースできなくなっていた。あと次の項目が名前変更、または新規追加されてた。

  • aqu-sz
  • rareq-sz
  • wareq-sz
  • %rrqm
  • %wrqm

基本的にパーサーをいじる必要はなくて項目の追加などで対応できた。当時、検証していたとき、作業がうまくいってなくて2-3日で突貫で作ったツールなのでパーサーはあまりきれいに実装はされていない。作った本人がみても1-2時間デバッグしながら直す必要があった。今後も iostat のアウトプットに大きな変更があるとは思えないからまぁいいかな。

generator-based coroutines の deprecated

このツールを作った当時、python 3.4 以上をサポートする必要があったの generator-based coroutines で実装した気がする。それが 3.8 以降は deprecated になっているみたい。今回保守するときにサポート対象を 3.6 以上に変更したのですべて async def で書き直せるようになった。そう急ぐ必要もないのでまた今後、気が向いたら async 周りの実装も見直しながらやってみる。覚えていたら。

Deprecated since version 3.8, will be removed in version 3.10: Use async def instead.

https://docs.python.org/ja/3/library/asyncio-task.html#asyncio.coroutine

iostat-tool 0.3.0 リリース

2018年から約3年ぶりに保守した。ついでに GitHub Actions で lint check と doctest の CI を実行するように変更した。