即使使用 NTP,Hyper-V Machine 的时间也会发生偏移

即使使用 NTP,Hyper-V Machine 的时间也会发生偏移

解决 问题出在那台机器上的 Hyper-V。我删除了 Hyper-V,安装了 VMware Server,运行了同一个 VM。时间同步问题消失了(一天后相差不到 100 毫秒)。


我的设置如下:

HYV1 - HyperV machine (non domain) - sync irrelevant
AD1  - VM AD server on HYV1, sync'd to time.nist.gov. HyperV time sync off.
S1   - Physical machine, sync'd to domain. 
S2   - Physical machine running HyperV, sync'd to domain.
V1   - Linux VM machine on S2, sync'd to AD1. No HyperV integration.

AD1 和 S1 具有精细同步 - 条形图显示差异小于 100 毫秒。

S2 疯狂漂移。以下是与 AD1 对比的图表:

18:33:22 d:+00.0010138s o:+05.4101899s 
18:33:24 d:+00.0010138s o:+05.4319765s 
18:33:26 d:+00.0000000s o:+05.4788429s 
18:33:28 d:+00.0000000s o:+05.6089942s 
18:33:30 d:+00.0010138s o:+05.7240269s 
18:33:32 d:+00.0000000s o:+06.0421911s 
18:33:34 d:+00.0081104s o:+06.5613708s 
18:33:37 d:+00.0000000s o:+06.9096594s 
18:33:39 d:+00.0000000s o:+06.8867838s 
18:33:41 d:+00.0010127s o:+06.8936401s 

在 20 秒内,它漂移了超过一秒。如果我手动将其重置为 1 秒以内,几分钟内它就会重新漂移约 2 秒。一夜之间它从约 2 秒变成了约 5 秒。S2 内的 Linux VM 与 AD1 完美同步。

配置如下:

C:\Users\mgg>w32tm /dumpreg /subkey:Parameters

Value Name                 Value Type          Value Data
------------------------------------------------------------

ServiceDll                 REG_EXPAND_SZ       %systemroot%\system32\w32time.dll
ServiceMain                REG_SZ              SvchostEntry_W32Time
ServiceDllUnloadOnStop     REG_DWORD           1
Type                       REG_SZ              NT5DS
NtpServer                  REG_SZ              ad01.mydomain ad02.mydomain


C:\Users\mgg>w32tm /dumpreg /subkey:Config

Value Name                Value Type          Value Data
-----------------------------------------------------------

FrequencyCorrectRate      REG_DWORD           4
PollAdjustFactor          REG_DWORD           5
LargePhaseOffset          REG_DWORD           50000000
SpikeWatchPeriod          REG_DWORD           900
LocalClockDispersion      REG_DWORD           9
HoldPeriod                REG_DWORD           5
PhaseCorrectRate          REG_DWORD           1
UpdateInterval            REG_DWORD           30000
EventLogFlags             REG_DWORD           2
AnnounceFlags             REG_DWORD           5
TimeJumpAuditOffset       REG_DWORD           28800
MinPollInterval           REG_DWORD           2
MaxPollInterval           REG_DWORD           8
MaxNegPhaseCorrection     REG_DWORD           -1
MaxPosPhaseCorrection     REG_DWORD           -1
MaxAllowedPhaseOffset     REG_DWORD           300

我查看了事件日志,除了有关同步的警告(在同步不同步之后)之外,没有其他警告。

我该如何排除故障?这是唯一一台出现此问题的机器。所有其他机器(物理和虚拟)都运行良好。

编辑:澄清一下:虚拟机 (AD1) 已关闭集成并同步到 time.nist.gov。AD1 没问题。物理机 S1 无法同步到 AD1,并且到处漂移。所有其他物理服务器都能够正常同步到 AD1。

更新 因此,这似乎是运行虚拟机的问题。关闭虚拟机后,时钟会慢慢走慢。打开后,它立即开始丢失秒数。我让虚拟机只使用一半的资源,这似乎暂时缓解了这个问题。谢谢!

答案1

根据您的描述,这听起来像是 RTC 确实存在硬件问题(http://en.wikipedia.org/wiki/Real-time_clock) 位于服务器S2的主板上。

Hyper-V 客户机最初从主机 (HYV1) 获取时钟,但由于您已禁用 Hyper-V 时间同步,因此它会从 NIST 获取所有进一步的时钟更新(运行良好)。您的 Linux VM 未与 Hyper-V 集成,因此它从域获取时间,这也运行良好。您的其他物理机器运行良好,只是一台物理服务器每 20 秒会有 1 秒的漂移(这是一个疯狂的漂移量)。时间漂移的速度比网络时间同步将时钟重置为正确时间的速度要快得多(如果我没记错的话,每 8 小时进行一次)。

如果您想排除 Hyper-V 是 S2 上错误的原因,请创建“无 Hypervisor”启动项,重新启动而不使用 Hyper-V,然后查看时间漂移是否仍然存在。说明如下:http://blogs.msdn.com/virtual_pc_guy/archive/2008/04/14/creating-a-no-hypervisor-boot-entry.aspx

-肖恩

答案2

问题在于各种时钟源(tsc、jiffies、acpi_pm、cmos_trc)的虚拟实现。我发​​现使用 HyperV 修复此问题的最佳方法是关闭离开HyperV 为您的客户机提供了时钟同步,然后使用 adjtimex 调整时间。在 Ubuntu 客户机操作系统上执行以下操作...

# rm /var/log/clocks.log
# /etc/init.d/ntp-server stop
# ntpdate ntp.ubuntu.com
# hwclock -u --systohc
# adjtimex -l -u -h ntp.ubuntu.com

对两个问题都回答“否”

# while [ /bin/true ] ; do yes | adjtimex -l -u -h ntp.ubuntu.com ; sleep 60 ; done

让其运行几个小时以进行校准,按 Ctrl-C 退出。

# adjtimex -r -a -u -h ntp.ubuntu.com

这将对你的时钟进行最小二乘分析,并找到正确的调整

# ntpdate ntp.ubuntu.com
# hwclock -u --systohc
# /etc/init.d/ntp-server start

这将重新同步您机器上的时间,然后 ntp 应该能够保持同步,因为它不会再偏移太多。

答案3

这似乎是虚拟机中一个非常常见的问题。请参阅以下网站:

http://www.vmwareinfo.com/2008/04/enabling-ntp-on-esx-servers.html

http://social.technet.microsoft.com/Forums/en-US/winserverhyperv/thread/6fff3eef-1b5b-4059-8618-22ab3f5c293c

我的建议是仅与外部时间服务器同步并禁用任何集成时间同步

希望这有帮助。

答案4

在虚拟机中,时间随处漂移。您确实需要确保 NTP 服务器未在任何“服务器”语句中使用本地时钟,因为本地时钟太不可靠了。我为帮助解决这个问题所做的一件事是为虚拟机上的服务器设置“maxpoll”属性。这会强制 ntp 服务比配置的默认值更频繁地检查其上游时钟,这有助于保持其真实性。

server [timeserver] maxpoll 12

尝试一些设置来查看需要将时间调低到多低才能保持时间相对可靠。 12 对我来说有效,但每个环境都不同。

相关内容