HDDの基本性能を測定してみた

OSのインストールの前に時間的な余裕があるのでHDDの基本性能を測定してみた。
HDDの初期不良チェックのために、全セクタの読み込み・書き出しテストを行った。Linuxでは次のようなコマンド簡単に実効できる。

# dd if=/dev/sdc of=/dev/null bs=1G
2794+1 records in
2794+1 records out
3000592982016 bytes (3.0 TB) copied, 17922.9 s, 167 MB/s

# dd if=/dev/zero of=/dev/sdc bs=1G
dd: writing `/dev/sda': No space left on device
2794+1 records in
2793+1 records out
3000592982016 bytes (3.0 TB) copied, 18065.2 s, 166 MB/s

これはSeagate ST3000DM001の例だが、これを見ると3TBの読み書きには18000秒(今回はきっかり5時間!)かかり、“平均的な”読み書きの速度は166MB/sということがわかる。

このデータを取っておくだけでもイメージバックアップの際の作業時間の見積りに役立つ。しかし、ここで疑問が出てくる。HDDは外側と内側でデータ伝送速度時間が変わってくる(⇒ハードディスク・ドライブの内部構造)。そこで、どの様に変わるのか、10分毎にddコマンドの進捗状況を表示させてみた。

# dd if=/dev/zero of=/dev/sdc bs=1G
118+0 records in
117+0 records out
125627793408 bytes (126 GB) copied, 603.364 s, 208 MB/s

237+0 records in
236+0 records out
253403070464 bytes (253 GB) copied, 1201.76 s, 211 MB/s

356+0 records in
355+0 records out
381178347520 bytes (381 GB) copied, 1803.86 s, 211 MB/s

	:省略

2686+0 records in
2685+0 records out
2882996797440 bytes (2.9 TB) copied, 16809.3 s, 172 MB/s

2746+0 records in
2745+0 records out
2947421306880 bytes (2.9 TB) copied, 17406.1 s, 169 MB/s

2794+1 records in
2794+1 records out
3000592982016 bytes (3.0 TB) copied, 17922.9 s, 167 MB/s

HDDの最外周は200MB/sを超えている。ST3000DM001のデータ・シートでは“最大データ転送速度”は210MB/sとなっているのでほぼスペックどおりの性能が出ていることになる。また、データ・シートでは“平均データ転送速度”は156MB/sとなっているので計測した166MB/sは6パーセント程度の誤差に収まっている。
でも、このデータを見ていると更に疑問が出てくる。最高は210MB/s、平均は166MB/s、では最低はどれ位? ということで、HDDを55のエリアに分けて、各エリアで50GBのデータ読み書きをしてみた。

dd if=/dev/sdc of=/dev/null bs=1073741824 count=50 skip=0
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 263.65 s, 204 MB/s

dd if=/dev/zero of=/dev/sdc bs=1073741824 count=50 seek=0 conv=fsync
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 267.476 s, 201 MB/s



dd if=/dev/sdc of=/dev/null bs=1073741824 count=50 skip=50
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 251.751 s, 213 MB/s

dd if=/dev/zero of=/dev/sdc bs=1073741824 count=50 seek=50 conv=fsync
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 255.757 s, 210 MB/s

	:省略

dd if=/dev/sdc of=/dev/null bs=1073741824 count=50 skip=2692
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 497.485 s, 108 MB/s

dd if=/dev/zero of=/dev/sdc bs=1073741824 count=50 seek=2692 conv=fsync
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 504.389 s, 106 MB/s



dd if=/dev/sdc of=/dev/null bs=1073741824 count=50 skip=2743
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 530.178 s, 101 MB/s

dd if=/dev/zero of=/dev/sdc bs=1073741824 count=50 seek=2743 conv=fsync
50+0 records in
50+0 records out
53687091200 bytes (54 GB) copied, 536.856 s, 100 MB/s

どうもHDDの内側における最低転送速度は100MB/sとなる。外側の最速値の約半分の速度しか出ないことになる。(平均が156MB/sであれば、こんなものだろう。もっとも線形に変化している訳ではないが。)
これをグラフににしたのが次の画像である:

こうしたデータを取っておくことで、パーティション計画などにも役立てることができる。転送速度を基準にパーティションを切る境界を決め、外側の速い方は仮想ディスクのデータストア用、内側の遅い方は文書ファイルやアーカイブ用などといった具合に。(今回もこのデータを元に全体の10%の外側部分とそれ以外の部分でパーティションを分けることにした。)I

ついでにバックアップ用として買っておいたHGSTのHDS723030ALA640(通称 0S03088)の測定値は次のようになる。

両方の測定結果を1つのグラフにまとめると次のようになる。

さて、こうやって見るとやたら速いように見えるSeagate ST3000DM001だが、速いのは上の計測で行ったようなシーケンシャルアクセスの時だけで、ランダムアクセスになると余り高いスコアにならないようだ(⇒ Seagate Barracuda 3TB Review)。通常のPCで使う環境ではむしろST3000DM001は遅くなる可能性が高い。シーケンシャル・アクセスが速いのは単に円盤(プラッタ)の記録密度が高いからだと考える。プラッタ1枚辺りの容量はSeagate ST3000DM00が1TB、HGST HDS723030ALA640では600GBと半分、とまでは行かないが結構異なる。(Western DigitalのWD30EZRXは750GB。)シーケンシャルアクセスは記録密度の高い方が有利だが、ランダムアクセスはヘッド制御など、その他の要因が影響するから、各社の特徴がでてくるようだ。

あとインタフェース速度について。Seagate ST3000DM001の最高時の210MB/sはSATAの速度に換算すれば2.1Gbpsである。このHDDは一応、6.0GbpsのSATA I/Fを持っているが、そんな速度は必要ないことがわかる。3.0GbpsのSATAポートに接続しても十分最高性能を出せる。まぁ、製品として6.0Gbpsに対応していないと、比較表などで並べられた時に見劣りするから仕方ないのだろうし、SATA I/Fチップも6.0Gbps対応になっているだろうから、選択の余地はないのかも知れないが。今回使うMoBoASUS P8H77-Iには2つの6.0Gbps SATAポートと4つの3.0Gbps SATAポートがある。必然、ST3000DM001は3.0Gbpsポートの方に接続して、6.0Gbpsポートの方はSDDに接続する。実は上の測定も6.0Gbpsポートではなく3.0Gbpsポートを使って行った結果だ。

じつは、5年前程にノートPCを使った簡単な実験をしていた(⇒HDDの外側と内側)。当時はカタログスペック値150MB/sの2.5インチHDDに対して35MB/s程度の性能しか測定できなかったと書いた。しかし、改めて読んでみると、150MB/sと言うのはどうもインタフェース転送速度のSATA 1.5Gbpsを指しているようだ。実際のデータ伝送速度は5,400rpm、63セクタ/トラック@Zone0、16論理ヘッダから計算して371Mbpsで8bit/10bitエンコードとして37MB/s程度ではないだろうか。実測で35MB/s出ればいい方だろう。各社、HDDの性能に関するデータの記述はまちまちで、インタフェース速度をあたかもアクセス速度の様に表現したり、外周部の最高速度だけを表示したり、色々だが、Seagateのように平均伝送速度を明記しているのは良心的だと思う。