2006年8月31日

ディスクIO性能(2) - BonnieとIOZoneの比較

ディスクのスループットを測定する場合、メモリバッファの効果を考慮する必要がある。 そのため色々なベンチマークプログラムが開発されている。例えば、Bonnie, Bonnie++, iozone, Iometer 等々。

最初は何も考えずBonnie++やIOZoneで測定したが、測定結果がいまいち合点が行かない。 なので、ここ2週間ばかり追って見たところ、結論らしきものが出せた。

Bonnie++ について

Debian etch/sarge 共に 1.03a が含まれており、これが安定版である。 但し、Bonnie++ 2.0 を目指して開発はされているが2003年頃から更新が無く停滞している。

単体HDD、RAID0、RAID10、RAID5で測定したが、結果が毎回大きく異なる場合があり、怪しい。Unix 系ではwrite は遅延書き込みなので、fsyncを発行しないと書き込み完了までの時間が小さく測定されて、実際よりレートが高く算出されてしまう。1.03aのソースを見る限り、デフォルトではfsyncは発行されない、ただし、1.93c では既にデフォルトで最後にfsyncが発行されており、修正されている。但し、1.03aではfsyncを発行させるオプション'-b'をすれば良いらしい。(というか指定しなければ正しい結果は得られない、、、と思う。)

per-char IOテストではCPU利用率が50%以上になっており、イマイチDISK IO のベンチになっていない気がする。

起動したときの測定条件が全くでないのは、不親切だ。シーケンスIOのデフォルトのsizeが実メモリの2倍で、chunk size が 8M とかは、出してくれや、、、と思う。

参考例:4台のHDDでRAID0を組んだ場合

deep:~# bonnie -d /mnt/0 -n 0 -u root -b  
Using uid:0, gid:0.
Writing with putc()...done
Writing intelligently...done
Rewriting...done
Reading with getc()...done
Reading intelligently...done
start 'em...done...done...done...
Version  1.03       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
deep             1G 47805  96 63399  16 25138   5 40027  76 49522   4 289.1   0
deep,1G,47805,96,63399,16,25138,5,40027,76,49522,4,289.1,0,,,,,,,,,,,,,

結論

Bonnie++を使うならば、オプション'-b'を付けて測定する。per char IOテストは、CPU利用率が高い場合は信用しない。

IOZone

Bonnieと同じ測定条件を実行した場合、何故か読み込みレートが小さく測定される。 非常に困ったことに、単体HDDよりRAID0の読み込みレートが小さい値が出てくる。 感覚にそぐわない結果である。

vmstat,top等で鳥瞰して気づいたのだが、read_testの時に、iozoneのユーザCPU利用率が50%強で、かつ全体のCPU利用率が100%近い状態になっていた。つまり、RAID0で回すCPUも圧迫されていたので、読み込みレートが低くなる結果となったらしい。

IOZone のソースをザッと眺めると、毎回読み込んだデータのパターンが正しいかどうかをチェックするコード(verify_buffer)があった。ここが読み込み測定時にbusy-loopになってるので、読み込みリクエストの負荷がかけられないため、読み込みレートが低く検出されてしまうようである。これを無効になりする方法はなさそうである。

参考例:4台のHDDでRAID0を組んだ場合(上と同じ条件)

deep:~# iozone -s 1G -r 8M -i 0 -i 1 -U /mnt/0 -f /mnt/0/test -cez
        Iozone: Performance Test of File I/O
                Version $Revision: 3.263 $
                Compiled for 32 bit mode.
                Build: linux

        Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
                     Al Slater, Scott Rhine, Mike Wisner, Ken Goss
                     Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
                     Randy Dunlap, Mark Montague, Dan Million,
                     Jean-Marc Zucconi, Jeff Blomberg,
                     Erik Habbinga, Kris Strecker, Walter Wong.

        Run began: Wed Aug 30 15:47:24 2006

        File size set to 1048576 KB
        Record Size 8192 KB
        Include close in write timing
        Include fsync in write timing
        Cross over of record size disabled.
        Command line used: iozone -s 1G -r 8M -i 0 -i 1 -U /mnt/0 -f /mnt/0/test -cez
        Output is in Kbytes/sec
        Time Resolution = 0.000005 seconds.
        Processor cache size set to 1024 Kbytes.
        Processor cache line size set to 32 bytes.
        File stride size set to 17 * record size.
                                                            random  random    bkwd  record  stride                                  
              KB  reclen   write rewrite    read    reread    read   write    read rewrite    read   fwrite frewrite   fread  freread
         1048576    8192   66621   60917    30895    31054                                                                         

iozone test complete.

結論

IOZoneを使うならば、read系はテストは死ぬほど早いCPUを使わない限り、当てにならない。

総論

取り敢えず、bonnie++ 1.03c をオプション'-b'付きで測定に使い、シーケンシャルIOの結果のみを信用しよう。

課題

他のパラメータはどう読めば良いのだろう?

0 件のコメント: