投稿時点では、Ebdsv5 / Ebdsv5 シリーズのインスタンスを使用した Azure VM では、ディスクとの接続インタフェースとして NVMe を使用することができます。
Ebdsv5 シリーズは VM サイズ: Azure VM 上の SQL Server のパフォーマンスに関するベスト プラクティス で記載されているように、幅広い SQL Server のワークロードを動作させるために推奨される VM となっています。
今後、Azure VM で SQL Server を動作させる際に最適なパフォーマンスを発揮するためには NVMe の利用を検討するシーンも出てくるかと思い検証をして得られた知見をまとめておきたいと思います。
Contents
サポートされる VM について
デプロイ時の考慮点
前述のとおり、現時点では NVMe は Ebdsv5 / Ebdsv5 シリーズ の VM でサポートされています。
これらのシリーズを使用して VM を展開する場合でも、NVMe の利用はオプションとなっており、デプロイ時に次の設定を有効にする必要があります。
明示的に有効にしていないと SCSI を使用したディスク接続となります。
Azure VM で NVMe のディスクコントローラーを有効にするためには どのようにして NVMe を VM ファミリで有効にすればよいですか? に記載されている次の条件を満たす必要があります。
- Ebdsv5 / Ebdsv5 シリーズ を使用する
- Gen2 で VM を作成する
- NVMe サポートのタグが付けられているイメージを使用する
- 展開時に NVMe の利用を明示的に設定する
- NVMe が有効になっているリージョンを使用する
- 使用可能なリージョンは NVMe サイズはどのリージョンで利用できますか? に記載されています
- 現時点では記載はないのですが東日本でも使用することはできました
- セキュリティ種類は「Standard」を設定する
- 「トラステッド起動仮想マシン」では NVMe はサポートされていない
これらの条件を満たし、VM を展開すると、VM のディスクの接続方法が「Virtual Disk NVME Premium」として接続が行われます。
(D ドライブのディスクについては NVMe を使用していても従来の接続方式となるようです)
後述していますが、2023/9 時点では、Windows OS については「SCSI で作成した VM のディスクコントローラーを NVMe に変更することはできないという制約」がありますので、Windows OS については、作成時に NVMe を有効にした VM として作成する必要があります。
NVMe サポートのタグが付けられていないイメージで NVMe を使用できるようにする
SQL Server インストール済みのイメージも該当するのですが、Marketplace から Microsoft が提供しているイメージについて、すべてのイメージが NVMe サポートのタグが付けられているわけではなく、サポートされている OS イメージ が NVMe サポートとなっているイメージとなります。
これ以外のイメージついては展開時に NVMe を有効にすることはできません。
NVMe サポートのタグが付けられていないイメージでは NVMe を有効にする手段がないかというとそういうことは無いようです。
VM 構成を再作成せず、イメージにタグ付けせずに、タグなしイメージを使用して作成された SCSI Ebsv5 または Ebdsv5 VM (例: 8 vCPU) のサイズを別のサイズ (E112i) の NVMe 対応 VM にサイズ変更するにはどうすればよいですか? に記載されていますが、VM 展開後に OS ディスクに対して NVMe サポートの設定を付与して、NVMe を有効化するという方法が提供されています。
これを使用すると Ebdsv5 / Ebdsv5 シリーズ を使用し、NVMe サポートのタグが付けられているイメージの展開という条件のみを満たしていない場合について、OS ディスクに NVMe サポートの設定を追加することで NVMe を利用することができるようになります。
上記の情報のスクリプト内の「$vm.StorageProfile.DiskControllerType」の設定を変更するためには、Az.Compute の PowerShell モジュールが最新化されている必要がありますが、最新のスクリプト実行環境で実行していれば、設定変更はスムーズにできるかと思います。
この方法を使用した場合、SCSI から NVMe に切り替わるということになりますが、Windows を使用している場合は次の節の注意点がありました。
Windows のイメージで SCSI から NVMe の変更時に INACCESSIBLE_BOOT_DEVICE が発生 (2023/9 時点)
2023/9 時点の注意点となり今後、対応される予定はあるようです
Windows のイメージを使用して、SCSI から NVMe に変更した場合、現時点では注意点がありました。
NVMe のサポートのタグが付けられているイメージに対して、NVMe を有効化する手順については VM 構成を再作成せずに、SCSI Ebsv5 または Ebdsv5 VM (例: 48 vCPU) を別のサイズ (E112i) の NVMe 対応 VM にサイズ変更するにはどうすればよいですか? に記載されています。
この手順は上述の NVMe のサポートタグが付けらえていないイメージに対してのタグ付けの処理の一部のみを切り出したものとなります。
現時点では、SCSI で作成した Window
s 環境を NVMe に変更し起動をすると、次のエラーが発生し起動しません。
(NVMe サポートで最初から作成し、NVMe → SCSI → NVMe のような変更 / Linux では問題なく、Windows 環境で SCSI で作成した VM を NVMeについて問題が発生します。)
Your device ran into a problem and needs to restart. If you call a support person, give them this info: INACCESSIBLE_BOOT_DEVICE 0xFFFF808F526071F8 0xFFFFFFFFC0000034 0x0000000000000000 0x0000000000000001
このログは「ブート診断」の「シリアルログ」から確認できるものとなるのですが、SCSI で作成した VM を NVMe に変更した場合、変更自体は正常に実行できるのですが、起動をすると上記のエラーが発生しエラーと再起動を繰り返す状態となってしまいました。
この状態が発生した場合は、上述した技術情報のスクリプトを SCSI に変更して実行し、ディスクコントローラーを SCSI に戻すと起動するようになります。
Windows 環境で SCSI から NVMe に変更した場合、次のような設定が行われています。
- ディスクの認識の順が「OS 用ディスク / D ドライブ用ディスク」 から「D ドライブ用ディスク / OS 用ディスク」の順に切り替わる
- 気づいたら 「OS 用ディスク / D ドライブ用ディスク」に戻っていることもあり…
- ディスクが「Microsoft Virtual Disk」→「Virtual Disk NVME Premium」に切り替わる
「INACCESSIBLE_BOOT_DEVICE」と関係しているのかまでは調査できていませんが、この辺の影響を受けているような気もしていません。
Windows 環境で SCSI から NVMe に変更して起動しなくなった場合の暫定的な対応
SR で確認をしていたのですが 2023/9 時点では Windows 環境については次の制約があるとのことでした。
NVMe タグ付き OS イメージで同じ VM vCPU サイズを保持しながら、SCSI Ebv5 または Ebdsv5 VM を NVMe 対応に変換できますか?
現在、このシナリオは Linux オペレーティング システムでのみサポートされており、Windows オペレーティング システムではサポートされていません。 Windows OS でのこの機能のサポートは、近日中に追加される予定です
2023/9 時点では Windows については、SCSI から NVMe への変更は非サポートとなっていました。
(Linux は変更可能です)
現時点では非サポートとなりますが、Windows 環境で SCSI で作成した仮想マシンについては、次の操作を実施することで、 NVMe にディスクコントローラーに切り替え起動することができました。
- ディスクコントローラーの種類を「SCSI」を使用した状態で起動
- ファイル名を指定して実行から「msconfig」を実行し、Boot で Safeboot を有効にし、VM の割り当て解除による停止を行う
- ディスクコントローラーの種類を「NVMe」に変更する
- RDP が接続できない状態で起動するため、Azure Portal から「シリアル コンソール」で接続し、cmd を実行できる状態にする
- cmd の実行は シリアル コンソールで CMD または PowerShell を使用する を参照
- シリアル コンソールで起動したコマンドプロンプトで「bcdedit /detevalue {current} safeboot」を実行し Safeboot による起動のエントリを削除してから VM を再起動する
NVMe をサポートしているインスタンスサイズについて、SCSI から NVMe に変更して、「INACCESSIBLE_BOOT_DEVICE」で起動できなくなった場合、SCSI に戻すことなく NVMe で起動するためには、このような方法をとってみると、回復できるかもしれません。
SQL Server のサポート状況
Azure VM で SQL Server を使用する場合の NVMe のサポート状況ですが、VM サイズ: Azure VM 上の SQL Server のパフォーマンスに関するベスト プラクティス に記載されている次の内容が、現時点でアナウンスされている情報となるのではないでしょうか。
注意
Ebdsv5 シリーズは、サイズが大きい場合 (48 vCPU 以上)、NVMe 対応ストレージ アクセスをサポートします。 この I/O パフォーマンスの高さを利用するには、NVMe を使用して仮想マシンをデプロイする必要があります。 SQL Server マーケットプレース イメージに対する NVMe のサポートは近日公開予定ですが、現在は NVMe を利用するために SQL Server を自身でインストールする必要があります。
前述のとおり、SQL Server インストール済みイメージは NVMe サポートのタグが付いていませんので、SQL Server インストール済みイメージを NVMe が有効な状態で展開することはできません。
- NVMe が有効な VM に対して SQL Server をセルフインストールする
- 前述の NVMe をサポートしていないイメージで展開した VM の OS ディスクに対して NVMe サポートを追加する
というような方法で NVMe を使用することになるのではないでしょうか。
NVMe が有効な VM で SQL Server を使用する場合ですが、1 つ注意点があり、この環境は次の情報に該当します。
NVMe を使用した Azure VM では、PhysicalBytesPerSectorForAtomicity / PhysicalBytesPerSectorForPerformance が「8192」となります。
SQL Serer は次の情報に記載されているように ネイティブなセクターサイズが 512 / 4096 以外はサポートされていません。
新規インストールであればインストールに失敗し、SQL Server インストール済みイメージを NVMe に変換した場合には、SQL Server はインストール済みとなりますが、SQL Server のサービスが起動しません。
NVMe を有効にしている環境では 解決策 に記載されている、レジストリ変更をしてセクターサイズのエミュレートを実施する必要が出てきます。(NVMe / SCSI 間で Always On 可用性グループを使用する場合は -T1800 の利用も検討)