第14章 KVM ゲストのタイミング管理

仮想化では、ゲスト仮想マシンのタイミング管理に内在する各種の課題があります。仮想マシン内の割り込みは実際の割り込みではなく、ホストマシンがゲスト仮想マシンに挿入しているものです。このため、割り込みは常に同時かつ即座に配信できるわけではありません。ホストは別のゲスト仮想マシンを実行していたり、別のプロセスを実行している場合もあり、割り込みに通常必要となる正確なタイミングを得ることが常に可能とは限りません。
セッションの妥当性やマイグレーション、他のネットワークアクティビティーはタイムスタンプに依存して正確性を保持しているため、正確なタイミング管理機能を実行していないゲスト仮想マシンは、ネットワークアプリケーションおよびプロセスに関して問題が発生する可能性があります。
KVM は、ゲスト仮想マシンに準仮想化クロック (kvm-clock) を提供することにより、この問題に対処します。しかし、時間管理が不正確な場合に影響を受ける可能性のあるアクティビティーの前には、時間をテストすることが依然として重要です。

注記

Red Hat Enterprise Linux 5.5 およびそれ以降、また Red Hat Enterprise Linux 6.0 およびそれ以降は、デフォルトのクロックソースに kvm-clock を使用します。kvm-clock なしでこれらを実行するには特別な設定が必要になり、この方法は推奨されません。

重要

ホストとゲスト仮想マシンで、Network Time Protocol (NTP) デーモンが稼働している必要があります。ntpd サービスを有効にしてください。
# service ntpd start
デフォルトの起動シーケンスに ntpd サービスを追加します。
# chkconfig ntpd on
クロックの実行速度と参照クロックソースとの違いが 0.05% 以下であれば、ntpdサービスはクロックスキューの影響を修正します。ntp 起動スクリプトが必要に応じて起動時のシステムクロックを調整することで、参照時間からのクロックのオフセットを調整します。

14.1. 不変タイムスタンプカウンター (TSC)

最新の Intel と AMD の CPU は、不変タイムスタンプカウンター (TSC) を提供します。不変 TSC のカウント頻度は、たとえば CPU コア自体が節電ポリシーに従うために周波数を変更しても変わりません。不変 TSC の周波数を備えた CPU は、KVM ゲストで TSC をクロックソースとして使用するために必要です。
constant_tsc フラグが付いている場合には、CPU は 不変 TSC を搭載しています。CPU に constant_tsc フラグが付いているかどうかを確認するには、以下のコマンドを実行します。
$ cat /proc/cpuinfo | grep constant_tsc
いずれかの出力が表示された場合は、CPU に constant_tsc ビットが搭載されていることになります。出力が全く表示されなかった場合には、以下の手順にしたがってください。

14.1.1. 不変 TSC を搭載していないホストの設定

不変 TSC の周波数のないシステムは、仮想マシンのクロックソースに TSC を使用できず、追加設定が必要になります。電源管理機能により正確な時間管理が妨げられるので、KVM を使用して仮想マシンで正確な時間を管理するには、この機能を無効にする必要があります。

重要

以下に説明する手順は、AMD リビジョン F の CPU のみが対象となります。
CPU に constant_tsc ビットが搭載されていない場合には、電源管理機能をすべて無効にします (BZ#513138)。各システムには、時間管理のためのタイマーが複数あります。TSC は、ホスト上では安定していません。これは、cpufreq の変化やディープ C ステート、より高速な TSC を搭載したホストへの移行などが原因となる場合があります。ディープ C スリープ状態に入ると、TSC が停止する可能性があります。カーネルがディープ C ステートを使用しないようにするには、ホスト上の grub.conf ファイルのカーネルブートオプションに、processor.max_cstate=1 を追記します。
title Red Hat Enterprise Linux (2.6.32-330.x86_64)
        root (hd0,0)
	kernel /vmlinuz-2.6.32-330.x86_64 ro root=/dev/VolGroup00/LogVol00 rhgb quiet \
   processor.max_cstate=1
/etc/sysconfig/cpuspeed 設定ファイルを編集して MIN_SPEEDMAX_SPEED の変数を使用可能な最高の周波数に変更することにより、cpufreq を無効にします (constant_tsc が搭載されていないホストのみ必要)。有効な上限値は、/sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies ファイルに記載されています。