强制 ntpd 以较小的步骤进行更改

强制 ntpd 以较小的步骤进行更改

NTP 文档指出:

在一般情况下,ntpd 会以小步调整时钟,以使时间尺度保持连续,不会出现不连续的情况 -http://doc.ntp.org/4.1.0/ntpd.htm

然而,这根本不是我在实践中注意到的。如果我手动将系统时间向前或向后更改 5 或 10 秒,然后启动ntpd,我会注意到它会一次性调整时钟。

例如,使用此代码:

#!/usr/bin/env python
import time
last = time.time()
while True:
    time.sleep(1)
    print time.time() - last
    last = time.time()

当我第一次改变时间时,我会注意到类似的事情:

1.00194311142
8.29711604118
1.0010509491

然后当我启动 NTPd 时,我会看到类似这样的内容:

1.00194311142
-8.117301941
1.0010509491

有什么方法可以强制ntpd以较小的步骤进行调整?

答案1

在启动守护进程时传递ntpd -x将使变化保持很小:时钟不会步进。当然,设置摆动仅意味着如果您的时钟与正确时间相差甚远,则可能需要一段时间才能纠正较大的间隙。引用几段来自手册页

在一般情况下,ntpd 会以小步长调整时钟,以便时间尺度有效连续,不会出现不连续的情况。在极端网络拥塞的情况下,往返延迟抖动可能会超过三秒,而同步距离(等于往返延迟的一半加上误差预算项)可能会变得非常大。ntpd 算法会丢弃超过 128 毫秒的样本偏移,除非没有小于 128 毫秒的样本偏移的间隔超过 900 秒。此后的第一个样本,无论偏移量是多少,都会将时钟调整到指示的时间。在实践中,这会将时钟步进错误时的误报率降低到几乎为零的低发生率。

由于您将时钟调整了 10 秒,因此您肯定超出了 NTP 期望看到的范围,因此出现了步进。

由于这种行为,一旦设置了时钟,即使在网络路径拥塞和抖动的极端情况下,它也很少会偏离超过 128 毫秒。有时,特别是在首次启动 ntpd 时,误差可能会超过 128 毫秒。如果本地时钟时间相对于服务器超过 128 秒,这有时可能会导致时钟向后设置。在某些应用程序中,这种行为可能是不可接受的。如果命令行中包含 -x 选项,则时钟将永远不会步进,并且只会使用斜率校正。

在决定使用 -x 选项之前,应仔细研究这些问题。由于 NTP 协议和算法设计所基于的正确性原则,可能的最大斜率被限制为 500 百万分率 (PPM)。因此,本地时钟可能需要很长时间才能收敛到可接受的偏移量,时钟超出可接受范围的每一秒大约需要 2,000 秒。在此间隔内,本地时钟将与任何其他网络时钟不一致,并且系统不能用于需要正确同步网络时间的分布式应用程序。

在开始主要服务之前运行ntpdate,然后ntpd -x在其之后运行可能是一个很好的组合解决方案,以确保在需要无级计时之前发生任何主要步骤。

答案2

如果这是您想要编写的代码,那么这可能是您正在寻找的答案:https://stackoverflow.com/questions/1205722/how-do-i-get-monotonic-time-durations-in-python

相关内容