一、问题现象
使用windows(W32Time)作NTP时钟源服务端,控制板端Linux作为客户端,使用ntpd服务无法同步时间,但是ntpdate是可以同步成功。
二、问题分析
1. 从报文的角度分析ntpd是否正常工作,以及与ntpdate的报文区别通过使用抓包工具发现,NTP虽然同步失败,但其实NTP是有一直在发送NTP报文的,如下:
推断结论:由此可知,ntpd服务工作是正常的,但是时间没有同步,应是由于内部某种机制判断报文时间无效造成。
2. 使用“ntpq -c as”进行分析
[root@DB ~]# ntpq -c as ind assid status conf reach auth condition last_event cnt =========================================================== 1 46885 9024 yes yes none reject reachable 2 [root@db~]# ntpq -c "rv 46885" associd=46885 status=9024 conf, reach, sel_reject, 2 events, reachable, srcadr=192.170.150.251, srcport=123, dstadr=192.170.150.13, dstport=123, leap=00, stratum=1, precision=-6, rootdelay=0.000, rootdisp=10742.889, refid=LOCL, reftime=db2c9fb9.07818901 Sun, Jul 10 2016 18:19:37.029, rec=db2d94e4.cabd81b8 Mon, Jul 11 2016 11:45:40.791, reach=377, unreach=0, hmode=3, pmode=4, hpoll=6, ppoll=6, headway=50, flash=400 peer_dist, keyid=0, offset=72815.578, delay=0.423, dispersion=16.529, jitter=10.969, xleave=0.029, filtdelay= 0.42 0.36 0.37 0.35 0.35 0.34 0.32 0.35, filtoffset= 72815.5 72812.7 72810.1 72808.1 72805.4 72803.5 72800.8 72798.6, filtdisp= 15.63 16.63 17.64 18.61 19.60 20.59 21.60 22.57
- Rootdelay: 表示相对于同步子网根的主参考源的最大误差, 只有大于零的正值才有可能。
- Delay :表示对端时钟相对于本地时钟在它们之间的网络路径上的往返延迟. 请注意,此变量可以采用正值和负值,具体取决于时钟精度和偏斜误差累积
- Dispersion :表示对端时钟相对于它们之间网络路径上的本地时钟的最大误差。 只有大于零的正值才有可能。
- Root Dispersion :表示相对于同步子网根时钟源的最大误差。 只有大于零的正值才有可能。
- Jitter :抖动(也称为定时抖动)是指频率的短期变化。
- Offset:客户端与时钟源的时差。
- filtdelay,filtoffset和filtdisp:三个对等变量显示最后八轮测量轮次中的每一轮的延迟,偏移和抖动统计。这些统计信息及其趋势是服务器,客户端和网络的重要性能指标。例如,延迟和抖动的大幅波动表明网络拥塞。缺少时钟滤波器阶段表明网络中的数据包丢失。
推断结论:上述结果表示NTP拒绝了这个server,返回码flash=400 peer_dist(对于flash状态码的解释请查阅本文附一),表示distance(距离)超过了距离阈值,默认的距离阈值是1.5s。
distance(距离)计算公式(ms单位换算为s): distance = ((delay + rootdelay) / 2 + dispersion + rootdispersion + jitter) / 1000
将上述调试结果具体值带入计算公式得到距离值distance: distance = ((0.423 + 0.000) / 2 + 16.529 + 10742.889 + 10.969) / 1000 ≈ 10.770s > 1.5s(默认距离阈值)
本例中rootdisp值较大,一般常见的是w32time时钟源场景,且该时钟源服务器windows可能未配置稳定的外部时钟源。而默认的tos maxdist距离阈值是1.5s(1500ms),超过该阈值则不会被时钟选择算法认可,客户端不会从这个时钟源进行时间同步。
备注:
(1)对于同步距离,官方文档对该部分介绍的中文翻译为:
同步距离(定义为延迟的一半加上色散)表示最大误差统计量。抖动表示预期的错误统计信息。从对等变量计算的最大错误和预期错误表示服务器的质量度量。从系统变量计算的最大误差和预期误差表示客户端的质量度量。如果任何服务器的根同步距离超过1.5秒(称为选择阈值),则认为该服务器无效。
1.5S是linux的默认值,如果不人工配置该值,则默认值生效,可以在/etc/ntp.conf中加入tos maxdist 30将同步距离的阈值改为30。如果一次同步的同步距离大于设置的门限值,客户端会认为该时钟源不可信,不会进行同步,此时的flash状态码会返回400,说明超过最大同步距离。但是会继续发送探测报文。造成同步距离变大的原因不在少数,比较常见的是网络波动和某一端发生时间跳变。
(2)距离阈值是可设置的,可以在/etc/ntp.conf
中(在restrict、server行之前)修改/新增tos maxdist 30
来设置距离阈值为30s,提升系统对时钟源稳定性的容忍度。
三、解决方案
方案一:更换linux系统作ntp时钟源(推荐)
方案二:添加参数规避(规避方案,不推荐)
1、使用vi编辑器,修改/etc/ntp.conf,在所有“restrict”、“server”开头的行之前添加一行tos maxdist 30;添加之后,按esc,输入:wq存盘退出。
2、强制时间同步(对时间敏感的业务需停业务后执行此操作,如数据库)
[root@db~]# systemctl stop ntpd
[root@ db~]# ntpdate 172.16.1.200 //172.16.1.200是ntp服务器IP
[root@ db~]# systemctl start ntpd
此时可使用“ntpq -p”指令查看时间同步是否恢复正常,remote列IP前面有*代表NTP服务器正常工作。
[root@DB~]# ntpq -p remote refid st t when poll reach delay offset jitter ================================================================== *172.16.1.200 .LOCL. 1 u 3 64 1 0.210 -0.500 0.000
附一:NTP官方文档对于flash状态码的解释
码 | 信息 | 描述 |
0000 | ok | 同步成功 |
0001 | pkt_dup | 重复包 |
0002 | pkt_bogus | 伪包 |
0004 | pkt_unsync | 服务器未同步 |
0008 | pkt_denied | 拒绝访问 |
0010 | pkt_auth | 验证失败 |
0020 | pkt_startum | 无效的跳跃或阶层 |
0040 | pkt_header | 标头距离超出 |
0080 | pkt_autokey | 自动键序列错误 |
0100 | pkt_crypto | 自动键协议错误 |
0200 | peer_stratum | 无效的标题或阶层 |
0400 | peer_dist | 超出距离阈值 |
0800 | peer_loop | 同步循环 |
1000 | peer_unreach | 无法访问或未选择 |