NAND/AFTにおけるパーティションアラインメント問題のまとめ

最近のHDDの大容量化・低価格化はとどまるところを知らず、2TBのWD20EARSは何と9,000円を下回る価格で販売されています。従来のHDDは512バイトを1物理セクタとして扱い、PC側も同様に512バイトを1論理セクタとしていたのですが、WD20EARSを始めとしたWestern Digital社の最近のHDDは、4096バイトを1物理セクタとするAdvanced Format Technology(AFT)を採用しています。AFTは、HDDの見かけの容量を増やし、読み書きの速度を向上させ、おまけにECCの効率まで向上するといいことずくめなのですが、一方で後述する論理・物理セクタのずれによる性能低下が発生します。この性能低下は、SSDUSBメモリといったNANDフラッシュ製品でも起こります。今回の記事では、これらの性能低下問題について、性能が下がる原理と、実際のパフォーマンスの変化についてまとめます。

Advanced Format Technology + Windows XP におけるパフォーマンス低下問題の整理

Advanced Format Technologyについての詳細は、@ITの記事に詳しく解説されています。XP以前のWindows OSでのパフォーマンスの低下問題は、これらのOSがHDDをフォーマットすると、パーティション開始オフセットを63論理セクタ(31.5KiB)に設定してしまうことに起因します。この状態を図示すると、以下のようになります。

Physicalは実際のHDD上の物理アドレス、LogicalはOSが操作する論理アドレスを表し、正方形のブロック1つが512バイト(1論理セクタ)を表します。太枠の長方形は、上段は物理セクタ、下段はパーティションクラスタを表します。
物理セクタ・パーティションクラスタの双方が4KiBなのに、論理アドレスが始まるのが63セクタめなので、1論理セクタずつ位置がずれてしまっています。このずれを修正するためには、パーティション開始オフセットの大きさを8論理セクタの倍数にすればよいわけです。Vistaや7ではパーティション開始オフセットが2048になるため、この条件をクリアしています。
要するに、この問題の原因はOSがXPであることではなく、パーティション開始オフセットの大きさが8の倍数になっていないことにあります。従って、XPでAFT採用HDDをフォーマットする場合であっても、Diskparなどのツールを使ってオフセットを調整しておけば問題ありません。同様に、Vista以降のOSでも、意図的にオフセットを63に変更すると、XP同様のパフォーマンスの低下が発生します。
実際に、Windows7(64bit)においてWD20EARSのパーティション開始オフセットをdiskparを用いて変更したベンチマーク結果は以下のようになりました。(P55チップセットAHCIモード、IRST使用)

オフセットを63にすると特にランダムリード・ライトでパフォーマンスが低下しているのが分かります。この辺は体感速度に影響しやすいところなので、しっかりパーティションアラインメントを調整した方がよいでしょう。

オフセットのずれによるパフォーマンス低下の原理

前掲のテスト結果では、特にランダムライト性能が大きく落ち込んでいます。これは、オフセットがずれた状態で小さな書き込みを行うと、実際の書き込みはRead-Modify-Writeと呼ばれるアルゴリズムによって行われるためです。以下では、Read-Modify-Writeがどのように行われるか、図を用いて簡単に解説します。
以下のように、OSが1クラスタ(4KiB)を書き込むときについて考えます。

AFT採用HDDでは4KiB単位(図の太い長方形枠)の読み書きしかできないので、このように境界線をまたぐ書き込みを直接行うことはできません。
そこで、まず最初にHDD内のRAMに、境界前後の8KiB分のデータを読み込みます(Read)。

次に、RAM上のデータに、OSから送られた書き込みデータを上書きします(Modify)。

最後に、RAM上の8KiBのデータを書き込みます。これで、OSから指示された4KiBの範囲内だけの書き込みを行うことができます。

以上のように、OSは4KiBの書き込みしか行っていないにも関わらず、実際のディスクでは8KiBの読み込みと8KiBの書き込みが行われています。それでは遅くて当たり前です。
上記のプロセスは書き込みについてですが、読み込みに関してはより単純で、1物理セクタ分を余分に読み込み、いらない部分を省いてOSに送るだけです。この場合、常にOSの要求より1物理セクタだけ多くの読み込みが行われます。

NANDフラッシュ製品の場合

こだわりのMONOさんの記事でも解説されているように、SSDUSBメモリなどのNANDフラッシュ製品でも、これと同一の問題が発生します。NANDフラッシュは、読み込みも書き込みもページと呼ばれる単位で行う必要がありますが、ページの大きさは、例えば多くのMLCタイプのNANDでは4KiBとなっています。そのため、オフセットがずれていると、前述のAFT採用HDDと同様に、ページの境界をまたいだ書き込みが行われる可能性があるため、Read-Modify-Writeに起因するパフォーマンス低下が発生します。
オフセットがずれている場合のパフォーマンスの低下量は、製品によってかなりの差があるようです。以下に、いくつかのストレージについてオフセットを変化させた場合のCrystalDiskMarkの結果を掲載します。いずれも前述のWD20EARSと同じ環境での測定です。

  • OCZ OCZSSD2-1VTX30G(Vertexシリーズ、Barefootコントローラ、32GB)

  • Crucial CTFDDAC256MAG01G1(RealSSD C300シリーズ、256GB)


Vertexでは4KBの書き込み性能が若干下がっているだけですが、RealSSD C300では大きくベンチマーク結果が低下しています。RealSSD C300ほどの差が出ることは珍しく、Intel東芝JMF602といったあたりもBarefoot同様に4KBの書き込み性能が微減する程度のようです。
VertexなどのSSDパーティションアラインメントの影響が少ない理由は、以下のように推測することができます。
SSDは、複数のNANDに対して並列(またはインターリーブ)にデータの読み書きを行うことで高速化を図っています。コントローラが単純な設計であれば、例えば、ページサイズ4KiBのNANDを4個並列で動かした場合、一回の読み書きの単位が16KiBになります。そのため、それ未満のサイズの書き込みが行われると、必ずRead-Modify-Writeが行われます。
このSSD上のドライブのオフセットがずれていることを想定します。もし書き込みがページの境界線をまたいでしまうと、2ページ分のRead-Modify-Writeが必要となるため、書き込みのレイテンシは2倍程度になると考えられます。
しかし、下図を見れば明らかなように、OSからの書き込み量が4KiBの場合、その書き込みが物理セクタの境界線をまたぐ確率は1/4でしかありません。

従って、4KBのランダムライトのIOPSは、オフセットがずれているとフルスペックの80%(4/5)に下がると予想されます。同様に物理ページサイズが32KBなら8/9, 64KBなら16/17にしか変化せず、影響は限定的です。
一方、Intel,Micron,Sandforceのように、よりランダムライトが高速である製品は事情が異なる可能性が高いです。
ランダムライトが遅いSSDは、コントローラが仕事をサボっているから遅いのではなく、先ほどのRead-Modify-Writeのようにせっせと(無駄な)読み書きを行っているから遅いのです。SSDを語る上では、"Write Amplification"がよく話題になります。これは、"OSが実際に書き込んだ量の何倍の書き込みがSSD内部で行われたか"を表す指標です。先ほどのNANDを4並列で動かすSSDのRead-Modify-Writeの場合、OSからは4KiBの書き込みしかしていないのに、SSD内部では16KiBの読み書きが行われるとするなら、単純にそれだけでWrite Amplificationは4になります(実際のWrite Amplificationはガベージコレクションなどの影響でもっと増える)。この場合、どうがんばってもSSDの地力の4分の1以下しか性能を発揮できないわけです。また、JMF602プチフリ状態、あるいはUSBメモリやSDカードでは、OSからの書き込みが行われる度にブロックコピー(詳細はこちらの記事参照)が行われます。この場合、Write Amplificationは簡単に数百を超えます。
例えばIntelの場合は10並列でNANDへの読み書きが行われますが、4KiBのOSからの書き込みごとに4x10=40KiBのRead-Modify-Writeを行っていたら、CrystalDiskMarkで観測されるような40〜50MB/sというスコアを出すことはできないでしょう。また、Intelが主張する"Write Amplification=1.1"を達成するのも到底不可能です。詳細はもちろん不明ですが、うまくRead-Modify-Writeを避けるようなアルゴリズムが実現されていると考えられます。
そして、それらのRead-Modify-Writeを避けるアルゴリズムがコントローラごとに異なるというのは十分考えられます。Intelアルゴリズムはオフセットがずれていた場合の悪影響を受けにくく、Micronのアルゴリズムは悪影響を受けやすいのでしょう。

アラインメントの状態チェックと対策

パーティション開始オフセットを簡単に調べるには次のようにします(XP,Vista,7共通,64bitでも可)。XPを使っていなくても、TrueImageなどのバックアップツールが勝手にオフセットを63にしてしまうことがあるので注意が必要です。

  • Win+Rで"ファイル名を指定して実行"ダイアログを出す
  • msinfo32と入力してOK
  • コンポーネント->記憶域->ディスク とツリーを辿る
  • 各ディスクの"パーティション開始オフセット"の値を調べる
    • Vista,7でフォーマットした場合(Offset=2048)の値は"1,048,576バイト"、XPでフォーマットした場合(Offset=63)の値は"32,256バイト"
    • パーティションを2つ以上作成している場合、値が4096の倍数であれば(大体)OK

ずれたパーティションアラインメントを直す方法は、こだわりのMONOさんの記事に詳しく掲載されています。有料のソフトでもいいから簡単確実に修正したいという場合は、同様にこだわりのMONOさんの記事で紹介されているParagon Alignment Toolを使うのが良いでしょう。また、WesternDigital社は、自社のAFT採用HDD向けのオフセット修正ツールを公開しています。