SQL Server のディスクパーティションアライメント調整のホワイトペーパーとして以下のドキュメントがあります。
SQL Server 2008 のためのディスク パーティション アライメント ベスト プラクティス
この内容を少し自分なりに整理してみたいと思います。
今回は MBR のベーシックディスクを前提としています。
Exchange でも同様の考えがあり、こちらに関しては以下の技術文書で公開されています。
記憶域のトラック境界に Exchange 入出力 (I/O) を配置する方法
■用語と設定の整理
このホワイトペーパー内に以下のセクションがあります。
重要な相関関係 : パーティション オフセット、ファイル アロケーション ユニット サイズ、およびストライプ ユニット サイズ
このセクションの中に
( パーティション オフセット ) ÷ ( ストライプ ユニット サイズ )
( ストライプ ユニット サイズ ) ÷ ( ファイル アロケーション ユニット サイズ )
という二つの式が提示されています。
このドキュメントを読むに当たり、上記の用語がどの設定を指しているのかを把握するのが重要になってくるかと思います。
- ストライプユニットサイズ
ストライプユニットサイズですが、この設定に関しては Windows 上ではなくディスクストレージ上の設定となります。
そのため、RAID 構成をする際等に設定をすることになります。
私が使用している環境は、NEC GT110b なのですがこの環境はオンボードのソフト RAID を使用して RAID を構成しています。
この環境では、ストライプユニットサイズは 64KB となっています。
ストライプユニットサイズに関しては事前にストレージ側から情報を入手する必要があります。
確認の仕方は RAID の管理ソフトによって変わってきそうですね。
# MegaRAID はそれらしい項目があるのは確認したのですが、あまりハードウェア触らないので細かくは見れていません…。 - パーティション オフセット
ディスクの管理で、パーティションの情報を確認してみると現在は以下のような状態となっています。
パーティション オフセットはそのパーティションがどこから始まるのかを示したものになります。
パーティションオフセットに関してはドキュメント内に記載されている、以下のコマンドで取得することが可能です。wmic partition get BlockSize, StartingOffset, Name, Index 実際に実行した結果がこちらです。
# Disk 1 は GPT でフォーマットしているので、オフセットがディスク 0 とは異なっています。
この結果は WIndows Server 2008 R2 で取得したものなのですが、ディスク #0、パーティション #0 の Starting Offset が 1,048,576 となっています。
Starting Offset はそのパーティションが始まる一をバイトで示したものになります。
1,048,576 / 1,024 / 1,024 = 1MB
となるので、ディスク #0、パーティション #0 は先頭から 1MB 離れた位置から 始まっていることが確認できます。
パーティション #1 は 105,906,176 から開始されていますので、
105,906,176? / 1,024? / 1024 = 101MB
となります。
ホワイトペーパーによるとディスクの先頭には 63 セクターの予約済みセクターがあり、ディスクのセクターサイズが 512B の場合、
512B × 63 / 1024 = 31.5KB
となり、先頭の 31.5KB は予約済みの領域で確保されているため使用することができません。
それ以降にパーティション 0 が作成されることになります。
Windows Server 2008 以降では自動的にアライメントの調整 (オフセットの開始位置の自動調整) がされるようになっており、[HKLMSYSTEMCurrentControlSetservicesvdsAlignment] に指定されている値でアライメントが自動で調整されます。
# ディスクのサイズによって自動的にオフセットが調整されるようです。
4G 以上のディスクを使用している場合、オフセットの開始位置は 1048576 となるようです。
この値は、先ほど WMIC で調べた結果と同じ値となりますね。
Windows Server 2003 までは、このオフセットと調整の機能がついていなかったため、最初のパーティションのオフセットが、32,256 (31.5KB)? となっています。
先頭の 31.5KB は予約済みセクターのため、そのすぐ後にパーティションが作成されているのが確認できますね。
Windows 2003 以前の場合は、パーティションを DISKPART コマンドで作成する際に、以下のコマンドを実行してアライメントを調整することが可能です。
# 64KB のストライプユニットサイズの環境ならば、アライメントは 64 でもよい気がします。create partition primary align=1024 DISKPART でこのコマンドを実行して、パーティションを作成することでオフセットを 1MB から始めることが可能となります。
- ファイルアロケーションユニットサイズ
ファイルアロケーションユニットサイズは、フォーマット時に指定をするものになります。
アロケーションユニットサイズはパーティションごとに指定することが可能です。
各パーティションでアロケーションユニットサイズがどのように設定されているかは以下のコマンドで確認することができます。fsutil fsinfo ntfsinfo <ドライブ文字> 例)
fsutil fsinfo ntfsinfo C:
クラスターあたりのバイト数が、アロケーションユニットサイズとなります。
SQL Server ではアロケーションユニットサイズはエクステントのサイズと同じ 64KB が望ましいとされています。
ドキュメントや書籍を見直したところ、64KB はエクステントサイズということではなく、大きなデータブロックサイズという意味で 64KB にするという記載になっていました。数値根拠の記載を修正させていただきました。
デフォルトの設定 (既定値) では 4KB で設定されると思います。
これらの数値が最初に記載した数式に当てはめる内容となります。
これをドキュメント内の絵と対応してみます。
ストライプユニットサイズの境界に合わせて、パーティションオフセットを開始するのが重要になってくるということですね。
基本的にはドキュメントに記載されているように
最適なディスク I/O パフォーマンスを得るために満たしておくべき基本的前提条件として、 2 組の相関関係があります。つまり、次の計算結果が整数値にならなければなりません。
( パーティション オフセット ) ÷ ( ストライプ ユニット サイズ )
( ストライプ ユニット サイズ ) ÷ ( ファイル アロケーション ユニット サイズ )
を満たせばよいかと思います。
Windows Server 2008 以降の場合、
1,048,576 (パーティションオフセット) / 65,536 (64K : ストライプユニットサイズ (RAID の設定値を使用)) = 16
65,536 (64K : ストライプユニットサイズ (RAID の設定値を使用)) / 65,536 (64K : アロケーションユニットサイズ) = 1
となるため、どちらの結果も整数値となっています。
# アロケーションユニットサイズは デフォルトの 4 KB? (4096) でも整数値 (除算の結果が 16) となりますが、大きなデータブロックサイズとして 64KB が推奨されることが多いです。
アライメントの自動調整がされない Windows Server 2003 以前の場合、
32,256 (パーティションオフセット) / 65,536 (64K : ストライプユニットサイズ (RAID の設定値を使用)) = 0.4921875
65,536 (64K : ストライプユニットサイズ (RAID の設定値を使用)) / 65,536 (64K : アロケーションユニットサイズ) = 1
となり、アライメントの調整がされていない場合は、オフセットの位置がちょうどよいストライプユニットの位置にあっていないため、調整した場合と比較して、ディスク I/O の効率が低いものとなるようです。
性能用件がシビアな場合を除いてこのあたりはあまり意識することはなさそうですが、いざ確認をしようと思った場合、どの数値を使えばよいかを忘れてしまうのですよね…。
一度メモとして残しておけば再利用できそうでしたので投稿してみました。