この記事では、仮想ストレージ スタックでのキャッシュの概要について説明し、必要なデータ整合性要件が満たされていることを確認するためのガイダンスをソフトウェア開発者と管理者に提供します。
元の KB 番号: 2801713
詳細情報
少なくとも、システム内のさまざまなキャッシュレイヤーには、通常、次のものが含まれます。
- ファイルシステム キャッシュ。 既定では、Windows はディスクから読み取られ、ディスクに書き込まれるファイル データをキャッシュします。 つまり、読み取り操作では、物理ディスクではなくシステム ファイル キャッシュと呼ばれるシステム メモリ内の領域からファイル データを読み取ります。 これに対応して、書き込み操作では、ディスクではなくシステム ファイル キャッシュにファイル データを書き込みます。この種類のキャッシュはライトバック キャッシュと呼ばれます。 アプリケーションでは、ファイルシステムのバッファーなしのセマンティクスを使用して、書き込みがシステム キャッシュにキャッシュされないようにすることができます。
- ディスク ドライブのキャッシュ。 ディスク ドライブは、ディスク ドライブのパフォーマンスを向上させるために、ファームウェアレイヤーでキャッシュを実装します。 ファームウェアレイヤーでのキャッシュはパフォーマンスを向上させることができますが、電源障害が発生した場合にディスクに書き込まれる前にディスク上のデータが失われる可能性があります。 このキャッシュ動作を制御するオプションは、SCSI、SATA、ATA などの標準化されたドライブ インターフェイスの一部です。 これらのオプションは次のとおりです。
ユニット アクセス強制 (FUA) と呼ばれる I/O 単位制御メカニズムを使用します。 このフラグは、シグナル通知が完了する前に、ドライブが安定したメディア ストレージにデータを書き込む必要があることを指定します。 これを行う必要があるアプリケーションでは、ディスクの問題 FUA でデータが安定していることを確認し、電源障害が発生した場合にデータが失われないようにします。
サーバー クラス ディスク ドライブ (SCSI およびファイバー チャネル) は、通常、FUA フラグをサポートします。 コモディティ ドライブ (ATA、SATA、USB) では、FUA が受け入れられない場合があります。 ドライブの書き込みキャッシュが無効でない限り、データが不整合な状態になる可能性があります。 このメカニズムに依存している場合は、ディスク サブシステムが FUA を正しく処理していることを確認してください。
ディスク キャッシュを強制的にリフレッシュします。 フラッシュをディスクに送信するアプリケーションまたはシステムは、ディスク サブシステムにキャッシュ内のすべてのデータを強制的にディスクに書き込みます。 フラッシュを頻繁に発行すると、フラッシュが戻る前にディスク キャッシュ内のすべての情報をディスク メディアに書き込む必要があるため、パフォーマンスが低下します。
ディスク キャッシュを無効にします。 IOCTL_DISK_SET_CACHE_INFORMATION制御コードをディスクに発行することで、ディスクの書き込みキャッシュを無効にすることができます。 書き込みキャッシュの状態 (オンまたはオフ) は、システムの再起動後も保持されます。 この制御コードを発行すると、そのディスクに対して発行されるすべての I/O メカニズムのパフォーマンスに非常に大きな影響が生じます。 これらの結果には、パフォーマンスの著しい低下が含まれる可能性が最も高くなります。 デプロイする前に、このコントロール コードの使用を慎重に検討する必要があります。
注
ディスク キャッシュを無効にできない場合は、オプション 1 と 2 を検討する必要があります。
そのため、アプリケーションまたはワークロードが仮想マシン (VM) 内で実行されている場合、さまざまなキャッシュ レイヤーにデータ整合性の影響があります。
ゲスト ファイルシステム キャッシュ。 このレイヤーは、前に説明したように、ファイルシステムのバッファーなしのセマンティクスを使用してバイパスできます。
ゲスト仮想ディスク キャッシュ。 仮想化された IDE (エミュレートまたは合成) または SCSI デバイスは、下位スタックによって返される書き込みキャッシュ状態を報告します。 仮想ディスクは、書き込みキャッシュが有効になっていることを報告し、ゲストが書き込みキャッシュをオフにすることを拒否します。 キャッシュを無効にすると失敗し、キャッシュが有効になっていることを常に応答します。 この動作は、次の理由で必要です。
Hyper-V、同じディスク上で実行されているすべての VM でディスク キャッシュ設定が同じである必要があると想定することはできません。
基になるストレージには、オフにできない常時オンの書き込みキャッシュがある場合があります。 これは、仮想ディスクが同じホスト上の別のディスク (ライブ ストレージ移行) または別のホスト (ライブ マイグレーション) に移行される可能性があるという事実によって強調されます。
アプリケーションはディスク キャッシュをオフにできないため、停電時にデータの整合性を確保する必要があるゲスト内のアプリケーションは、オプション 1 またはオプション 2 を使用して、書き込みによってディスク キャッシュがバイパスされるようにする必要があります。
ホスト ファイルシステム キャッシュ。 また、Hyper-V ストレージ スタックでは、バッファーなしの書き込みを使用して、ゲストからの書き込みが基になるホスト ファイルシステム スタックをバイパスするようにします。
ホスト ディスク キャッシュ。 ゲストによって設定された場合、FUA はホストとホスト ストレージ スタックに伝達されます。 ホスト物理ディスク システムは、電源障害によって仮想化されたワークロード データの整合性を確保するために、次の条件の少なくとも 1 つを満たす必要があります。
- システムはサーバー クラス ディスク (SCSI、ファイバー チャネル) を使用します。
- システムは、ディスクがバッテリベースのキャッシュ ホスト バス アダプター (HBA) に接続されていることを確認します。
- システムは、ストレージ・デバイスとしてストレージ・コントローラー (RAID システムなど) を使用します。
- システムは、ディスクへの電力が無停電電源装置 (UPS) によって保護されていることを確認します。
- システムは、ディスクの書き込みキャッシュ機能が無効になっていることを確認します。