我开发了一个能够追踪业务事件的Windows服务,它使用Windows系统时钟来为事件生成时间戳。然而,在处理器工作强度大的情况下,系统时钟可能会产生相当大的偏差,例如每分钟丢失几秒钟的情况。我们的服务器使用Windows时间服务与域控制器保持同步,该服务在幕后使用NTP进行同步,但同步频率受到域策略的控制,即使每分钟同步一次仍然会存在显着的时钟漂移。除了使用硬件时钟外,是否有其他技术可以使时钟更加稳定?
我开发了一个能够追踪业务事件的Windows服务,它使用Windows系统时钟来为事件生成时间戳。然而,在处理器工作强度大的情况下,系统时钟可能会产生相当大的偏差,例如每分钟丢失几秒钟的情况。我们的服务器使用Windows时间服务与域控制器保持同步,该服务在幕后使用NTP进行同步,但同步频率受到域策略的控制,即使每分钟同步一次仍然会存在显着的时钟漂移。除了使用硬件时钟外,是否有其他技术可以使时钟更加稳定?
wait()
函数(以及os::sleep()
函数)在Windows上的实现中存在一个bug,导致这种行为。它总是在等待之前将计时器的分辨率设置为1毫秒,以保证准确性(无论睡眠时间多长),并在完成后立即恢复,除非其他线程仍在睡眠。这个设置/重置操作会混淆Windows时钟,因为Windows时钟期望Windows时间量子保持相对恒定。除了更频繁地重新同步时钟外,我认为你没有太多可以做的事情,除非换一个新的主板,因为你的时钟信号似乎不在正确的频率上。
http://www.codinghorror.com/blog/2007/01/keeping-time-on-the-pc.html
PC的时钟通常应该在每天内精确到几秒钟。如果您的时间出现了大量的漂移,比如每天几分钟的误差,那么首先要检查的是您的交流电源。我亲自观察过一些系统,其中一个UPS插在另一个UPS上(这是不允许的),导致每天增加几分钟的误差。将不必要的UPS从链路中移除即可解决时间问题。虽然我不是硬件工程师,但我猜测主板上的实时时钟芯片可能使用了电源中的某个定时信号。
-XX:+ForceTimeHighResolution
(在NTP支持页面上找到)。-XX:+ForceTimeHighResolution
参数启动Sun的Java虚拟机。看起来你的业务很大:
拿一台旧笔记本电脑或其他不太好用的设备,但似乎有一个相对可靠的时钟,并将其称为时间管理器。时间管理器的唯一工作是每隔(比如)2分钟向服务器发送一条告知时间的消息。服务器在记录时间戳时,不使用Windows时钟,而是记录时间管理器上次信号的时间加上自信号以来经过的时间。每周检查一到两次时间管理器的时钟是否准确即可。
增加重新同步的频率。 如果同步是与您自己的主服务器在您自己的网络上进行的,则没有理由不每分钟同步一次。
更频繁地进行同步。查看{{link1:W32Time服务的注册表项}},特别关注“Period”。“SpecialSkew”听起来会有所帮助。
时钟漂移可能是温度的后果;也许你可以尝试让温度更加稳定 - 也许使用更好的冷却方法?但你永远无法完全消除漂移。
在分布式系统中,我们使用外部时钟(GPS接收器等...)和统计方法将CPU时间与绝对时间相关联来同步事件。