Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第 8 章 KVM 客户机计时管理

虚拟化在客户端虚拟机中及时存在诸多挑战。
  • 中断无法始终同时交付到所有客户机虚拟机。这是因为虚拟机中的中断不是真正的中断。相反,它们会被主机注入到客户机虚拟机中。
  • 主机可以运行另一个虚拟客户机或不同的进程。因此,中断通常需要的精确时间可能并不总是可行。
没有准确的时间的客户机虚拟机可能遇到网络应用程序和进程的问题,因为会话有效、迁移和其他网络活动依赖于时间戳以保持正确。
KVM 通过提供带半虚拟化时钟(kvm-clock)的客户机虚拟机来避免这些问题。但是,在尝试可能受时间不准确(如虚拟机迁移)可能会受到影响的活动之前,仍然务必要测试时间。
重要
为避免上述问题,在主机和客户机虚拟机中应配置网络时间协议(NTP)。在使用红帽企业 Linux 6 及更早版本的虚拟客户机上,NTP 由 ntpd 服务实施。如需更多信息,请参阅 Red Hat Enterprise 6 部署指南
在使用 Red Hat Enterprise Linux 7 的系统上,NTP 时间同步服务可由 ntpdchronyd 服务提供。请注意,Chrony 在虚拟机上有一些优点。如需更多信息,请参阅《Red Hat Enterprise Linux 7 系统管理员指南》 中的使用 chrony 套件 配置 NTP 以及使用 ntpd 的配置 NTP 部分。

客户机虚拟机时间同步的机学

默认情况下,客户端将其时间与虚拟机监控程序同步,如下所示:

  • 当客户机系统引导时,客户机会从模拟的 Real Time Clock(RTC)读取时间。
  • 启动 NTP 协议时,它会自动同步客户机时钟。之后,在普通 guest 操作期间,NTP 在客户机执行时钟调整。
  • 当一个 guest 在暂停或恢复过程后恢复时,应由管理软件(如 virt-manager)发布将客户机时钟同步到指定值的命令。只有在客户机中安装 QEMU 客户机代理 并支持该功能时,此同步才可以正常工作。客户端时钟同步的值是主机时钟值。

恒定的时间戳计数器(TSC)

现代 Intel 和 AMD CPU 提供恒定的时间戳计数器(TSC)。当 CPU 内核本身更改频率时,恒定 TSC 的计数频率不同,例如遵守节能策略。需要具有恒定的 TSC 频率 CPU,以便使用 TSC 作为 KVM 客户机的时钟源。

如果存在 constant_tsc 标志,您的 CPU 有一个恒定的时间戳计数器。运行以下命令,检查您的 CPU 是否具有 constant_tsc 标志:
$ cat /proc/cpuinfo | grep constant_tsc
如果给出了任何输出,则您的 CPU 具有 constant_tsc 位。如果未指定输出,请遵循以下步骤。

在没有 Constant 时间戳计数器的情况下配置主机

没有恒定的 TSC 频率的系统无法使用 TSC 作为虚拟机的时钟源,需要额外的配置。电源管理功能会干扰准确的时间保留,必须禁用 guest 虚拟机才能准确使用 KVM 保持时间。

重要
这些指令仅适用于 AMD 修订 F CPU。
如果 CPU 缺少 constant_tsc 位,则禁用所有电源管理功能 。每个系统都使用多个计时器来保留时间。主机上 TSC 不稳定,有时是由 cpufreq 更改、深度 C 状态导致的,或者迁移到具有更快 TSC 的主机。C 深度睡眠状态可以停止 TSC。 为防止内核使用深度 C 状态,可将 processor.max_cstate=1 附加到内核启动中。要使这一更改持久,请在 /etc/default/grub文件中编辑 GRUB_CMDLINE_LINUX 键的值。例如,如果要为每个引导启用紧急模式,请按如下方式编辑该条目:
GRUB_CMDLINE_LINUX="emergency"
请注意,您可以为 GRUB_CMDLINE_LINUX 键指定多个参数,与在 GRUB 2 启动菜单中添加参数类似。
要禁用 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. Host-wide Time sync

KVM 客户端中的虚拟网络设备不支持硬件时间戳,这意味着难以同步使用 NTP 或 PTP 等网络协议(如 NTP 或 PTP)的客户机时钟,其准确性要高于微秒的十秒。
当需要更准确的客户端同步时,建议使用 NTP 或 PTP 与硬件时间戳同步主机时钟,并将客户机直接同步到主机。Red Hat Enterprise Linux 7.5 及更新的版本提供虚拟 PTP 硬件时钟(PHC),它允许客户机与主机同步,并可以通过子微秒的准确性进行同步。
重要
请注意,为了让 PHC 正常工作,主机和客户机都需要使用 RHEL 7.5 或更高版本作为操作系统(OS)。
要启用 PHC 设备,在客户端操作系统中执行以下操作:
  1. ptp_kvm 模块设置为在重启后载入。
    # echo ptp_kvm > /etc/modules-load.d/ptp_kvm.conf
  2. /dev/ptp0 时钟添加为 chrony 配置的引用:
    # echo "refclock PHC /dev/ptp0 poll 2" >> /etc/chrony.conf
  3. 重启 chrony 守护进程:
    # systemctl restart chronyd
  4. 要验证 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