第8章 KVM ゲストのタイミング管理
仮想化には、ゲスト仮想マシンでの時間管理に関するいくつかの課題が含まれます。
- 割り込みは、すべてのゲスト仮想マシンに常に同時に瞬時に配信されるとは限りません。これは、仮想マシンの割り込みは真の割り込みではないためです。代わりに、ホストマシンによりゲスト仮想マシンに挿入されます。
- ホストは、別のゲスト仮想マシンを実行している場合や、別のプロセスの場合があります。したがって、割り込みにより通常必要とされる正確なタイミングは、常に可能となるとは限りません。
正確な時刻管理が行われていないゲスト仮想マシンでは、セッションの有効性、移行、およびその他のネットワークアクティビティーがタイムスタンプに依存して正しい状態を維持するため、ネットワークアプリケーションとプロセスで問題が発生する可能性があります。
KVM は、ゲスト仮想マシンに準仮想化クロック (kvm-clock) を提供することで、この問題を回避します。ただし、ゲストの移行など、時間管理の不正確さによって影響を受ける可能性のあるアクティビティーを試行する前に、タイミングをテストすることは依然として重要です。
重要
上記の問題を回避するには、ホストとゲスト仮想マシンで、ネットワークタイムプロトコル (NTP) を設定する必要があります。Red Hat Enterprise Linux 6 以前を使用するゲストでは、NTP が
ntpd
サービスにより実装されます。詳細は、Red Hat Enterprise 6 Deployment Guide を参照してください。
Red Hat Enterprise Linux 7 を使用するシステムの場合、NTP の時刻同期サービスは、
ntpd
または chronyd
サービスによって提供できます。Chrony には、仮想マシンに利点があることに注意してください。詳細は、Red Hat Enterprise Linux 7 System Administrator's Guide の Configuring NTP Using the chrony Suite および Configuring NTP Using ntpd セクションを参照してください。
ゲスト仮想マシンの時間同期のメカニズム
デフォルトでは、ゲストは次のようにハイパーバイザーと時刻を同期します。
- ゲストシステムの起動時に、ゲストはエミュレートリアルタイムクロック (RTC) から時間を読み取ります。
- NTP プロトコルが開始すると、ゲストクロックが自動的に同期します。その後、通常のゲスト操作時に、NTP はゲストでクロック調整を実行します。
- 一時停止または復元プロセス後にゲストを再開する場合は、管理ソフトウェアー (virt-manager など) がゲストのクロックを指定した値に同期させるコマンドを実行する必要があります。この同期は、QEMU ゲストエージェントがゲストにインストールされており、この機能に対応している場合にのみ機能します。ゲストのクロックが同期する値は、通常、ホストのクロック値です。
Constant タイムスタンプカウンター (TSC)
最新の Intel および AMD の CPU では、Constant TSC (Time Stamp Counter) が提供されます。消費電力ポリシーに従うなど、CPU コア自体の周波数が変更しても、Constant TSC のカウント周波数は変化しません。TSC を KVM ゲストのクロックソースとして使用するには、Constant TSC 周波数の CPU が必要です。
constant_tsc
フラグが存在する場合、CPU には一定のタイムスタンプカウンターがあります。CPU に constant_tsc
フラグがあるかどうかを確認するには、次のコマンドを実行します。
$ cat /proc/cpuinfo | grep constant_tsc
いずれかの出力が得られると、CPU には
constant_tsc
ビットがあります。出力が表示されない場合は、以下の手順に従ってください。
Constant タイムスタンプカウンターを使用しないホストの設定
TSC の周波数が一定でないシステムは、仮想マシンのクロックソースとして TSC を使用できないため、追加の設定が必要になります。電源管理機能は正確な時間管理を妨げるため、ゲスト仮想マシンが KVM で時間を正確に保持するには、無効にする必要があります。
重要
この手順は、AMD リビジョン F の CPU のみを対象としています。
CPU に
constant_tsc
ビットがない場合は、 で省電力機能をすべて無効にしてください。各システムには、時間を維持するために使用するいくつかのタイマーがあります。TSC はホストで安定していません。これは、cpufreqの変更、ディープ C ステート、またはより高速な TSC を使用したホストへの移行が原因である場合があります。ディープ C のスリープ状態は、TSC を停止する可能性があります。 ディープ C 状態を使用するカーネルを防ぐには、processor.max_cstate=1 をカーネルブートに追加します。この変更を永続化するには、/etc/default/grub
file で GRUB_CMDLINE_LINUX キーの値を変更します。たとえば、システムの起動ごとに緊急モードを有効にする場合は、以下のようにエントリーを編集します。
GRUB_CMDLINE_LINUX="emergency"
GRUB 2 ブートメニューに複数のパラメーターを追加する際と同様に、GRUB_CMDLINE_LINUX キーには複数のパラメーターを指定できることに注意してください。
cpufreq を無効にする (constant_tsc を使用しないホストでのみ必要) には、kernel-tools をインストールして、
cpupower.service
(systemctl enable cpupower.service) を有効にします。ゲスト仮想マシンが起動するたびにこのサービスを無効にする場合は、/etc/sysconfig/cpupower
の設定ファイルを変更して CPUPOWER_START_OPTS および CPUPOWER_STOP_OPTS を変更します。有効な制限は、/sys/devices/system/cpu/cpuid/cpufreq/scaling_available_governors
ファイルに記載されています。このパッケージの詳細、または電源管理およびガバナーの詳細は、『Red Hat Enterprise Linux 7 Power Management Guide』 を参照してください。
8.1. ホスト全体の時間同期
KVM ゲストの仮想ネットワークデバイスはハードウェアタイムスタンプをサポートしていません。つまり、NTP や PTP などのネットワークプロトコルを使用するゲストのクロックを数十マイクロ秒よりも高い精度で同期することは困難です。
ゲストの同期をより正確に行う必要がある場合は、NTP または PTP を使用してホストのクロックをハードウェアのタイムスタンプと同期させ、ゲストをホストに直接同期させることが推奨されます。Red Hat Enterprise Linux 7.5 以降では、マイクロ秒未満の精度でゲストをホストに同期できるようにする仮想 PTP ハードウェアクロック (PHC) が提供されます。
重要
PHC が適切に機能するようにするには、ホストとゲストの両方がオペレーティングシステム (OS) として RHEL 7.5 以降を使用している必要があります。
PHC デバイスを有効にするには、ゲスト OS で次の手順を実行します。
- 再起動後に読み込む
ptp_kvm
モジュールを設定します。# echo ptp_kvm > /etc/modules-load.d/ptp_kvm.conf
/dev/ptp0
クロックを chrony 設定のリファレンスとして追加します。# echo "refclock PHC /dev/ptp0 poll 2" >> /etc/chrony.conf
- chrony デーモンを再起動します。
# systemctl restart chronyd
- host-guest の時刻同期が正しく設定されていることを確認するには、ゲストで chronyc sources コマンドを使用します。この出力は、以下のようになります。
# chronyc sources 210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== #* PHC0 0 2 377 4 -6ns[ -6ns] +/- 726ns