ディスクキャッシュは、ハードディスクとの間での読み込みや書き込みの速度を向上させるために使用するメモリです。物理的なハードディスクの場合は標準機能としてディスクキャッシュが存在しますが、仮想ディスクの場合は VM ホストサーバ のメモリを使用することになりますので、種類などを設定して細かい調整を行うことができるようになっています。
通常、ディスクキャッシュは最もよく使用されるプログラムやデータを保持します。ユーザやプログラムがデータを要求すると、オペレーティングシステムは最初にディスクキャッシュ内を検索し、そこにデータがあれば、ディスクから読み込み直すことなくデータを渡すことができるようになっています。
仮想ディスクデバイスのキャッシュを行うことで、ゲストマシンの性能を全体的に向上させることができます。キャッシュモードとディスクイメージ形式、そしてストレージサブシステムの組み合わせを最適化して、性能を向上させてください。
キャッシュモードを指定しない場合、既定では writeback
が使用されます。それぞれのゲストディスクに対しては、下記のいずれかのキャッシュモードを設定することができます:
writeback
はホスト側のページキャッシュを使用するための設定です。ゲスト側からの書き込み要求は、ホスト側のキャッシュに配置された時点で完了とみなされます。あとはキャッシュ管理の仕組みによって、実際のストレージに書き込みを行います。ゲスト側の仮想ストレージアダプタに対しては ライトバック キャッシュが存在しているものとして通知するため、ゲスト側からはデータの一貫性を確保するために、必要に応じてフラッシュ (キャッシュの清掃) コマンドが送られるようになります。
書き込み処理は、ストレージデバイスへのデータ書き込みをもって完了とみなします。ゲスト側の仮想ストレージアダプタに対しては ライトバック キャッシュが存在していないものとして通知されるため、ゲスト側からはフラッシュ (キャッシュの清掃) コマンドは送られません。
ホスト側のキャッシュを迂回し、ハイパーバイザとストレージデバイスとの間で読み込みおよび書き込みを直接行うようになります。実際のストレージデバイスでは、書き込みキュー内にのみデータを保存した時点で完了とみなすものも存在することから、ゲスト側の仮想ストレージアダプタに対しては ライトバック キャッシュが存在しているものとして通知します。このモードはホスト側のディスクに直接アクセスするのと同じ動作になります。
writeback モードと似たような動作になりますが、ゲスト側からの全てのフラッシュ (キャッシュの清掃) コマンドは無視されます。このモードを使用すると性能が向上する代わりに、ホスト側で障害が発生した際にデータ損失が発生する可能性があります。このモードはゲストのインストール時に便利な仕組みであり、本番環境での使用には適しません。
ゲスト側への書き込み完了はストレージデバイスへの書き込み完了まで待機させられ、ホスト側のキャッシュは迂回するようになります。 writethrough モードと同様に、このモードはフラッシュ (キャッシュの清掃) コマンドを送信しないゲストに対して有用です。
これらのモードは、ゲスト側のオペレーティングシステムから必要に応じてフラッシュ (キャッシュの清掃) コマンドを受信するため、最も安全な選択肢として用意されています。安全ではないゲストや不安定なゲストをお使いの場合は、 writethough または directsync をお使いください。
このモードはゲスト側に対して書き込みキャッシュの存在を通知するため、ゲスト側からは必要に応じてフラッシュ (キャッシュの清掃) コマンドを送ってもらう必要があります。このモードは、ゲスト側から書き込み完了を受け取ったあと、ホスト側でディスクへの書き込みが完了するまでに時間的な遅延を生じさせる設定であることから、データ損失の可能性がありうることになります。
このモードは writeback 方式に似ていますが、ゲスト側からのフラッシュ (キャッシュの清掃) コマンドは全て無視されます。そのため、ホスト側の障害発生時、データ損失の危険性があることになります。
ストレージデータのキャッシュは、ライブマイグレーションに対応する際には障害となりうるものです。現時点では、ライブマイグレーションを行うには raw
, qcow2
のいずれかのイメージ形式を使用する必要があります。クラスタ型のファイルシステムを使用している場合は、全てのキャッシュモードでライブマイグレーションを行うことができます。それ以外の場合、読み書き可能な共有ストレージで使用できるキャッシュモードは none
のみとなります。
libvirt
の管理レイヤには、いくつかの要素をベースにした移行の互換性チェック機能が含まれています。ゲスト側のストレージがクラスタ型のファイルシステム内に存在している場合、それが読み込み専用か共有可能としてマークされていれば、移行が許可されるかどうかの判断ではキャッシュモードを考慮しなくなります。それ以外の場合、 libvirt
ではキャッシュモードが none
に設定されていない限り、移行を拒否するようになっています。ただし、移行時に 「--unsafe」 オプションを指定することで、この制限を無視することができます。 virsh
を利用して移行する場合は、下記のようにします:
>
virsh migrate --live --unsafe
AIO モード設定が native
の場合、キャッシュモードを none
に設定する必要があります。それ以外のキャッシュモードを使用している場合、 AIO モードは自動的に既定値である threads
に切り戻されます。