你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 中 Windows VM 的时间同步

适用于: ✔️ Windows VM ✔️ 灵活规模集 ✔️ 统一规模集

时间同步对于安全性和事件关联非常重要。 有时候,它用于分布式事务实现。 多个计算机系统之间的时间准确性通过同步来实现。 同步可能受多种因素影响,包括重启以及时间源和提取时间的计算机之间的网络流量。

概述

计算机时钟的准确性根据计算机时钟与协调世界时 (UTC) 时间标准的接近程度来测量。 UTC 通过精确原子钟的跨国样本来定义,此类原子钟 300 年的偏差只有 1 秒。 但是,直接读取 UTC 需要专用硬件。 而时间服务器与 UTC 同步,可以从其他计算机访问,因此具备可伸缩性和可靠性。 每台计算机都运行时间同步服务,该服务知道要使用什么时间服务器,并定期检查计算机时钟是否需要校正以及在需要时调整时间。

Azure 主机与内部 Microsoft 时间服务器同步,这些服务器从 Microsoft 拥有的带 GPS 天线的 Stratum 1 设备获取时间。 Azure 中的虚拟机可以依赖其主机将准确时间(主机时间)传递给 VM,也可以直接从时间服务器中获取时间,或结合使用这两种方式

虚拟机与主机的交互也可能影响时钟。 在内存保留维护期间,VM 会暂停最多 30 秒的时间。 例如,在维护开始之前,VM 时钟显示上午 10:00:00,这种状态会持续 28 秒。 在 VM 恢复后,VM 上的时钟仍显示上午 10:00:00,这样就造成 28 秒的偏差。 为了校正这种情况,VMICTimeSync 服务会监视主机上发生的情况,并提示在 VM 上进行更改以进行补偿。

VMICTimeSync 服务以采样或同步模式运行,只会影响时钟前进。 在需要运行 W32time 的采样模式下,VMICTimeSync 服务每 5 秒轮询主机一次并向 W32time 提供时间样本。 W32time 服务大约每隔 30 秒就会抽取一次最新的时间样本并使用它来影响来宾的时钟。 如果来宾已被恢复,或者来宾的时钟比主机时钟慢 5 秒以上,则将激活同步模式。 在 W32time 服务正常运行的情况下,后一种情况应永远不会发生。

如果没有进行时间同步,则 VM 上的时钟会累积错误。 只有一个 VM 时,效果可能不明显,除非工作负荷要求极为准确的计时。 但在大多数情况下,我们有多个互连的 VM,这些 VM 使用时间来跟踪事务,因此需确保整个部署的时间一致。 当 VM 之间的时间不同时,可能会造成以下影响:

  • 身份验证会失败。 安全协议(如 Kerberos)或依赖于证书的技术要求跨系统确保时间一致性。
  • 如果日志(或其他数据)在时间上不一致,则很难弄清楚系统中发生了什么。 同一事件看起来就像是在不同的时间发生,难以进行关联。
  • 如果时钟存在偏差,则可能造成计费不正确。

可以将 Windows Server 2016 用作来宾操作系统,这样可确保使用时间同步方面的最新改进,获得 Windows 部署的最佳结果。

配置选项

可以通过三个选项来配置托管在 Azure 中的 Windows VM 的时间同步:

使用默认配置

默认情况下,Windows OS VM 映像配置为允许 w32time 与两个源同步:

  • NtpClient 提供程序,从 time.windows.com 获取信息。
  • VMICTimeSync 服务,用于将主机时间传递给 VM,并在 VM 因维护而暂停后进行纠正。 Azure 主机使用 Microsoft 拥有的第 1 层设备来确保时间的准确性。

w32time 将按以下优先级顺序选择时间提供程序:层级、根延迟、根分散、时间偏移。 在大多数情况下,Azure VM 上的 w32time 会首选主机时间,因为它会进行评估以比较两个时间源。

对于域加入的计算机,域本身会建立时间同步层次结构,但是林根仍然需要从某个地方获取时间,并且以下注意事项仍然适用。

仅主机

由于 time.windows.com 是公共 NTP 服务器,与其同步时间需要通过 Internet 发送流量,而数据包的延迟各不相同,因此可能会对时间同步的质量造成负面影响。通过切换到“仅主机”同步来删除 time.windows.com 有时候可以改善时间同步结果。

如果在使用默认配置时遇到时间同步问题,则可切换到“仅主机”时间同步。 尝试“仅主机”同步,看是否会改进 VM 上的时间同步。

外部时间服务器

如果有特定的时间同步要求,则可使用另一选项,即,使用外部时间服务器。 外部时间服务器可以提供特定的时间,这可以用于测试方案,确保时间在非 Microsoft 数据中心托管的计算机中的一致性,或者以特殊方式来处理闰秒问题。

可以将外部服务器与 VMICTimeSync 服务和 VMICTimeProvider 组合使用,提供类似于默认配置的结果。

检查配置

检查是否已将 NtpClient 时间提供程序配置为使用显式 NTP 服务器 (NTP) 或域时间同步 (NT5DS)。

w32tm /dumpreg /subkey:Parameters | findstr /i "type"

如果 VM 使用 NTP,则会看到以下输出:

Value Name                 Value Type          Value Data
Type                       REG_SZ              NTP

若要查看 NtpClient 时间提供程序正在使用什么时间服务器,请在权限提升的命令提示符处键入以下命令:

w32tm /dumpreg /subkey:Parameters | findstr /i "ntpserver"

如果 VM 使用的是默认值,则输出将如下所示:

NtpServer                  REG_SZ              time.windows.com,0x8

若要查看当前正使用什么时间提供程序,请键入以下命令:

w32tm /query /source

下面是可能会看到的输出及其含义:

  • time.windows.com - 在默认配置中,w32time 会从 time.windows.com 获取时间。 时间同步质量取决于与其的 Internet 连接,并受数据包延迟的影响。 这是你将在物理计算机上获得的常见输出。
  • VM IC 时间同步提供程序 - VM 与主机同步时间。 这是你将在 Azure 中运行的虚拟机上获得的常见输出。
  • 域服务器 - 当前计算机位于域中,域定义时间同步层次结构
  • 某个其他的服务器 - w32time 已显式配置为从该服务器获取时间。 时间同步质量取决于该时间服务器质量。
  • 本地 CMOS 时钟 - 时钟未同步。 如果 w32time 在重新启动后没有足够的时间启动,或者所有配置的时间源都不可用时,则可以获得此输出。

选择加入仅限主机的时间同步

Azure 不断致力于改善主机上的时间同步,并且可以保证所有时间同步基础结构都在 Microsoft 拥有的数据中心中并置。 如果默认设置使用 time.windows.com 作为主要时间源并且有时间同步问题,则可以使用以下命令选择加入仅限主机的时间同步。

将 VMIC 提供程序标记为已启用。

reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\TimeProviders\VMICTimeProvider /v Enabled /t REG_DWORD /d 1 /f

将 NTPClient 提供程序标记为“已禁用”。

reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\TimeProviders\NtpClient /v Enabled /t REG_DWORD /d 0 /f

重启 w32time 服务。

net stop w32time && net start w32time

Windows Server 2012 和 R2 VM

Windows Server 2012 和 Windows Server 2012 R2 具有不同的时间同步默认设置。默认情况下,w32time 的配置方式更倾向于服务的低开销而非精确的时间。

如果要将 Windows Server 2012 和 2012 R2 部署移动到使用更倾向于精确时间的较新默认设置,则可以应用以下设置。

更新 w32time 轮询并更新间隔,以匹配 Windows Server 2016 设置。

reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Config /v MinPollInterval /t REG_DWORD /d 6 /f
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Config /v MaxPollInterval /t REG_DWORD /d 10 /f
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Config /v UpdateInterval /t REG_DWORD /d 100 /f
w32tm /config /update

为了让 w32time 能够使用新的轮询时间间隔,需将 NtpServers 标记为使用它们。 如果服务器使用 0x1 位标记掩码进行注释,则会替代此机制,并且 w32time 将改用 SpecialPollInterval。 确保指定的 NTP 服务器使用 0x8 标志或根本不使用标志:

检查 NTP 服务器正在使用的标志。

w32tm /dumpreg /subkey:Parameters | findstr /i "ntpserver"

后续步骤

下面是有关时间同步的更多详细信息的链接: