本地网络上的 Ntpd - 防止时钟漂移导致高偏移

本地网络上的 Ntpd - 防止时钟漂移导致高偏移

我有一个以微控制器 ARM 为 NTP 服务器的本地网络,并且有一台运行 ubuntu 16.04 LTS 的台式计算机作为 NTP 客户端。

一旦我开始ntpd -g -c /etc/ntp.conf使用以下 ntp 配置文件

server 192.168.0.11 minpoll 4 maxpoll 4

ntpd 设置时间后的第一个偏移量显示出非常好的结果,即低于 1ms。我通过获取偏移值ntpq -p

但是,大约 1000 秒后,偏移量慢慢上升到 55 毫秒。对于我的应用程序来说,这种高偏移量是不可接受的。但在偏移量达到 55 毫秒后,ntpd似乎再次设置时间,偏移量变得足够小且稳定(<1 毫秒)。似乎ntpd让时钟漂移一段时间,经过(太)长一段时间后,守护进程会针对 NTP 客户端和 NTP 服务器之间的时钟漂移采取对策。

使用ntpd -g -c /etc/ntp.conf -f /etc/ntp.driftntp.drift生成的ntpd偏移量将始终保持在 1ms 以下,即时钟漂移导致的偏移量没有线性上升;这是所需的行为。

现在我的问题是:在我的应用程序中,我们不能让它ntpd运行一段时间来计算长时间后的时钟漂移,同步必须在启动 NTP 客户端后几秒钟进行,并且偏移必须保持稳定。

ntpd在不知道时钟漂移的情况下,如何获得稳定且较小的偏移?

答案1

Adriftfile记录本地时钟的频率,并且能够准确地对其进行约束是一件好事。Ubuntu默认/etc/ntp.conf 有一个。driftfile

附加iburst到服务器行会在初始同步时快速发送一些数据包。建议这样做,特别是如果您不想等待几分钟才能收到前几个数据包时。

初始化脚本可以延迟启动应用程序,直到 NTP 同步。使用ntp-waitsystemd 单元的依赖项执行此操作。或者ntpwait直接使用脚本。

您报告的偏移量不断增长然后自行修正,听起来就像 ntpd 跨越了其步进阈值,然后设置了时间而不是改变它。

答案2

您的 NTP 服务器时钟时间与现实世界 UTC 时间之间缺乏关联可能是问题的根源。如果您的 NTP 服务器没有多个现实世界源(无论它们是在互联网上还是 GPS、PPS 或本地网络上的原子源),那么它将无法确定其自身时钟的频率误差,因此无法有效地校准其时钟。

您可以通过打开服务器和客户端上的统计信息日志来确定该理论是否正确,如下所示:

statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

然后将您的统计文件和配置发布到 pastebin 或类似网站,我们可以根据您看到的行为对其进行分析。

答案3

尝试了几种不同的方法,但ntpd延迟仍然太大,于是我改用慢性的。我的 NTP 服务器保持不变。使用 chrony 时,延迟始终小于 1ms。我增加了轮询时间,因为chrony 推荐具有以下配置文件

### chrony.conf

# Add server
server 192.168.0.11 iburst minpoll -6 maxpoll -6 filter 15 xleave
hwtimestamp eth0 minpoll -6

# Logging
logdir /var/log/chrony
log measurements statistics tracking 

makestep 0.1 3
driftfile /etc/chrony.drift

并启动守护进程./chronyd -f /etc/chrony.conf

相关内容