3. Advanced Format Disk (512 Emulation)に関するサポート
Advanced Format Disk (512 Emulation)について
従来のハード ディスク ドライブは、512 バイトのセクタを基にしており、物理ディスクのアクセスは、この単位を基にしてアドレス指定されました。しかし、ハードディスク サイズがより大きくなると、セクタ数が増えて、ボトルネックになることがあります。そのため、近年、ハード ディスク ベンダーが、4096バイト (4 KB) のセクタ サイズを使用する新しいディスクへの移行を開始しています。これは、ディスクサイズの増加に伴う、セクタ数の増加という問題を解決しますが、アプリケーションや、デバイス ドライバ、オペレーティング システムとの互換性に大きな問題を引き起こすことがあります。
このような、大きなセクタを持つディスクへの移行の負担を軽減させるために、ハードウェア ベンダーは、”Advanced Format Disk”、"512 Emulation" または、 "512E"とよばれるソリューションを提供しています。この512Eディスクの場合、実際は4096バイトの物理セクタをもっているのですが、ハードディスクのファームウェアが、512バイトの論理セクタをエミュレートし、それぞれを4096バイトの物理セクタにマップします。そして、このディスク ドライブは、OSに対してセクタ サイズは512バイトであるとレポートし、ファームウェアは、512バイトのI/O要求をドライバから受け取って、4096バイトの物理セクタに対して、read-modify-write操作*を行います。
* 詳細は、以下のHow Emulation Works: Read-Modify-Write (RMW)の項を参照のこと
512-byte Emulation (512e) Disk Compatibility Update
SQL Serverへの影響とその対応について
SQL Serverのトランザクション ログ マネージャのコードは、データベースが配置されているディスクのセクタ サイズに依存しています。なぜなら、トランザクション ログ マネージャは、セクタ サイズにアラインされたI/Oを発行することで、発行したI/Oが必ずディスクに書き込まれたことを保証しているからです。しかし、512Eディスクによって、実際は4096バイトの物理セクタをもっているディスクをSQL Serverが512バイトであると認識してしまうとどうなるでしょうか。この場合、以下の2点に関する懸念点が考えられます。
• データ消失の問題
たとえば、SQL Serverが、4096バイトの1物理セクタ内にあるいくつかの論理セクタに対して書き込みを行っていたとします。しかし、N回目の書き込みでエラーが発生しました。このとき、SQL Serverは、N回目の書き込みが失敗したことは認識しますが、直前のN-1回目に行った書き込みは成功したと認識しています。しかし、実際には同一セクタで発生したエラーであるために、それ以前に発行した書き込みまでもがエラーのときに消えてしまっている可能性があります。
• パフォーマンスの問題
512Eディスク ドライブの場合、ファームウェアは、4096バイトの物理セクタに対して、read-modify-write操作を行います。read-modify-write操作は、あきらかに、単純なwrite操作よりも遅い操作です。また、論理パーティションが物理セクタの境界にアラインされていないことが原因で、ログ ファイルへの書き込み要求の多くが4096バイトのセクタにアラインされていないと、ログファイルへの書き込みのスループットが全体的に低下します。アプリケーションの多くは、トラクション ログへの書き込み時間にパフォーマンスが左右されるため、ログ書き込みが遅延するとアプリケーションのパフォーマンス低下を引き起こす可能性があります。
この問題については、以下のブログでも紹介されています。
Windows オペレーティング システムは、この512Eディスクをサポートするために、QFEをリリースしています。このQFEを適用することで、物理セクタのサイズが取得できるようになります。
Windowsの512Eディスク ドライブに関するサポート ポリシーについては、以下にまとめられています。
Windows APIの観点からいえば、このQFEを適用することで、DeviceIOControlのIOCTL_STORAGE_QUERY_PROPERTY control codeを通して物理セクタサイズを取得できるようになります。
前述の、KBを参照していただくとわかりますが、セクタ サイズを表示するユーティリティ ツールであるfsutil.exeもあわせて更新されていますので、このツールを使用して、512Eディスクであるかどうかが確認できます。
QFEを適用する前に、fsutilの出力結果を確認してみると、論理セクタのサイズのみが出力されます。
D:\>fsutil fsinfo ntfsinfo G:
NTFS Volume Serial Number : 0x025881ce5881c141
Version : 3.1
Number Sectors : 0x00000000aea867ff
Total Clusters : 0x0000000015d50cff
Free Clusters : 0x0000000014aeaa33
Total Reserved : 0x0000000000000000
Bytes Per Sector : 512
Bytes Per Cluster : 4096
Bytes Per FileRecord Segment : 1024
Clusters Per FileRecord Segment : 0
Mft Valid Data Length : 0x0000000000480000
Mft Start Lcn : 0x00000000000c0000
Mft2 Start Lcn : 0x0000000000000002
Mft Zone Start : 0x00000000000c0480
Mft Zone End : 0x00000000000cc840
RM Identifier: 4B0A3EEF-72AA-11E0-9257-000FFEE506A7
一方、QFEを適用した後のfsutilの出力結果を確認すると、論理セクタのサイズに加えて、物理セクタのサイズも出力されるようになっていることがわかります。
D:\>fsutil fsinfo ntfsinfo G: NTFS Volume Serial Number : 0x025881ce5881c141 Version : 3.1 Number Sectors : 0x00000000aea867ff Total Clusters : 0x0000000015d50cff Free Clusters : 0x0000000014aeaa33 Total Reserved : 0x0000000000000000 Bytes Per Sector : 512 Bytes Per Physical Sector : 4096 Bytes Per Cluster : 4096 Bytes Per FileRecord Segment : 1024 Clusters Per FileRecord Segment : 0 Mft Valid Data Length : 0x0000000000480000 Mft Start Lcn : 0x00000000000c0000 Mft2 Start Lcn : 0x0000000000000002 Mft Zone Start : 0x00000000000c0480 Mft Zone End : 0x00000000000cc840 RM Identifier: 4B0A3EEF-72AA-11E0-9257-000FFEE506A7
SQL Server 2012では、前述のQFEがOSに適用されていると、実際のセクタ サイズを認識することができます。実際のセクタ サイズを認識できると、SQL Serverは512Eディスク ドライブの論理セクタ サイズではなく、物理セクタのセクタ サイズをI/Oに使用します。
なお、この対応については、SQL Server 2012だけではなく、SQL Server 2008 R2 Service Pack 1にも含まれています。詳細については、以下を参照ください。
***
次回もひきつづき、あまり知られていないけれども使えるSQL Server 2012の機能強化点について紹介します。おたのしみに!