シーケンシャルなI/Oの性能とI/Oのレコード処理単位の統計を取ってみた。使ったツールはdebian/etch に含まれている bonnie++ 1.03aと tiobench 0.3.3 である。
何回も測定すると値が大きく変動するのが気持ち悪いので、10回測定してベストとワーストを除いた8回分の平均を取るようにした。
環境
毎度のこと検証環境は、
- Athlon64X2 3800+ (但し、Single CPUとして制限)
- M2NPV-VM(GeForce6150+nForce 430MCP)
- メモリは512M(カーネルパラメータで制限)
- システム用のHDDで Segate ST3500630AS, SATA
- Debian/etch Linux-2.6.16
- Seagate ST340015A, 40GB, PATA UDMA100, 2MBキャッシュ, 5400 rpm の4台
HDDの設定
4台のHDDは hdparm を使い、下記の様に設定。
# hdparm -d 1 -c 3 -m 16 -W 1 -tT /dev/hda
/dev/hda:
setting 32-bit IO_support flag to 3
setting multcount to 16
setting using_dma to 1 (on)
setting drive write-caching to 1 (on)
multcount = 16 (on)
IO_support = 3 (32-bit w/sync)
using_dma = 1 (on)
Timing cached reads: 3936 MB in 1.99 seconds = 1973.79 MB/sec
Timing buffered disk reads: 130 MB in 3.03 seconds = 42.97 MB/sec
ファイルシステム
RAIDボリュームは 標準的な ext3 に初期化した。
測定コマンド
bonnie については、下記のコマンドを使用(/mntに対象ボリュームをマウント)。
# bonnie -u root -d /mnt -n 0 -f -b -s 1024:4
tiobench については、下記のコマンドを使用(/mntに対象ボリュームをマウント)。
# tiotest -t 1 -r 1 -T -d /mnt/0 -f 1024 -b 4096
上記はI/Oの単位ブロックサイズが 4096 bytes の場合。
測定
測定は、md で下記構成のRAIDボリュームに対して、bonnie++(1.03a)、tiobenc(0.3.3)を使い、I/Oの単位ブロックサイズ 1k,2k,4k,8k,16k,32k,64k,128k,256k,512k,1024kのシーケンシャルなread/write の性能を測定する。また、各測定に関して10回行いベストとワーストの値を除いた8回の平均を取った。
- RAID0 のHDDx1台(1u)。
- RAID0 のHDDx 2 台(2u-2ch)。但し、IDEの2チャンネルにそれぞれにHDDを割り当てる。
- RAID0 のHDDx 2 台(2u-1ch)。但し、IDEの1チャンネルのみにHDDを割り当てる。
- RAID0 のHDDx 3 台(3u)。IDEの片方のチャンネルに2台で一方に1台を割り当てる。
- RAID0 のHDDx 4 台(4u)。IDEの両方のチャンネルに2台を割り当てる。
- linear のHDDx 4 台(4u)。IDEの両方のチャンネルに2台を割り当てる。
結果
数値データはヘボヘボに長いのでグラフのみにした。
- bonnie++を使った場合、2u_1ch/3u/4uの seq. write の性能が単位ブロックサイズ 4k〜256kの間に緩やかに上昇している。512k移行は、tiobenchと同じ傾向になっている
- tiobenchを使った場合、seq. read/write 共に単位ブロックサイズ1k〜2kにおいて性能の落ち込んでいる
- 上記以外では、I/Oの単位ブロックサイズに性能が左右されてる傾向はない。
ふぅーむ。 よくよくI/Oスケジューラの性質を考えれば、Seq I/O性能はI/Oの単位ブロックサイズに性能が左右されないように思える。
- Seq. Write の場合、使用したファイルシステム ext3 は 1ファイルに対してなるべくシーケンシャルな順序でブロック割り当てられる可能性が高い。小さな単位のブロックサイズであっても遅延書き込みのため待たされたリクエストがマージ処理で併合され大きな単位のブロックサイズとして扱われるため、十分RAIDのチャンクサイズを超える。そのため書き込みは並列化される頻度が一様に高く、I/Oの単位ブロックサイズに性能が左右されずに一定(最大実効性能)になる。
- Seq. Read の場合、とっても簡単でI/Oスケジューラの設定でHDD単位で128kbytesの先読みが行われ、バッファキャッシュされるで、I/Oの単位ブロックサイズに性能が左右されずに一定になる。
うんで、 bonnie++ で測定したときに現れていた 2units/1channel の性能劣化がどうもベンチマークソフトの問題のように思えてくる。 tiobench でさえも問題を抱えていそうである。
さぁて、、、何が出てくるかなぁ。
0 件のコメント:
コメントを投稿