2012/07/26

ハードディスクの「線記録密度」などを調べるとプラッタ構造を推測できるようです。

ハードディスクの記録密度を表す指標に「線記録密度」「トラック密度」「面記録密度」があるそうです。特に線記録密度はディスクの「読み書き性能」に関係するので興味深いですが、カタログには載っていません。手持ちのハードディスクの外周部と内周部の書き込み性能を調べたついでに計算してみると次のようになりました。

項目 記号 内容 Note
型番 - WD5000AAKX-001CA0 500GB
プラッタ容量 - 500GB*1 -
セクタサイズ A 512 Byte -
セクタ総数 B 976773168 両面合計(公開領域)
セクタ総数 B' 1116312192 B*8/7(非公開領域を含む)
回転数 C 7200rpm -
平均シーク時間 - 9ms 一般的なPC用HDDのスペック
平均待ち時間 - 4.2ms プラッタが半周する時間
セクタ数(最外周) D 2246 sector/track 138MB/s*60/C/A
セクタ数(最内周) E 1159 sector/track 71.2MB/s*60/C/A
線記録密度 F 837,125 bit/inch 138MB/s*60/C*8/3.5Pi
トラック密度 G 385,586 track/inch B'/2/(D+E)/2/0.85inch
面記録密度 - 323 Giga bit/inch^2 F*G
キャッシュメモリ - 16MB -

外周部と内周部の書き込み速度(後述)を調べるとおおよその記録密度がわかるようです。分かったことからこのハードディスクのプラッタ構造を推測してみました。

  1. 7200回転/分の3.5インチハードディスクのプラッタ直径は、95ミリが一般的なようです。
  2. アームの長さと回転軸の位置は、中央のトラックにアクセスする時のヘッドの傾きが「0」となるよう調整されているようです。
  3. 1プラッタ2ヘッドの製品なので、大きなファイルのシーケンシャルライト時は2周して(両面に書き込んで)から隣のトラックにヘッドが移動するようです。
  4. ヘッドが隣のトラックに移動する時間は極めて短いです。同じ時間でのトラックの回転距離はセクタ1つ分もありません。
  5. この製品の場合は、全体の1/8程度が非公開領域となっているようです。
  6. トラックごとにアクセス時の動作周波数を変更することでセクタ数の違いに対応しているそうです。
  7. セクタの長さは一定(124μm)で、この中に512バイトのデータやECC情報、セクタ情報、隙間などが詰め込まれているそうです。
  8. プラッタには無数の小さな磁石が配置されています。この製品では、セクタ方向の間隔が狭いようなので、「トラック密度」を上げて「面記録密度」を向上させる余地があるようです。
  9. 外周部のパーティションは、「シークタイム」と「転送速度」の2つの面で性能上の利点があります。

ベンチマークテスト:

よく使われるソフトで「読み書き性能」を確認してみました。

補)465.76Gi(2^30)B=500G(10^9)Bです。(2^10=1024,10^3=1000)

4つのパーティションでテストすると、大体の傾向をつかめるようです。

補)8つのパーティションでも同じことをしてみたかったのですが、「論理ドライブ」を作れなかったので諦めました。


書き込み性能調査:(その1)

Linuxの「dd」コマンドを使って、全領域の「書き込み性能」を確認しました。(1GiB*464回)

4つのパーティションの「読み書き性能(ピンク)」を重ねたグラフです。「ほぼ一致」してますが、内周部分には「転送速度の低い領域」があります。ファイルシステム領域からの距離が関係するのかもしれません。

補)1GiBデータの書き込み速度は、140MB/s~69.2MB/sの範囲でした。グラフは4回ごとの平均値を記載しています。


パーティション分割:

実際に使う形でパーティションを分割してから比較テストを行います。

        0+----------------+
         | MBR Region     |マスターブートレコード領域(2048セクタ)1MiB
     2048|----------------|
         | Partition (1)  |Linux swap(8388608セクタ)4GiB
  8390656|----------------|
         | Partition (2)  |Linux /(33554432セクタ)16GiB
 41945088|----------------|
         | Partition (3)  |Linux /home(446443520セクタ)約212.88GiB
488388608|----------------| <-- ほぼ真ん中
         | Partition (4)  |Windos7(488384560セクタ)約232.88GiB
976773167+----------------+
       ↑パーティション開始セクタ(最終セクタ:976773167)
補)パーティションの開始セクタはすべて「2048の倍数」にしました。(特に意味はありません)


書き込み性能調査:(その2)

データ領域の書き込み位置と(パーティション先頭の)ファイルシステム領域の距離を縮めてみましたが、結果に違いはありませんでした。距離の影響ではなく、「内周付近ではプラッタの片面しか利用しない」という構造上の特徴が現れているようです。


「dd」コマンドが表示する時間:

プログラムがデータを送り始めてから、ハードディスクが受け取りを完了するまでの時間を表示するようです。ディスクのキャッシュに転送できた時点がゴールで、その後の作業時間は反映されません。

+-------+    +-------+    +-------+    +-------------------+
|       |    |       |    |       |    | 16MiB |   500GB   | 500GB HDD
|  CPU  | -> | Memory| -> | SATA2 | -> | Cache |  Platter  | シーク時間:9ms
|       |    |       |    |300MB/s|    |       |  140MB/s  | 待ち時間:4.2ms
+-------+    +-------+    +-------+    +-------------------+
512KiB Data   -->                      |-| 512KiB
1GiB Data     -->                      |-16MiB-|--1008MiB--|
キャッシュメモリよりも小さなファイルの転送時間は2ms程度と表示されました。平均的なプラッタへの書き込み時間は、次のようにデータと配置情報の2度の書き込みのために512KiBデータでは32msを必要としますが、表示されたのはボトルネックになった「伝送路」の通過時間(2ms)だけでした。

                    Data                        FAT
+-----------------+---------+-----------------+---------+ プラッタ全体での
| seek 1 | wait 1 | WRITE 1 | seek 2 | wait 2 | WRITE 2 | 平均的な
+-----------------+---------+-----------------+---------+ 書き込み時間
512KiB       13ms       6ms              13ms       -        32ms
1GiB         13ms   11500ms              13ms       -     11526ms
キャッシュメモリよりも大きなファイルの転送ではデータの書き込み時間のほとんどが反映されますが、配置情報の書き込み時間は反映されません。作業前にキャッシュメモリへの転送が完了しているからです。 データを書き込む前の「平均シーク時間」と「平均待ち時間」は、結果に反映されています。両方を合わせた時間は0~26msの幅を持ちますが、書き込み時間(11500ms)との比較では無視できるほど小さな値です。

補)512KiB程度の小さなファイルではシーク時間や待ち時間といった「オーバーヘッド」が転送速度を下げる大きな要因であることが分かります。


「dd」コマンドの利用方法:

記録媒体のメンテナンスでよく使われるコマンド形式のツールです。データの転送時間や速度を結果に表示するので利用しました。次のように無内容のデータを作り、任意のディレクトリにコピーすることもできます。

$ cd /media/589A-122A
/media/589A-122A$ sudo dd if=/dev/zero of=1gb001 bs=16384 count=65536 <--1回目
65536+0 記録始め
65536+0 記録終わり
1073741824 バイト (1.1 GB) コピー終了, 7.66519 s, 140 MB/s
 :
/media/589A-122A$ sudo dd if=/dev/zero of=1gb464 bs=16384 count=65536 <--464回目
65536+0 記録始め
65536+0 記録終わり
1073741824 バイト (1.1 GB) コピー終了, 14.8633 s, 72.2 MB/s
補)大きなファイルほどプラッタへの書き込み時間を「精度よく」計ることができます。


「『dd』コマンドが示す時間」を「プラッタに書き込む時間」に補正すると次のようになります。
  • 最外周:1056964608 バイト (1.1 GB) コピー終了, 7.65619 s, 138 MB/s
  • 最内周:1056964608 バイト (1.1 GB) コピー終了, 14.8503 s, 71.2 MB/s

小さなファイルは一瞬でキャッシュに格納されるのでプラッタの性能は計れません。

$ sudo dd if=/dev/zero of=512kb001 bs=16384 count=32
32+0 記録始め
32+0 記録終わり
524288 バイト (524 kB) コピー終了, 0.00119346 s, 439 MB/s
あるいは、
524288 バイト (524 kB) コピー終了, 0.00313677 s, 167 MB/s
補)瞬間の転送速度なので「439MB/s」や「167MB/s」となっていますが、測定を繰り返すと平均値はハードディスクの伝送路(SATA2)の上限値(300MB/s)に近づくようです。(FAT32の場合です。ファイルシステムによっては違う結果になることがあります)


読み込み性能:(ベンチマーク)

ubuntu10.04(Linux)標準のベンチマークソフト(ディスク・ユーティリティ)で読み込み性能を調べると次のようになりました。

補)フォーマット済みハードディスクの「書き込みベンチマーク」は実行できません。

読み込み性能ですが、これ以前のベンチマークと同様の結果が得られました。テストは数分で終わるので、短い時間で大体の性能を把握したい場合に使うといいかもしれません。


まとめ:

シーク時間を短くしたい場合は、ディスク使用率を下げるとよいかもしれません。使用量が同じでも、「250GB/500GB」と「250GB/250GB」では前者の平均シークタイムは後者の半分になります。小さなファイルにアクセスする場合のオーバーへッドとしてシークタイムのウェイトは大きいので、窮屈な(システム用)ハードディスクのレスポンスに不満がある場合は、(使い切れないほど)大きな容量の製品に置き換えることを検討してもよいと思います。

LinuxのようなOSで、システム領域(「/」)とユーザ領域(「/home」)をパーティションで分離することは、レスポンスを保つ上で一定の効果を期待できると思います。(「/boot」パーティションを作るのは起動時間を短めに保つ狙いがあるんですね。今やっと気が付きました。でも私には不要です)

プラッタの「線記録密度」は転送速度に直結し、「トラック密度」はシークタイムに関わるので、「面記録密度の高さ」は「性能面で有利」と言えそうです。その反面で、信頼性を心配する必要があるかもしれません。 「非公開領域」のことは分かりませんけど、大体の性能は把握できたのでOSを導入して使い始めたいと思います。

1 件のコメント:

  1. 初めまして。内周に行くほど速度が加速度的に下がることについて、これは全く不思議はありません。
    回転数は一定なので、速度はその部分のトラックの円周長に比例し、つまりはトラックの半径に比例します。したがって、グラフの横軸を仮にトラックの半径とすれば、グラフは直線になるはずです。しかし、トラックの半径は普通は観察できないので容量を横軸にするわけですが、トラック当たりの容量は内周に行くほど減っていくので、いわば横軸は内周に行くほど圧縮されていきます。その結果、内周に行くほど速度と容量がともに低下していくため、グラフは全体的に湾曲します。それがこのグラフの形が意味するものと考えられます。

    返信削除