4. 网络排查工具:ntpq -p、chronyc sources、ptp4l 状态查看

时钟同步出问题的时候,你第一反应是什么?

我个人的习惯是——先看工具输出。别急着改配置,先看看当前系统到底在跟谁同步,偏差有多大。说白了,诊断的第一步就是「问状态」。

这一节,咱们把三个最常用的排查工具掰开揉碎讲清楚。分别是 NTP 时代的 ntpq -p、Chrony 时代的 chronyc sources,以及 PTP 时代的 ptp4l 状态查看。每个工具我都踩过坑,咱们一个一个来。

4.1 ntpq -p:老牌工具,但依然能打

如果你还在用传统的 NTP 服务,ntpq -p 就是你最亲密的战友。我在项目中遇到过好几次,用户说「时间不准了」,我第一件事就是 SSH 上去敲这个命令。

ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp1.aliyun.com  .INIT.          1 u   62   64  377   28.123  -0.052   0.023
+ntp2.aliyun.com  100.122.123.1   2 u   31   64  377   32.456  +0.018   0.035
-ntp3.aliyun.com  192.168.1.1     3 u    -   64   17   45.678  +5.234   1.234

这个输出怎么看?我教你几个关键点:

  • 第一列前面的符号* 表示当前同步源,+ 是候选源,- 是被排除的源。如果没有任何 *,说明系统没同步上。
  • st(Stratum):层级。越小越准。1 是原子钟,2 是跟原子钟同步的服务器,以此类推。我见过有人配了 stratum 10 的源,那基本等于没配。
  • when:上次查询到现在过了多少秒。如果这个值一直增长,说明通信断了。
  • reach:八进制表示的成功率。377 表示最近 8 次全部成功,0 表示全部失败。嗯,这里要注意,如果 reach 是 0,那基本可以断定网络有问题。
  • offset:偏差值,单位毫秒。正数表示本地比源慢,负数表示本地比源快。绝对值超过 1000ms 就要警惕了。
我的小技巧:如果 ntpq -p 输出为空,先检查 NTP 服务是否在运行。用 systemctl status ntpd 看一眼。我曾经排查了半小时,最后发现服务根本没启动。

4.2 chronyc sources:现代系统的首选

现在大多数新系统都默认用 Chrony 了。为什么?因为它同步更快,对网络抖动的容忍度更高。我个人也更喜欢 Chrony,尤其是在虚拟机环境里,表现比老 NTP 好太多。

查看同步源状态,用这个命令:

chronyc sources -v
  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp1.aliyun.com               2   6   377    32   -5us[  -8us] +/-  11ms
^- ntp2.aliyun.com               2   6   377    63  +12us[ +12us] +/-  13ms
^? ntp3.aliyun.com               3   6     0   112  +20ms[ +20ms] +/-  40ms

你看,这个输出比 ntpq 更详细。我重点看这几个字段:

  • Source state* 是当前同步源,^? 表示不可达。如果全是 ^?,那网络肯定有问题。
  • Reach:同样是八进制,377 是满分。0 就是全丢。
  • Last sample:最近一次采样的偏差。注意看单位,us 是微秒,ms 是毫秒。偏差在微秒级说明状态很好。
避坑指南:我曾经遇到一个案例,chronyc sources 显示 * 正常,但时间就是不准。后来发现是防火墙把 NTP 端口封了,但 Chrony 用了别的端口做测量。所以,光看状态还不够,还得用 chronyc tracking 看实际偏差。

顺便提一句,chronyc tracking 也很重要。它会告诉你系统当前的时钟偏差、频率偏差、以及最后一次校正的时间。我一般两个命令配合着用。

4.3 ptp4l 状态查看:高精度场景的利器

如果你在做金融交易、5G 基站或者工业控制,那 PTP(精确时间协议)才是你的菜。PTP 的精度能到纳秒级,比 NTP 高好几个数量级。

PTP 的守护进程叫 ptp4l。查看它的状态,我通常用两种方式:

4.3.1 直接看日志输出

ptp4l 默认会把状态打印到标准输出。关键信息长这样:

ptp4l[12345]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED.
ptp4l[12345]: rms 12 ns max 45 ns freq -12345 ppb delay 567 ns

这里要注意几个状态机转换:

  • UNCALIBRATED → SLAVE:这是正常流程,表示从钟已经锁定主钟。
  • rms 12 ns:均方根偏差,12 纳秒,相当不错。
  • freq -12345 ppb:频率偏差,单位是十亿分之一。这个值如果太大,说明本地晶振质量不行。
  • delay 567 ns:路径延迟。这个值如果突然变大,可能是网络拓扑变了。
重点:如果状态一直卡在 UNCALIBRATED 或者 LISTENING,说明主从之间没协商成功。我遇到过最坑的一次,是交换机的 PTP 透明时钟功能没开,导致报文被丢弃。

4.3.2 用 pmc 工具查询

pmc 是 PTP 的管理工具,可以主动查询状态。我个人习惯用这个命令:

pmc -u -b 0 'GET CURRENT_DATA_SET'
        currentDS.offsetFromMaster: -12
        currentDS.meanPathDelay: 567
        currentDS.stepsRemoved: 1
  • offsetFromMaster:与主钟的偏差,单位纳秒。负值表示本地比主钟快。
  • meanPathDelay:平均路径延迟。这个值应该稳定,如果剧烈抖动,说明网络有问题。
  • stepsRemoved:跳数。1 表示直连主钟,2 表示经过了一级边界时钟。
我的经验:PTP 排查时,别忘了看网卡驱动是否支持硬件时间戳。用 ethtool -T eth0 查看。如果不支持硬件时间戳,PTP 精度会从纳秒级掉到微秒级,那就失去意义了。

4.4 三个工具的核心对比

为了方便你快速选择,我整理了一个对比表:

工具 适用场景 精度 关键字段 常见问题
ntpq -p 传统 NTP 环境 毫秒级 reach, offset, st reach 为 0,无 * 符号
chronyc sources 现代 Linux 系统 毫秒级 Reach, Last sample, Source state ^? 不可达,偏差突变
ptp4l / pmc 高精度场景 纳秒级 rms, offsetFromMaster, delay 状态卡在 UNCALIBRATED

你想想看,这三个工具其实覆盖了从毫秒到纳秒的整个精度范围。排查时,先确认你用的是哪个协议,再选对应的工具。别拿 ntpq 去查 PTP 环境,那肯定查不出东西。

4.5 知识体系结构图

下面这张图,帮你理清这三个工具的关系和排查路径:

时钟同步排查工具知识体系 网络排查工具 NTP 协议 ntpq -p reach / offset / st Chrony 协议 chronyc sources Reach / Last sample / State PTP 协议 ptp4l / pmc rms / offsetFromMaster 排查口诀:先看协议,再选工具,最后看偏差

说白了,这三个工具就是你的「三把刀」。NTP 环境用 ntpq,Chrony 环境用 chronyc,PTP 环境用 ptp4l。别搞混了。我见过有人用 ntpq 去查 Chrony 的状态,结果啥也看不到,还以为是系统坏了。

嗯,这一节的内容就到这儿。工具是死的,人是活的。多敲几次命令,你自然就能一眼看出问题在哪儿。


公众号:蓝海资料掘金营,微信deep3321