参考
- total disk data include virtual lvm device data (so doubling the calculated values)
- dstat-real dstat
- dstatが開発終了した話
- dool
- pcp-dstatのman
メモ
dstatのtotalが2倍?になる?という話があり簡単に確認。
結論
ディスク単位のI/Oを total に入れるべきなのだが、
正規表現上の仕様により、 xvda1
などのパーティション単位のI/Oも total に足されている。
実は、パーティションの値を取り除く正規表現ではあるのだが、当時の実装(※)としては
xvd で始まるディスク名に対応できていなかったようだ。
なお、その後、いくつか正規表現が改変されたような経緯がコミットログやGitHub
Issueから見られた。
※CentOS7等で採用されたdstat0.7.2のリリース時期は2010年ころ
事象の確認
環境情報の確認。
1 | [centos@ip-10-0-0-217 ~]$ uname -a |
dstat 0.7.2は2010年にリリースされたようだ。
1 | git log -1 --format=%ai 0.7.2 |
参考までにpcpのバージョン
1 | [centos@ip-10-0-0-217 ~]$ pcp --version |
ここから動作確認。
fioを実行。
1 | [centos@ip-10-0-0-217 ~]$ fio -rw=randwrite -bs=16k -size=1000m -iodepth=32 -directory=/tmp -direct=1 -invalidate=1 -runtime=300 -numjobs=8 -name=iotest -ioengine=libaio -group_reporting |
裏でdstatを実行
1 | [centos@ip-10-0-0-217 ~]$ dstat -td -D total,xvda ----system---- -dsk/total----dsk/xvda- |
およそ2倍になっている。
pcp-dstatだと?
1 | [centos@ip-10-0-0-217 ~]$ pcp dstat -td -D total,xvda |
ということで、2倍になっていない。
ちなみに、そもそもpcp-dstatは、上記のdstatとは全く異なる実装に見える。
doolだと?(2021/4/8時点のmasterブランチ)
1 | [centos@ip-10-0-0-217 Sources]$ ./dool/dool -td -D total,xvda |
ということで、dstatと同様。
関連する実装は?
dstat-real dstat の実装を確認する。
dstat_disk
クラスのコンストラクタに、後に用いられるフィルタ用の正規表現定義がある。
1 | 683 self.diskfilter = re.compile('^(dm-\d+|md\d+|[hsv]d[a-z]+\d+)$') |
この正規表現を利用する箇所はいくつかあるが、その一つが
total の値を計算するところ。
このフィルタにマッチしない場合に、 total
に足される計算になっている。
1 | 728 if not self.diskfilter.match(name): |
ここで正規表現の中身を見ると、例えば dm-0 、
sda1
のような「パーティション名」を表すものとマッチするようになっている。
つまり、 not 条件と合わせて、「パーティション名以外のものを
total に足す」という動作になる。
このとき、よく見ると、今回使用した環境で用いている、
xvda1 という名称は正規表現にマッチしないことがわかる。
したがって total に足されてしまい、なぜか
total
の表示が大きくなる、という事象が生じたと思われる。
total disk data include virtual lvm device data (so doubling the calculated values) にも似たような議論があるようだ。
doolの登場
dstatの源流は今はメンテされておらず、 dool が開発されている。
Dool is a Python3 compatible clone of Dstat.
また dstatが開発終了した話 に記載されているが、他にもpcp系列のdstatが残っている。
ただし、doolにおいても、正規表現は同じようなものだった。