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

Dan*_* R. 8 ntp time-synchronization ntpd clock-synchronization

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

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

server 192.168.0.11 minpoll 4 maxpoll 4
Run Code Online (Sandbox Code Playgroud)

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

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

使用ntpd -g -c /etc/ntp.conf -f /etc/ntp.driftwherentp.drift由 生成ntpd,偏移量将始终保持在 1ms 以下,即没有时钟漂移引起的偏移量线性上升;期望的行为。

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

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

Joh*_*ald 9

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

附加iburst到服务器行会在初始同步时快速发送一些数据包。推荐,特别是如果您不想为前几个数据包等待几分钟。

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

您关于偏移量增长然后自行纠正的报告听起来像是 ntpd 超过了其步长阈值,然后设置时间而不是回转它。


Pau*_*ear 5

您的 NTP 服务器的时钟时间与现实世界的 UTC 时间之间缺乏关系可能是您问题的根源。如果您的 NTP 服务器没有多个真实世界的源(无论它们是在 Internet 上还是本地网络上的 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
Run Code Online (Sandbox Code Playgroud)

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


Dan*_* R. 3

在尝试了几个不同的选项后ntpd仍然有太大的延迟后,我切换到chrony。我的 NTP 服务器保持不变。使用 chrony 的延迟始终小于 1 毫秒。我按照 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
Run Code Online (Sandbox Code Playgroud)

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