Red Hat Training

A Red Hat training course is available for Red Hat Virtualization

6.16.3. KVM 仮想マシンの時刻管理

仮想化には、仮想マシンの時刻の維持に関してさまざまな課題があります。一部の CPU には一定のタイムスタンプカウンターがないため、TSC (タイムスタンプカウンター)をクロックソースとして使用する仮想マシンでは、タイミングの問題が発生することがあります。正確な時刻管理なしで実行される仮想マシンは、実際の時刻よりも早く、または遅く実行されるため、ネットワーク化されたアプリケーションに深刻な影響を与える可能性があります。

KVM は、準仮想化クロックを仮想マシンに提供することで、この問題を回避します。KVM pvclock は、これに対応する KVM ゲストに対して安定したタイミングソースを提供します。

現在、準仮想化クロックを完全にサポートしているのは、Red Hat Enterprise Linux 5.4 以降の仮想マシンのみです。

仮想マシンには、不正確なクロックとカウンターによりさまざまな問題が生じる可能性があります。

  • クロックが実際の時刻と同期できなくなり、セッションが無効になり、ネットワークに影響が及ぶ可能性があります。
  • クロックが遅い仮想マシンには移行の問題が発生する可能性があります。

これらの問題は、他の仮想化プラットフォームに存在しており、タイミングは常にテストする必要があります。

重要

Network Time Protocol (NTP)デーモンがホストおよび仮想マシンで実行されている必要があります。ntpd サービスを有効にし、デフォルトの起動シーケンスに追加します。

  • Red Hat Enterprise Linux 6 の場合
# service ntpd start
# chkconfig ntpd on
  • Red Hat Enterprise Linux 7 の場合
# systemctl start ntpd.service
# systemctl enable ntpd.service

ntpd サービスを使用すると、すべてのケースでクロックスキューの影響を最小限に抑えられるはずです。

使用しようとしている NTP サーバーは稼働しており、ホストと仮想マシンからアクセスできる必要があります。

CPU に一定のタイムスタンプカウンターがあるかどうかの判断

constant_tsc フラグが存在する場合、CPU には一定のタイムスタンプカウンターがあります。CPU に constant_tsc フラグがあるかどうかを確認するには、次のコマンドを実行します。

$ cat /proc/cpuinfo | grep constant_tsc

いずれかの出力が得られると、CPU には constant_tsc ビットがあります。出力が表示されない場合は、以下の手順に従ってください。

Constant タイムスタンプカウンターを使用しないホストの設定

一定のタイムスタンプカウンターのないシステムには、追加の設定が必要です。電源管理機能は正確な時間管理を妨げるため、仮想マシンが KVM で時間を正確に保持するには、無効にする必要があります。

重要

この手順は、AMD リビジョン F の CPU のみを対象としています。

CPU に constant_tsc ビットがない場合は、省電力機能 (BZ#513138) をすべて無効にしてください。各システムには、時間を維持するために使用するいくつかのタイマーがあります。TSC はホストで安定していません。これは、cpufreqの変更、ディープ C ステート、またはより高速な TSC を使用したホストへの移行が原因である場合があります。ディープ C のスリープ状態は、TSC を停止する可能性があります。カーネルがディープ C 状態を使用するのを防ぐには、ホストの grub.conf ファイルのカーネル起動オプションに processor.max_cstate=1 を追加します。

term Red Hat Enterprise Linux Server (2.6.18-159.el5)
        root (hd0,0)
	kernel /vmlinuz-2.6.18-159.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet processor.max_cstate=1

/etc/sysconfig/cpuspeed 設定ファイルを編集し、cpufreq を無効にし(constant_tscのないホストでのみ必要)、MIN_SPEED 変数および MAX_SPEED 変数を利用可能な最大周期に変更します。有効な上限は、/sys/devices/system/cpu/cpu/cpufreq/scaling_available_frequencies ファイルにあります。

engine-config ツールを使用した、ホストが同期から外れてドリフトした時のアラートの受信

engine-config ツールを使用して、ホストが同期から外れてドリフトした時にアラートを設定できます。

ホストの時刻ドリフトに関連するパラメーターは EnableHostTimeDriftHostTimeDriftInSec の 2 つです。デフォルト値が false のEnableHostTimeDrift を有効にすると、ホストの時刻ドリフトに関するアラート通知を受け取ることができます。HostTimeDriftInSec パラメーターを使用して、アラートの送信が開始されるまでの最大許容ドリフトを設定します。

アラートはホストごとに 1 時間ごとに 1 回送信されます。

Red Hat Enterprise Linux 仮想マシンでの準仮想化クロックの使用

特定の Red Hat Enterprise Linux 仮想マシンでは、追加のカーネルパラメーターが必要です。このパラメーターは、仮想マシンの /boot/grub/grub.conf ファイルの /kernel 行の末尾に追加することで設定できます。

注記

ktune パッケージを使用して、カーネルパラメーターを設定するプロセスを自動化できます。

ktune パッケージは、インタラクティブな Bourne シェルスクリプト fix_clock_drift.sh を提供します。このスクリプトをスーパーユーザーとして実行すると、さまざまなシステムパラメーターを検査し、スクリプトを実行している仮想マシンが負荷時にクロックドリフトの影響を受けやすいかどうかを判断します。受けやすいと判断された場合は、/boot/grub/ ディレクトリーに新しい grub.conf.kvm ファイルを作成します。このファイルには、追加のカーネルパラメーターを含むカーネルブート行が含まれます。これにより、カーネルは KVM 仮想マシンの大きなクロックドリフトに対応したり、ドリフトの発生を防いだりできます。スーパーユーザーとして fix_clock_drift.sh を実行し、スクリプトが grub.conf.kvm ファイルを作成したら、システム管理者は仮想マシンの現在の grub.conf ファイルを手動でバックアップし、新しい grub.conf.kvm ファイルを手動で検査し、それが追加のブート行パラメーター以外は grub.conf と同じであることを確認し、最後にgrub.conf.kvm ファイルの名前を grub.conf に変更し、仮想マシンを再起動する必要があります。

以下の表は、Red Hat Enterprise Linux のバージョンと、一定のタイムスタンプカウンターを持たないシステム上の仮想マシンに必要なパラメーターの一覧です。

Red Hat Enterprise Linux追加の仮想マシンカーネルパラメーター

5.4 AMD64/Intel 64(準仮想化クロックあり)

追加のパラメーターは必要ありません

5.4 AMD64/Intel 64(準仮想化クロックなし)

notsc lpj=n

5.4 x86(準仮想化クロックあり)

追加のパラメーターは必要ありません

5.4 x86(準仮想化クロックなし)

clocksource=acpi_pm lpj=n

5.3 AMD64/Intel 64

notsc

5.3 x86

clocksource=acpi_pm

4.8 AMD64/Intel 64

notsc

4.8 x86

clock=pmtmr

3.9 AMD64/Intel 64

追加のパラメーターは必要ありません

3.9 x86

追加のパラメーターは必要ありません