PR

VMDは想像以上にデメリット有り。OS再インストール無しで簡単にAHCIに戻す方法

アプリケーション

仕事用のPCはなんとなくVMDを使っていたのですが、先日購入したintel Optane SSD DC P4800Xを認識出来ませんでした。
VMDは配下のPCIeポートを独立した仮想PCIドメインに隔離した上で再マッピングしてストレージを認識するのですが、intel Optane SSDは特定のVendor IDとDevice IDのペアを直接スキャンするため、VMDが再マッピングしてしまうとデバイスが見つからず、OSから認識されません。

一般的なSSDの利用でも、VMDにはデメリットがあります。
VMDは、CPUとSSDの間に割り込む仮想的な管理レイヤーとして機能し、RAIDの構築やホットプラグ(通電中の抜き差し)を行えるようにします。この、ストレージへの命令を一度VMDコントローラーが解釈して中継する、というプロセスが発生するため、VMDによるオーバーヘッドが発生します。

AHCI(NVMe直結)とVMDでのベンチマーク

左側がVMD、右側がAHCIでのベンチマーク結果です。
SEQ1M Q1T1 Writeが、AHCIでは7014MB/sですが、VMDではなんと2633MB/sと6割以上スコアが落ちています。

SEQ1M Q1T1 Write が62.5%落ち込み

VMDの最大のデメリットが、SEQ1M Q1T1の遅さです。遅いどころではなく、元の7014MB/sから比べると激遅です。
原因はIntel VMDアーキテクチャの根本的な構造と思われます。

[AHCI(NVMe直結)]
OS → NVMe Driver → SSD Controller → NAND
上記のように、OSがSSDコントローラーに直結してアクセスしますので、レイテンシがほぼゼロとなります。

[VMDモード]
OS → VMD Driver → 仮想PCIeブリッジ → NVMe Driver → SSD Controller → NAND
VMDでは、OSとSSDコントローラーの間に、VMDが割り込んで仮想PCIeブリッジを作成しますので、この分VMD割り込み処理 + コマンド変換コストが加算され、レイテンシの増加に繋がります。

Q1T1(キュー深度1・シングルスレッド) では、コマンドを1つ投げてから完了を待って次を投げるため、VMDのコマンド変換レイテンシが直列に積み重なります。Writeは特に書き込み確認のラウンドトリップが必要なため、Readより顕著に影響を受けます。
この結果、VMDではレイテンシの増加が致命的な遅延となり、転送速度が激落ちする結果となります。

なお、同じSEQ1Mでも、Q8T1ではVMDとAHCIでスコアにほぼ差が見られないのは、Q8T1ではキューに8コマンドを並列投入するため、VMDのオーバーヘッドがパイプライン内に隠蔽されてしまい、スループットが回復した結果となります。

Random 4K Q32T1 Read でAHCIが+6.6%優位

キュー深度32でもランダムReadでわずかにAHCIが優位なのは、VMDドライバのコマンドスケジューリングがNVMe native schedulerより若干非効率なためと思われます。
ただし、6%前後という差は誤差範囲ギリギリの差ですので、必ずしも上記が原因とも限りません。(特にOSをインストールしている環境のため誤差が出やすいと思われる)

SEQ1M Q8T1 はほぼ同等(誤差範囲内)

最大帯域幅を使い切るCrystal Disk Markでのベンチマークでは、VMDのオーバーヘッドはPCIe Gen5の帯域(約10GB/s)に対して無視できる水準となり、顕著な差は認められない結果となりました。
両者ともSSDのハードウェア限界付近で動作しています。

実際の動作における影響評価

ユースケーステストVMDの影響
大容量ファイルのコピー(連続)SEQ Q8T1ほぼなし
アプリ起動・OS応答性RND4K Q1T1軽微(1-3%)
DB/VMのランダムI/ORND4K Q32T1軽微(数%)
単一ファイルの高速書き込みSEQ Q1T1 Write⚠️ 最大62%低下

ベンチマーク結果を比較すると、VMDを選択するメリットって、何一つ無いように思います…。
VMDはRAIDやIntel RST機能が不要であれば、パフォーマンス面でのメリットはほぼありません。
特に、今回ベンチマークを測定したFireCuda 540のような高速なGen5 SSDでは、VMDのオーバーヘッドが相対的に目立つ結果となってしまいます。
BIOSでVMDを無効化してNVMe直結にすることで、最高の性能を出すことが可能です。

Windowsをそのままに、VMDからAHCIに変更する方法

現在使っているWindowsをそのまま、VMDからAHCIに変更するには、セーフモードで起動してコマンドラインで設定を変更する方法と、レジストリを書き換えて読み込むドライバを変更する方法の2通りあります。

安全なのはセーフモードの利用ですが、手軽なのはレジストリの書き換えになります。
今回、レジストリを書き換えてVMDからAHCIに変更しました。
レジストリを書き換えますので、実施前にバックアップを取っておくことをお勧めします。

Windowsでレジストリを変更

VMDで起動したWindowsで、レジストリエディタを開きます。
[Win] + [R] → regedit と入力し、レジストリエディタを管理者で開きます。

1,storahci(SATA AHCIドライバ)を有効化

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storahci

Start の値を 0 に変更
もともと 0 だった場合は、下記のStartOverrideで 3 が指定されていると思います。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storahci\StartOverride

0 というDWORD値が存在する場合、値を 0 に変更
私の環境ではStartは 0 でしたが、StartOverrideで3が指定されていたため、0に設定を変更しました。

2,stornvme(NVMeドライバ)を有効化

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\stornvme

Start の値を 0 に変更
もともと 0 だった場合は、下記のStartOverrideで 3 が指定されていると思います。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\stornvme\StartOverride

0 というDWORD値が存在する場合、値を 0 に変更
私の環境ではStartは 0 でしたが、StartOverrideで3が指定されていたため、0に設定を変更しました。

シャットダウンしてBIOS設定を変更

レジストリの書き換えを追えたら、Windowsをシャットダウンします。
再起動ではなくシャットダウンするのは、次回の起動で確実にBIOSセットアップ画面に入るためです。
電源投入後、BIOS画面を開いてください([DEL]キーまたは[F2]キー押下)

私が使っているマザーボード(ASUS ProArt Z890-CREATOR WIFI)では、Advanced Mode画面を開き、Advanced → System Agent (SA) Configration → VMD setup menuを開きます。
Enable VMD controllerという項目がありますので、EnabledからDisabledに変更します。

変更時、データ紛失が起こる可能性があるが良いか?という警告が出ますが、OKを押してください。
Windowsは先ほどAHCIドライバを読み込むように設定変更済みですので問題ありません。

設定を保存した後、再起動してください。

正常動作すれば設定変更完了

無事Windowsが起動すれば、AHCIに設定が変更されています。
デバイスマネージャーを開き、確認してみてください。

記憶域コントローラーが、標準NVM Express コントローラーとなっており、VMDではないことが確認できました。
RAIDを組んだり、ホットプラグを使わない場合は百害あって一利なし、といった感じのVMD。使っている場合は、AHCIに切り替えることをお勧めします。

コメント

タイトルとURLをコピーしました