ablog

不器用で落着きのない技術者のメモ

Linux の iostat の出力結果を銀行のATMに例えて説明してみる

vmstat の"r"列とマクドナルドのレジカウンター - ablog の iostat 版です。
以前、iostat の見方 - ablog というエントリを書きましたが、

絵で見てわかるOS/ストレージ/ネットワーク~データベースはこう使っている (DB Magazine Selection)

絵で見てわかるOS/ストレージ/ネットワーク~データベースはこう使っている (DB Magazine Selection)

P.176 LIST 1 Linuxのiostat -x 30の出力結果を分析
を元に説明してみます。

$ iostat -x 30
avg-cpu:  %user   %nice %sys %iowait  %idle
          15.46    0.23  3.70 45.05    35.55

Device:   rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s    rkB/s   wkB/s  avgrq-sz avgqu-sz   await  svctm  %util
hda         2.77    5.26  34.36 39.29   619.26   462.68   309.63  231.34     14.69     1.47   19.90   7.58  55.85

これを銀行のATMに例えて説明してみるとこんな感じです。

イメージがわくと、いろいろと見えてきます。

  • rsec/s が1秒間に読み込んだセクタ数ということはこれにセクタサイズを掛ければrkB/sになるはず。
619.26(rsec/s) * 512(byte) = 317061.12(byte) = 309.63(kB)
  • wsec/s についても同様のことが言えるはず。
462.68(wsec/s) * 512(byte) = 236892.16(byte) = 231.34(kB)
  • avgrq-sz が1回のI/Oあたりのセクタ数ということはこれにセクタサイズとIOPS(r/s + w/s)を掛けると rkB/s + wkB/s になるはず。
14.69(avgrq-sz) * 512(byte) * (34.36(r/s) + 39.29(w/s)) = 553942.272(byte) = 540.95925(kB) 
309.63(rkB/s) + 231.34(wkB/s) = 540.97(kB)

ほぼ同じ値になりますね。

(34.36(r/s) + 39.29(w/s)) * 7.58(svctm) = 558.267(ms) = 0.558267(sec)

となり、(r/s + w/s) * svctm は %util とほぼ同じ値になります。


人が作ったものは頭の中で分解して再構築してみると理解が深まりますね。


追記(2011/12/04):
iostat のソースコードSYSSTAT に行って、SYSSTAT から sysstat-10.0.3.tar.gz をダウンロードしたら見れました。

sysstat-10.0.3/iostat.c の line 607 を見てると、/proc/diskstats から情報を取ってるみたいですね。/proc/diskstats については

/proc/diskstats (Linux 2.5.69 以降)
このファイルには各ディスクデバイスのディスク I/O 統計情報が書かれている。更に詳しい情報は、カーネルソースファイル Documentation/iostats.txt を参照すること。

Man page of PROC

と書かれるので、http://www.kernel.org/doc/Documentation/iostats.txt を見てみたり、
Linux Kernel 2.6 のソースコードを見てみようと思って、

% git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

と実行してみたら、えらい時間かかるので(そりゃそうか)、
kernel/git/torvalds/linux.git - Linux kernel source tree
で見てみたり。
たまにはこんなことをしてみるのも面白いですね。



追記(2012/12/12):

"service time” is the time from when the request is given to the queue, and when the IO is completed.

Beware of Svctm in Linux’s Iostat