3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(HDD)WD WD20EARSのベンチマークとAFTの問題

メインPCの空きが少なくなってきたので、WESTERN DIGITAL WD20EARSを購入しました。

WD20EARSには、500GB/プラッタx4 の分と667GB/プラッタx3 の物がありますが、もちろん後者(WD20EARS-00MVWB0)のほうです。

ベンチマーク

Seagate Barracuda LP 1.5TBモデルをベンチマークしてみたで500GBプラッタのSeagateのHDDのベンチマークを載せていますが、あのデータに今回のWD20EARSを追加してみたいと思います。

(Intel X25-Mをベンチマークしてみたで測定したSSDの結果も反映してみました。)

やはり、667GB/プラッタは高速ですね。

回転数では Seagate Barracuda LP ST31500541AS を下回っていると思われるものも、キャッシュサイズ(64MB)とプラッタ密度でカバーしているようです。

AFT

WD20EARS の特徴に、Advanced Format Technology(AFT)というものがあります。

従来のHDDは1セクタ512バイトでした。それがWD20EARSでは1セクタ4Kバイトになっています。

(これは、BigSector と呼ばれてるようです。BigSector の背景としてはHDDの高密度化が進んだため、セクタ読み書き時のエラーが増えるようになり、現在のセクタ毎のECCではエラー対応ができなくなってきたので、セクタサイズを大きくしてECCの取られる領域を減らそうというのがあるようです。セクタは大きくしてもエラー訂正に必要なECCの領域は大きくは増えないようです。このあたりの話は、2TBを超えろ! ATAディスクの4Kセクタ問題とは?: @ITAdvanced Format Architectureの意義が参考になります。)

しかし、4KB/1セクタだと、コントローラ、BIOS、OSなどがすべて対応している必要があり互換性の点で問題あるので、WD20EARSでは論理的に512B/1セクタに見せかけているようです。

これが、Advanced Format Technology(AFT) です。

しかし、このAFT、XPやちょっと前のLinuxだと大幅にディスクアクセスのパフォーマンスが落ちるようです。

なぜなら、4KB/1セクタになった故に、パーティションオフセット(アライメント)に問題が生じるからです。

この件については多くのサイトで解説されてますが、自分なりにまとめてみました。

(ちなみに、SSDに関しても1セクタが4KB~(製品で異なる)となっているので、同様の問題が発生します。)

まず、旧来の古典的パーティションパーティションの境界がシリンダ単位となっています。

(シリンダとは各プラッタのトラックをひとまとまりにしたものです。なぜシリンダ単位になっているかというと、昔というかIDE時代=8GBまでのHDD はCHS方式というシリンダ、ヘッド、セクタの各アドレスでデータアクセスしてました。今はCHSではアドレス幅が全然足りないので、LBAという全セクタに通し番号を振る使用になっています。シリンダ単位に分かれているのは、CHS自体の名残というか下位互換性のようです。このあたりの話は、HDDの話マルチブートの仕方(豆知識編)CHSとは【Cylinder/Head/Sector】 - 意味/解説/説明/定義 : IT用語辞典が参考になります。)

ですので、WindowsXP,古めのLinuxで普通にフォーマットすると、先頭0セクタにはMBRが入っており、第一パーティションまでは下記のように63セクタからなります。

さて、OS側ではHDDがにデータアクセスするときにセクタ単位では行いません。

アクセス速度の効率を考えセクタをまとめた単位でアクセスします。Windowsではクラスタ(アロケーションユニット)、Linuxではブロックと呼ばれたりしますが、大抵のファイルシステムのデフォルト値は4096byte(4KB)です。(Windowsのクラスサイズについては、MSサポート:NTFS、FAT、および exFAT の既定のクラスター サイズが参考になります。)

つまり、OS側からすると下記のようなイメージになります。

これが、WD20EARSではAFTのため、下記のようになります。

ディスクの物理セクタに対して、OSのクラスタ/ブロックがまたがってしまっていますね。

この状態で クラスタ1 のデータ読み込みするとどうなるでしょうか。

下記のようになります。

つまり、OSが1クラスタ/ブロック読みこみしようとすると物理的にHDDは2セクタもアクセスしないといけないわけですね。

OSがシーケンシャルアクセスする場合は読み込む論理クラスタ/ブロック+1物理セクタアクセスとなります。

さらにデータ上書きの場合は、いったん2物理セクタ読み込み、メモリ上で上書きして、2物理セクタ書き込みという流れになります。

リード・モディファイ・ライト (read-modify-write)ですね。これにより、データ書き込みは読み込みに比べさらにパフォーマンスが落ちるようです。

Windows7Vista環境においては第一パーティションが63セクタではなく2048セクタから始まるようになっており、そのためアライメントの不整合は発生しません。

ちょうど物理セクタとOSのクラスタ境界が一致するわけですね。

ですので、パフォーマンスの劣化は起きません。(ただ、Win7,Vistaで作成したパーティションはXPから読み書きはできますが、XPの起動ドライブとしては使えないようです)

ただ、検証:アドバンスト・フォーマット・テクノロジーによると、AFTを表明するHDDでインテル社製のAHCI/RAIDドライバを使用している場合、ドライババージョン9.6.0.1014以降でないとパーティションの開始位置が2057セクタとなり性能が低下するようです。

また、AFTを表明するHDDの場合、Windows7ならば修正プログラムKB982018を適用するといいようです。(WD20EARSは自身がAFTであることを表明しない、つまり物理セクタも512と偽るようです。)

上記で書いたように、XPや古いLinuxではこのアライメントの不整合によりパフォーマンスが低下しますが、回避策もあるようです。

一つは、WD Align Utilityというツールを使うことです。

このツールにより、クラスター境界が変更されるようです。

もうひとつは、WD20EARSのジャンパピン7,8をショートさせる方法ですが、これはHDD全体を1パーティションとして使う場合のみ効果があるようです。(つまりXPで複数パーティションでは意味なし)

原理としては、LBAのアドレスを内部的に+1しているようです。なので、Windows7環境とかすでにデータが入っている状態でやっちゃうとデータ消えちゃう可能性があり危険です。

参考:

インテル SSD オプティマイザーとは?

NAND/AFTにおけるパーティションアラインメント問題のまとめ - Lansenの現実逃避日記

容量の壁 - Wikipedia

(Linux) AFT形式のWD20EARSをLinuxでフォーマットする (r271-635)

Linuxをはじめよう!:LinuxでAFT仕様のHDDを使用する

個人的なメモ: 新ファイルシステムAFT採用、キャッシュ64MBのWD製HDD「WD10EARS」登場-XPなどは変更必要

AOTAKA = BigSector(AFT)について世間では誤解が多いようで:

CentOS インストール(BigSector対策) - @//メモ

ERI  パーティションオフセット(アライメント)の諸問題

AFT - WesternDigital製HDD友の会 Wiki

ハードディスクの構造とパーティション by eslabブートセクタとパーティション境界の話です。