Red Hat Training

A Red Hat training course is available for Red Hat Virtualization

6.15.3. KVM 虚拟机计时管理

虚拟化为保持虚拟机时间带来了各种挑战。使用时间戳计数器(TSC)作为时钟源的虚拟机可能会遇到计时问题,因为有些 CPU 没有恒定的时间戳计数器。在未准确计时的情况下运行虚拟机会严重影响某些网络应用程序,因为您的虚拟机运行速度将比实际时间快或慢。
KVM 通过为虚拟机提供半虚拟化时钟来解决此问题。KVM pvclock 为支持它的 KVM 客户机提供稳定的计时源。
目前,只有 Red Hat Enterprise Linux 5.4 或更高版本的虚拟机完全支持半虚拟化时钟。
虚拟机可能会因为时钟和计数器不准确而造成几个问题:
  • 时钟可能未与使会话无效并影响网络的实际时间保持同步。
  • 时钟较慢的虚拟机迁移可能会有问题。
这些问题存在于其他虚拟化平台上,应始终测试时间。
重要
网络时间协议(NTP)守护进程应在主机和虚拟机上运行。启用 ntpd 服务并将其添加到默认启动序列中:
  • 对于 Red Hat Enterprise Linux 6
    # service ntpd start
    # chkconfig ntpd on
  • For 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 位。如果未提供任何输出,请遵循以下说明:

配置主机时没有恒定时间戳计数器

没有恒定时间戳计数器的系统需要额外的配置。电源管理功能会干扰准确的时间保存,必须禁用虚拟机才能准确与 KVM 保持时间。

重要
这些指令仅适用于 AMD 修订 F CPU。
如果 CPU 缺少 constant_tsc 位,请禁用所有电源管理功能(BZ#513138)。每个系统都使用多个计时器来保留时间。主机上 TSC 不稳定,有时是由 cpufreq 更改、深度 C 状态或迁移到具有更快 TSC 的主机。C 深度睡眠状态可以停止 TSC。要防止使用深度 C 状态的内核,请将 "processor.max_cstate=1" 附加到主机上的 grub.conf 文件中的内核引导选项中:
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 配置文件并将 MIN_SPEEDMAX_SPEED 变量更改为可用最高频率,禁用 cpufreq (只在没有 constant_tsc的主机上需要)。有效限制可以在 /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies 文件中找到。

使用 engine-config 工具在主机不同步时接收警报。

您可以使用 engine-config 工具在主机不同步时配置警报。

主机上存在 2 个相关的时间偏移参数:EnableHostTimeDriftHostTimeDriftInSecEnableHostTimeDrift(默认值为 false)可以被启用来接收主机时间偏移的警报通知。HostTimeDriftInSec 参数用于设置警报开始前允许的最大偏移量。
每个主机每小时发送一次警报。

将半虚拟化时钟与 Red Hat Enterprise Linux 虚拟机搭配使用

对于某些 Red Hat Enterprise Linux 虚拟机,需要额外的内核参数。可以通过将参数附加到虚拟机的 /boot/grub/grub.conf 文件中的 /kernel 行的末尾来设置这些参数。

注意
可以使用 ktune 软件包自动执行内核参数配置过程
ktune 软件包提供交互式 Bourne shell 脚本 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,但额外的引导参数除外。 grub.conf.kvm 文件最终应当重命名为 grub.conf,并且应重新启动虚拟机。
下表列出了 Red Hat Enterprise Linux 的版本以及没有恒定时间戳计数器的系统上虚拟机所需的参数。
Red Hat Enterprise Linux : 5.4 AMD64/Intel 64 带有半虚拟化时钟
其他虚拟机内核参数 : 不需要额外的参数
Red Hat Enterprise Linux : 5.4 AMD64/Intel 64 没有半虚拟化时钟
其他虚拟机内核参数 : notsc lpj=n
Red Hat Enterprise Linux : 5.4 x86 带有半虚拟化时钟
其他虚拟机内核参数 : 不需要额外的参数
Red Hat Enterprise Linux : 5.4 x86 没有半虚拟化时钟
其他虚拟机内核参数 : clocksource=acpi_pm lpj=n
Red Hat Enterprise Linux : 5.3 AMD64/Intel 64
其他虚拟机内核参数 : notsc
Red Hat Enterprise Linux : 5.3 x86
其他虚拟机内核参数 : clocksource=acpi_pm
Red Hat Enterprise Linux : 4.8 AMD64/Intel 64
其他虚拟机内核参数 : notsc
Red Hat Enterprise Linux : 4.8 x86
其他虚拟机内核参数 : clock=pmtmr
Red Hat Enterprise Linux : 3.9 AMD64/Intel 64
其他虚拟机内核参数 : 不需要额外的参数
Red Hat Enterprise Linux : 3.9 x86
其他虚拟机内核参数 : 不需要额外的参数