HDDの外側と内側でどれ位の速度の差があるのか?

現在主流のCDR(Constant Density Recording)方式のHDDでは外側の方が転送速度が速くなるのは有名な話し(Hard Disk Driveなど参照)だが、どれ位速いものだろうか? ちょっと実験をしてみた。

今回の実験はLinuxをベースにした。ファイルへのアクセス性能はファイルシステムの構造によっても大きく異なる。Windowsのようにフラグメントがない状態で性能が良くなるファイルシステム(順次アクセス性が高いファイルシステム)では下記実験の差はもっと大きくなると予想される。

OS(Fedora 7)のブート時間

ちょっと実験。最外週寄りと最内周寄りに全く同じ(=コピーした)ルートファイルシステムを作り、それぞれのブート時間(grubメニューからEnterによりブートを開始してからGNOMEログイン画面が出てくる瞬間まで)を計った。

外側配置OS 約100秒
内側配置OS 約112秒

(各3回ずつのブート時間。おおむね平均値±1秒)
実験環境は以下の通り。

Machine: Dell Inspiron 1501
	CPU: AMD Turion 64 X2 Mobile Technology TL-56 1.8GHz
	Memory: 1GB
	HDD: Toshiba MK8034GSX SATA 5,400rpm Seek:12ms 150MB/s 
OS: Fedora 7 (2.6.22-1..44.fc7)
HDD Partition:
	Disk /dev/sda: 80.0 GB, 80026361856 bytes
	255 heads, 63 sectors/track, 9729 cylinders
	Units = シリンダ数 of 16065 * 512 = 8225280 bytes

	デバイス Boot      Start         End      Blocks   Id  System
	/dev/sda1               1        9729    78148161    5  拡張領域
	/dev/sda5               2         801     6426000   83  Linux		(/:1)
	/dev/sda6             803        1602     6426000   82  Linux swap	(swap:1)
	/dev/sda7            4065        4864     6426000   83  Linux		(not use)
	/dev/sda8   *        4866        5665     6426000   83  Linux		(/boot)
	/dev/sda9            8129        8928     6426000   82  Linux swap	(swap:2)
	/dev/sda10           8930        9729     6426000   83  Linux		(/:2)

出来るだけ多くのサービス、デーモンを起動するように設定した。また、内周配置のOSは、外周配置のOSの設定を全て終えてからddコマンドでパーティションごとコピーをしてので、完全にクローン化している。

OSのブートではディスクアクセスも多いが、各サービスの起動ではディスク以外のIOからのイベント待ちになる時間も多いので、純粋にディスクアクセスだけの性能に比べて差は小さいが、それでも10%程度の差になることも有り得るということだ。(この実験は、単にディスクIOだけで比べるより、より通常の利用に近い比較ではないかと思う。)

純粋なディスクIO(シーケンシャルアクセス)

次に、シーケンシャルアクセス時のディスクIOの速度を比較してみた。

最外周と最内周に同じ容量のパーティション(約6GB)を作成して、それぞれのパーティションに対してddコマンドでシーケンシャルにデータを読み書きしてみた。

最外側パーティション(書込み) 約230秒 28.6 MB/s
最外側パーティション(読出し) 約186秒 35.5 MB/s
最内側パーティション(書込み) 約381秒 17.3 MB/s
最内側パーティション(読出し) 約346秒 19.0 MB/s

それぞれの測定に使ったコマンドは以下の通り。

dd if=/dev/zero of=/dev/sda5 bs=411264000 count =16
dd if=/dev/sda5 of=/dev/null bs=411264000 count =16
dd if=/dev/zero of=/dev/sda10 bs=411264000 count =16
dd if=/dev/sda10 of=/dev/null bs=411264000 count =16
Machine: Dell Inspiron 1501
	CPU: AMD Turion 64 X2 Mobile Technology TL-56 1.8GHz
	Memory: 1GB
	HDD: Toshiba MK8034GSX SATA 5,400rpm Seek:12ms 150MB/s 
OS: Fedora 7 (2.6.22-1..44.fc7)
HDD Partition:
	Disk /dev/sda: 80.0 GB, 80026361856 bytes
	255 heads, 63 sectors/track, 9729 cylinders
	Units = シリンダ数 of 16065 * 512 = 8225280 bytes

	デバイス Boot      Start         End      Blocks   Id  System
	/dev/sda1               1        9729    78148161    5  拡張領域
	/dev/sda5               2         801     6426000   83  Linux		(data area)
	/dev/sda6             803        1602     6426000   82  Linux swap /	(not use)
	/dev/sda7   *        4065        4864     6426000   83  Linux		(/)
	/dev/sda8            4866        5665     6426000   83  Linux		(swap)
	/dev/sda9            8129        8928     6426000   82  Linux swap /	(not use)
	/dev/sda10           8930        9729     6426000   83  Linux		(data area)

HDDの性能によって値は変わるのか?

今回実験に使ったHDDは東芝MK8034GSXでカタログ上の最高転送速度は150MB/sである。当然これはカタログ上の話しであり、HDD単体での理想的な環境での性能であり、実際にはHDD周辺のLSI、CPUのチップセットやOSのオーバーヘッドでそんなには速度は出ない。今回の環境では読出しで35MB/sが現実の数値として出てきている。

では、HDDの性能によってこの数値は変わるのだろうか? MK8034GSXの後継でMK8037GSXというモデルがある。カタログ上の最高転送速度はMK8034GSXの2倍の300MB/sとなっている。では、このHDDに交換した場合、上の実験結果の値は、例えば外周部読出しで倍の70MB/sになるだろうか。勿論、HDD以外の要素で性能のボトルネックがある場合は幾らHDDの性能が良くても期待出来るは精々35MB/sということになってしまう。手元にMK8037GSXもあるので実験は出来るのだが、今はチョット中身を潰すわけにいかないので、その内、機会があったらやってみようと思う。

もっとも、性能が頭打ちになるから旧製品で良いかというと、そうでもない。同容量の後継の新型の方が一般的には価格が安くなっているので、やはり新型を買う動機は高いのだが。

かんそう

厳密な実験ではなく、あくまでも傾向をみるためのものなので、こんなものかなと思う。
初期のi-modeサーバは性能を出すためにHDDの外周部分だけを使って内周部分は利用しなかったという「殿様のお食事(魚は表側の白身の部分だけを食して、後は捨ててしまう)」的な使い方をしていたと聞く。ストレージベンダーにとっては上得意だったに違いない。今であれば、色々な技術要素が発展してデータがHDDの外周か内周に置かれているのかを気にせず均一的かつ高性能なアクセスができるようになっているらしい。

また、きれいにデフラグされたWindowsファイルシステムであれば、外周と内周のアクセス速度の差は大きく影響すると考えられる。上の例で(Windowsファイルシステムではないが)シーケンシャル・アクセスで倍近くの差が出ているの結構影響があるかも知れない。(そのううち、暇なときにWindowsでも実験してみようか。)