解决 问题出在那台机器上的 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
我的建议是仅与外部时间服务器同步并禁用任何集成时间同步
希望这有帮助。
答案4
在虚拟机中,时间随处漂移。您确实需要确保 NTP 服务器未在任何“服务器”语句中使用本地时钟,因为本地时钟太不可靠了。我为帮助解决这个问题所做的一件事是为虚拟机上的服务器设置“maxpoll”属性。这会强制 ntp 服务比配置的默认值更频繁地检查其上游时钟,这有助于保持其真实性。
server [timeserver] maxpoll 12
尝试一些设置来查看需要将时间调低到多低才能保持时间相对可靠。 12 对我来说有效,但每个环境都不同。