第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『システム管理者のガイド』の 「chrony スイートを使用した設定」および「ntpd を使用した NTP 設定」を参照してください
ゲスト仮想マシンの同期のしくみ

デフォルトで、ゲストは以下のようにハイパーバイザーと時間を同期します。

  • ゲストシステムが起動すると、ゲストはエミュレートされた RTC (リアルタイムクロック) から時間を読み取ります。
  • NTP プロトコルが開始されていると、ゲストのクロックは自動的に同期されます。それ以降、ゲストが通常の動作をしている間、NTP はゲストのクロック調整を実施します。
  • ゲストが一時停止または復元プロセスの後に再起動する場合は、管理ソフトウェア (virt-manager など) によって、ゲストのクロックを特定の値に同期させるコマンドが実行される必要があります。この同期プロセスは、QEMU ゲストエージェント がゲストにインストールされ、その機能をサポートしている場合に限り動作します。通常は、ゲストのクロックをホストのクロック値に同期します。

一定のタイムスタンプカウンター (TSC: Time Stamp Counter)

最新の Intel と AMD の CPU は、不変タイムスタンプカウンター (TSC) を提供します。不変 TSC のカウント頻度は、たとえば CPU コア自体が節電ポリシーに従うために周波数を変更しても変わりません。不変 TSC の周波数を持つ CPU は、KVM ゲストのクロックソースとして TSC を使用するために必要です。

constant_tsc フラグが付いている場合、CPU に Constant TSC があります。CPU に constant_tsc フラグが付いているかどうかを確認するには、以下のコマンドを実行します。
$ cat /proc/cpuinfo | grep constant_tsc
いずれかの出力が表示される場合は、CPU には constant_tsc ビットがあることになります。出力がない場合は、以下の説明にしたがいます。
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 ファイルの GRUB_CMDLINE_LINUX キーの値を編集します。たとえば、毎回の起動時に緊急モード (emergency mode) を有効にするには、以下のようにエントリーを編集します。
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 電力管理ガイド』を参照してください。

8.1. ホスト全体の時刻同期

KVM ゲストの仮想ネットワークデバイスはハードウェアタイムスタンプをサポートしていません。そのため、NTP や PTP などのネットワークプロトコルを使用するゲストのクロックを数十マイクロ秒よりも正確に同期することが難しくなります。
ゲストにより正確な同期が必要な場合は、NTP や PTP を使用するホストのクロックをハードウェアタイムスタンプで同期し、直接ゲストをホストに同期することが推奨されます。Red Hat Enterprise Linux 7.5 以上には、1 ミリ秒未満の精度でゲストをホストに同期できる仮想 PTP ハードウェアクロック (PHC) が提供されます。
PHCデバイスを有効にするには、次の手順を実行します。
  1. 再起動後にロードする ptp_kvm モジュールを設定します。
    # echo ptp_kvm > /etc/modules-load.d/ptp_kvm.conf
  2. chrony 設定への参照として /dev/ptp0 クロックを追加します。
    # echo "refclock PHC /dev/ptp0 poll 2" >> /etc/chrony.conf
  3. chrony デーモンを再起動します。
    # systemctl restart chronyd
  4. ホストとゲスト時間の同期が適切に設定されたことを確認するには、ゲスト上で 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