svctm * (r/s+w/s) is always 1000 if %util is 100%.

If %util is 100%, svctm is just 1 / (r/s + w/s) seconds, 1000/(r/s+w/s) milliseconds. This is an inverse number of IOPS. In other words, svctm * (r/s+w/s) is always 1000 if %util is 100%. So checking svctm is practically as same as checking r/s and w/s (as long as %util is close to 100%). The latter (IOPS) is much easier, isn't it?

Yoshinori Matsunobu's blog: iostat: (r/s + w/s) * svctm = %util on Linux

をちょっと検証してみた。

stress コマンドで I/O 負荷をかけつつ、

[root@www****** ~]# stress --hdd 2 --timeout 20s
stress: info: [4600] dispatching hogs: 0 cpu, 0 io, 0 vm, 2 hdd
stress: info: [4600] successful run completed in 21s

iostat を見てみると、

[root@www****** ~]# iostat -dx 1|perl -lane '/^vda/ and printf(qq/IOPS:%d, svctm:%d, util:%d, IOPS*svctm:%d\n/,$F[3]+$F[4],$F[10],$F[11],$F[3]+$F[4]*$F[10])'
IOPS:1225, svctm:0.82, util:100, IOPS*svctm:1008
IOPS:989, svctm:0.96, util:94, IOPS*svctm:949
IOPS:1368, svctm:0.67, util:92, IOPS*svctm:916
IOPS:439, svctm:2.28, util:100, IOPS*svctm:1000
IOPS:685, svctm:1.39, util:95, IOPS*svctm:952
IOPS:625, svctm:1.59, util:99, IOPS*svctm:993
IOPS:906, svctm:1.10, util:100, IOPS*svctm:996
IOPS:1536, svctm:0.64, util:98, IOPS*svctm:983
IOPS:832, svctm:1.19, util:99, IOPS*svctm:990
IOPS:1054, svctm:0.95, util:100, IOPS*svctm:1001
IOPS:952, svctm:1.01, util:96, IOPS*svctm:961
IOPS:1031, svctm:0.97, util:99, IOPS*svctm:1000
IOPS:1779, svctm:0.53, util:94, IOPS*svctm:942
IOPS:1238, svctm:0.81, util:99, IOPS*svctm:1002
IOPS:777, svctm:1.29, util:100, IOPS*svctm:1002
IOPS:1940, svctm:0.49, util:96, IOPS*svctm:950
IOPS:1335, svctm:0.71, util:94, IOPS*svctm:948
IOPS:869, svctm:0.99, util:85, IOPS*svctm:860

だいたいそんな感じになってる。