w32tm.exe
使用的选项stripchart
来判断两个主机的时间差异(在非常小的误差范围内)是否可行?请注意w32tm.exe
的stripchart
功能与服务本身使用的算法是分开的Windows Time
。
如果没有的话,还有哪些替代方法?
谢谢,
马特
答案1
对您的第一个问题的回答是“是的,w32tm.exe(Windows 时间)能够在非常小的误差范围内(相对而言)测量两个网络主机的时间差异。”
第二个问题的答案是“是的,有更好的方法来测量两个主机之间的时间差异。微软说得对这里. 他们会告诉你美国国家标准与技术研究院,其中列出了一大堆可能比 w32tm.exe 更好的其他软件(和硬件)。我确信其中很多都是如此,因为微软显然不支持 w32tm.exe 作为超高精度工具。
Windows Time(和 w32tm.exe)符合 RFC 1305(NTPv3),其中包括补偿网络延迟。来源和来源。补偿网络延迟是网络时间协议的一个最基本功能。(请参见 Marzullo 算法,NTPv3 就是使用该算法。)
您的问题让我感到沮丧的是,高精度对您来说如此重要,但您却没有给出任何提示,说明您需要什么样的精确度。1 秒?1 毫秒?1 纳秒?通用计算机的时钟分辨率与处理器接收的时钟中断频率有关,该频率通常由以 32.768 KHz(2 的幂)运行的晶体振荡器控制,但该晶体振荡器对温度、电压等敏感。典型 Windows 机器上的 HAL 默认将实时时钟配置为每 15.6 毫秒触发一次,即每秒约 64 次。但是,您仍然可以将 RTC 调低至 1 毫秒,并且还可以通过软件将 15.6 毫秒的时间片细分为更小的片段,以用于高性能应用程序。无论如何,NTP 时间戳本身是一个 64 位无符号定点数,因此其精度的理论极限约为 232 皮秒,但 Windows Time 实现甚至无法达到这个精度。 Windows Time 显示的 NTP 精度为 -6,并且不支持某些最新和最好的 NTP 算法,因此实际上它可能永远无法可靠地产生比一个硬件时钟滴答或正负 16 毫秒更严格的精度。
通用操作系统并不具备出色的时钟,尤其是当计时算法在用户模式下实现时,执行线程会不断被抢占。高精度时钟价格昂贵。
上图是系统上的时钟中断频率。请注意,即使是时钟中断(32 位 Windows 上的 IRQL 28 和 64 位 Windows 上的 IRQL 13)也可能被更高级别的中断(例如处理器间中断)抢占,并且可能导致精确的时间计算延迟,即使延迟只有一纳秒。
回到 NTP。
w32tm /stripchart /computer:10.0.1.8
是测试一台 Windows 机器与另一台 Windows 机器之间的时间差的一种非常有效的方法。它确实考虑了网络延迟,正如我们上面讨论的那样,它符合 NTPv3 标准。但不要相信我的话。您可以在 Wireshark 跟踪中亲自查看事务(w32tm.exe 发送到 Windows NTP 服务器的客户端数据包):
微软没有保证使用 Windows Time 实现亚秒级精度,因为他们不需要支持这一点,他们的任何产品都可以工作。但是,这并不意味着 w32tm.exe 仍然无法实现亚秒级精度。
如果你确实需要比这更准确的时间,您可以使用另一种使用略有不同的算法的 NTP 实现来获得额外的 1 毫秒或 10 的精度。但如果您真的需要更准确的时间,我个人根本不建议使用 NTP。我会将铯钟直接连接到您的机器上,而不是使用抢占式操作系统。
编辑 5/2/2017:以上信息已过时,不一定适用于 Windows Server 2016 及更高版本。Microsoft 在后续操作系统中对 Windows 时间的准确性进行了一些重大改进。
答案2
我无法找到是否考虑w32tm.exe
了stripchart
(或如何考虑了)延迟和抖动。相反,我找到了ntp 邮件列表上的一个主题那指示用户另外三种可以测量延迟和抖动的解决方案:
- satsignal 的 NTP 监视器(由于轮询时间不少于 60 秒,因此被取消资格)
- satsignal 的 NTP 绘图仪(绘制来自 ntpd 的历史 loopstats 文件)
- meinberg 的 NTP 时间服务器监控器(需要本地 ntpd 服务)