小論ハードディスクI/O性能評価

How to evaluate the I/O performance of HDD.

 HDDを購入する際、一つ重要な要素として性能(速度)が挙げられます。
でも、速さを重視するならお金はかかりますから、どれぐらいの性能が必要かをまず検討したほうが良いでしょう。
 HDDの性能はいくつかの読込&書込のディレ時間によって左右されます。
指標として「平均アクセス時間」を計算する必要があります。
平均アクセス時間
AAT = AST + ARL + TT

* AAT:(Average access time)平均アクセス時間
  AST:(Average seek time)平均シーク時間
  ARL:(Average rotational latency)平均回転待ち時間
  TT:(Transfer time)転送時間
現在のCPUにとっては1ミリ秒はとても膨大な時間単位です。
周波数1GHzのCPUは理論上1msで1,000,000指令の処理を行えます。
とても短いアクセス時間での無駄な消耗でもシステム全体の性能に影響が出ることがすぐわかるでしょう。
システム全体にI/O待ちが発生してしまうからです。
平均シーク時間
 HDDのヘッダがランダムシリンダー間で移動所要時間をミリ秒単位で測ります。
シーク時間はに基本的に読込&書込指令後ヘッダの停止位置から目的地までの距離よります。
一般的に業務用ハイエンドHDDの平均シーク時間は8ms-4ms程度で、個人パソコンは8ms-12msぐらいかかります。
FDとCDドライブならもっと時間かかります(FDDは100-200ms、CDDは120-400ms位)
ソリッドステート媒体(SSD等)は物理ヘッダの移動がないため、0.1ms以下で済みます。
 シーク時間の小さな差でも大きな差となります。6msと9msあまり差がないと思われるが、
9msは6msの150%となっていますので、システムの動作は50%遅くなります。
(50%の余計な時間がかかります)
HDDのDatasheetより値入手可能です。
平均回転待ち時間
 セクタがヘッダからTrackアクセス可能になるまで物理的にディスクの回転所要時間です。
平均的に回転一回の所要時間の半分となっています。
たとえば、7200RPMのHDDなら
一回転所要時間:60000ms/7200r = 8.33ms
平均回転待ち時間:8.33ms/2 = 4.17ms
同じように10000RPMなら3ms、15000RPMなら2msとなります。
これは、アクセスしたいデータと丁度擦れ違った直後だと、一回転を待たないといけないので、
7200RPMのHDDの場合最悪8.33msかかります。平均ですと、半分の値4.17msを採用します。
10000RPMのHDDを除きあまり5ms以下のシーク時間は見ないですね。
HDDのDatasheetより値入手可能です。
転送時間
 転送率によりますが、影響要素は1)HDA(Hard Disk Assembly)、2)使用するコントローラ次第です。
主な転送率一覧:
〜〜内蔵型HDDの規格〜〜
HDDの種類 	転送速度 	転送率
S-ATA2 	3040Mbps 	380MB/sec
S-ATA150 	1520Mbps 	190MB/sec
ATA133 	        1064Mbps 	133MB/sec
ATA100 	        800Mbps 	100MB/sec

〜〜外付け型HDDの規格〜〜
HDDの種類 	転送速度 	転送率
GigaBitLAN 	1000Mbps 	125MB/sec
USB2.0 	        480Mbps 	60MB/sec
IEEE1394 	400Mbps 	50MB/sec
USB1.1 	        12Mbps  	1.5MB/sec

転送データサイズ÷転送率=転送時間
例一つのデータブロック8KBとして:
  8KB / (133MB/s) = 8KB / (136.192KB/ms) = 0.06ms
この値は回転待ち時間とシーク時間と比べるととても小さいため、無視される場合が多いです。
DBトランザクション性能計算例:
HDD:HDS728040PLA320
Rotational speed (rpm)  	7,200 (=> ARL=60/7200/2)
Average seek time (ms)   	8.8   (AST)
Media transfer rate (max. Mbits/sec)  	757 (= 96.4 MB/s)
Interface transfer rate (max. MB/sec)  	133

ATT = AST + ARL + TT
    = 8.8 + 4.17 + 0.17
    = 13.1ms
=> 1000 / 13.1 = 76.3 trx/s

* trx/s : Transaction Per Second

一般的にOLTPの場合AST+ARL>>TT、DSS(DWH)の場合AST+ARL<TTの傾向があります。
これはOLTPの一回アクセス時間が短く、アクセス回数が多いため、
主にランダムアクセスでヘッダの移動と回転待ちが多数発生します
逆にDSSの場合、一回読み込むデータ量が膨大のため、シーケンシャルアクセスが発生し、
シーク時間よりデータ転送がボトルネックになりがちです。
平均シーク時間の測定
 上記のHDDならAST8.8ms、ARL4.17msで、一回HDDにアクセスすると13ms位かかります。
アクセス性能の良いHDDを探すならアクセス時間が短く、回転(RPM)速いHDDが良いわけです。
Linux上のBonnie++ツールを使って測ってみた:
上記のHDDの理論値はATT 13.1ms resp. 76.3 trx/sでした。
[root@CentOS53 bonnie++-1.03]# ./bonnie++ -d /tmp -u root
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...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...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
CentOS53.xxxx.sm 2G 23858  53 23427   8 10858   2 28498  54 27734   2  90.0   0

ランダムアクセス実測値は90trx/s ie. AAT 11.1msです