我们在隔离网络上部署了 Ubuntu 14.04 服务器,运行 ntpd 4.2.6p5,配置为使用客户提供的多个 NTP 服务器(无法访问 pool.ntp.org)。我们的哑终端客户端设备运行旧版本的 BusyBox(1.00-rc2)和ntp客户端 2010来自拉里·杜立特。
多年来,这种设置一直运行良好,但最近我们遇到了新客户的阻碍。他们为我们提供了 5 个内部 NTP 服务器地址,就ntpdate-debian
Linux 服务器而言,这些地址本身似乎运行良好。然而,在 BusyBox 方面,ntpclient
却抱怨“分散度太高”。从调试输出中,ntpclient
从 NTP 服务器获取“1217163.1”,但它支持的最大值是绝对值 (65536)。
$ /usr/sbin/ntpclient -s -i 15 -h 10.17.162.250 -d
Configuration:
-c probe_count 1
-d (debug) 1
-g goodness 0
-h hostname 10.17.162.250
-i interval 15
-l live 0
-p local_port 0
-q min_delay 800.000000
-s set_clock 1
-x cross_check 1
Listening...
Sending ...
recvfrom
packet of length 48 received
Source: INET Port 123 host 10.17.162.250
LI=0 VN=3 Mode=4 Stratum=4 Poll=4 Precision=-20
Delay=60745.2 Dispersion=1346801.8 Refid=10.31.10.21
Reference 3668859928.942079
(sent) 3668859928.708371
Originate 3668859928.708371
Receive 3668859928.963271
Transmit 3668859928.963369
Our recv 3668859928.708371
Total elapsed: 0.00
Server stall: 93.09
Slop: -93.09
Skew: 255443.94
Frequency: 0
day second elapsed stall skew dispersion freq
42463 56728.708 rejected packet: abs(DISP)>65536
这些都是位于同一局域网上的设备,所以坦白说,我感到震惊不已,甚至有些震惊。
以下是ntpq -pn
Ubuntu 14.04 服务器的输出:
user@host:~$ ntpq -pn
remote refid st t when poll reach delay offset jitter
==============================================================================
127.127.1.0 .LOCL. 10 l 1025 64 0 0.000 0.000 0.000
10.17.162.249 10.17.6.10 5 u 23 1024 37 0.865 1381.07 697.260
10.31.10.22 .LOCL. 1 u 1044 1024 17 29.586 -838.06 397.342
10.17.6.10 10.31.10.21 4 u 1065 1024 17 0.366 105.245 402.999
*10.31.10.21 132.246.11.238 3 u 5 1024 37 29.418 794.292 616.796
10.17.6.11 10.31.10.21 4 u 1038 1024 17 0.408 120.030 381.058
我的问题是:
- 什么是色散以及什么可以改变其价值?
- 我可以运行哪些命令来从 NTP 服务器获取更多详细信息?
- 问题是否出在 Ubuntu 服务器端,是不是设置不当
ntp.conf
?其实那里没什么特别的。 - 在这种情况下,切换到 chrony 会改变什么吗?
答案1
我发现这里的答案有些令人困惑。首先,ntpclient
至少在-s
模式下,它不是完整的 NTP 客户端,它只是发送和接收一包,因此不存在“最后收到的 8 个数据包”。它实际上根本没有估计自己的分散度。
相反,它打印的值是服务器返回的数据包中称为“根散度”(rootdisp) 的值,它是该服务器与正确时间之间的总误差/方差的估计值。计算方法非常简单:每个 NTP 服务器要么从外部时钟(例如无线电或 GPS 接收器)获取时间,要么从另一个 NTP 服务器获取时间。如果服务器从外部时钟获取时间,则其根散度是该时钟的估计最大误差。如果它从另一个 NTP 服务器获取时间,则其根散度是该服务器的根散度加它们之间的网络链接所增加的弥散。
这里容易让人混淆的是,ntpq 和 chrony 以秒为单位显示离散度和根离散度,这是人们习惯看到的,而 ntpclient 则以秒为单位显示。微秒无论如何,1217163 这个值仍然相当高。一个好的 NTP 服务器可以在几毫秒内知道时间;一个坏的 NTP 服务器可以在几十或几百毫秒内知道时间。你的服务器告诉你,它的时间只能在 +/- 1.2 秒内被信任。
-x 0
实际上,您可以通过传递或-t
选项(取决于 ntpclient 的版本)让ntpclient 同步到此服务器,这将禁用 NTP 健全性检查。如果您只需要大致准确的时间(精确到几秒钟),这可能就足够了。但是,ntpclient 拒绝同步到如此糟糕的服务器是相当合理的。您ntpq
在 ubuntu 机器上的输出显示其所有服务器的抖动都为数百毫秒,即使它们的延迟很低,这表明网络非常不可靠,或者存在全部服务器提供不稳定的时间,或者服务器本身存在基本计时问题。
令我担心的是,服务器 10.31.10.22 正在通告 refid LOCL
(无纪律的本地时钟),但其层级为 1。通常,本地时钟被伪造为层级 10,因此它仅用作最后的同步源,以防止群体分散。要么是 10.31.10.22 配置错误,为网络的其余部分提供了错误的时间,要么是它被 NTP 控制之外的某个程序调整为正确时间,在这种情况下,错误配置只是它在通告 refid LOCL
;它应该被覆盖为例如GPS
或任何提供其时间的东西。
答案2
“什么是色散?”的部分答案:
典型的 NTP 往返:
client | | server
t1 |------->| t2
t3 |<-------| t4
这会产生两个值,偏移量(客户端和服务器之间的时间差)和延迟(本质上是网络传输时间),其公式如下:
offset= ((t4 - t3) + (t1 - t2)) / 2
delay = (t4 - t1) - (t3 - t2)
客户端从收到的最后 8 个数据包中选择当前偏移量,并选择延迟最小的数据包。
同样的 8 个数据包用于计算分散通过对这 8 个偏移量与上一步中选择的偏移量的差值进行加权平均,其中延迟用作加权因子,延迟越小,权重越大。它是对值“分布”的度量,用于计算时间服务器的质量,特别是当您有多个可供选择时。
答案3
您的分散和偏差非常大,本地时钟与该对等点之间的偏移非常大。您应该将偏移与本地时钟进行比较date
,然后手动设置时钟。
运行 ntpd 并ntpq -p
使用所有对等点从主机显示。它将选择更好的。
答案4
根据这个思科文档,”分散以秒为单位报告,是本地时钟和服务器时钟之间观察到的最大时钟时间差”。对于未完全损坏的 ntp 服务器,不应出现高偏差。唯一可行的情况是当您的客户端启动 ntp 并且到目前为止只有本地时钟可用时。即使在这种情况下,您报告的偏差也相当于时钟偏差超过两周。
这应该足以确保本地时钟在开始时不会相差太远(即使几个小时也是可以接受的),可以通过在 BIOS 中调整时钟(甚至日期!)或在客户端ntpdate
启动之前发出一次。ntpd