在CentOS系统上使用chrony进行NTP时间同步时,最核心的两个操作就是用chronyc sources查看当前追踪的时间源状态,以及用chronyc sourcestats统计每个时间源的同步精度数据。直接在终端执行chronyc sources -v可以看到每个时间源的状态标记(*代表当前同步源,+代表候选源,?代表未确认源),而chronyc sourcestats -v则会输出每个源的样本数、偏移量、频率偏差、RMS偏移等关键精度指标。这两条命令是运维人员判断NTP同步质量的第一手依据,下面我会把整个链路从头到尾讲透。
很多运维同学在部署完chrony之后,只知道用ntpdate或timedatectl看一眼时间对不对,却从来不去关注chronyc的输出。实际上,chrony比传统ntpd更适合现代服务器环境,它同步速度更快、对网络抖动的容忍度更高,而且提供了非常丰富的诊断命令。今天这篇文章就围绕chronyc的两个核心命令展开,把时间源追踪和精度统计的方方面面都覆盖到。
一、chrony在CentOS上的安装与基础配置CentOS 7及以上版本默认已经预装了chrony。如果你的系统是最小化安装,可以用以下命令安装:
yum install chrony -y
安装完成后,主配置文件位于/etc/chrony.conf。打开这个文件,你会看到默认的server和pool指令。对于国内服务器,建议替换为国内的NTP源池,比如阿里云、腾讯云或中科院的NTP服务器:
server ntp1.aliyun.com iburst server ntp2.aliyun.com iburst server ntp3.aliyun.com iburst server ntp4.aliyun.com iburst pool ntp.ntsc.ac.cn iburst
iburst参数的作用是在首次同步时快速发送一组数据包,缩短初始同步时间。配置改完之后重启服务:
systemctl restart chronyd systemctl enable chronyd
确认服务状态正常:
systemctl status chronyd
到这一步,chrony已经在后台运行了。接下来才是真正的重点——如何追踪它到底在跟谁同步、同步精度怎么样。
二、用chronyc sources追踪时间源状态执行chronyc sources命令,你会看到类似下面的输出:
210 Number of sources = 5 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* ntp1.aliyun.com 1 6 377 24 -128us[ -156us] +/- 18ms ^+ ntp2.aliyun.com 1 6 377 23 +245us[ +217us] +/- 22ms ^- ntp3.aliyun.com 1 6 377 25 -189us[ -217us] +/- 19ms ^+ ntp4.aliyun.com 1 6 377 24 +312us[ +284us] +/- 25ms ^- ntp.ntsc.ac.cn 1 6 377 26 -203us[ -231us] +/- 21ms
这张表信息量非常大,我逐列解释。第一列的符号是状态标记:*表示当前正在使用的同步源,+表示可作为备选的候选源,-表示被排除的源,?表示连接尚未确认。第二列MS是模式,S代表服务器模式。Name/IP address就是时间源地址。Stratum是层级,1代表直接连接到一级时间源(比如GPS授时的服务器)。Poll是轮询间隔,单位是秒的对数,6表示2^6=64秒轮询一次。Reach是一个八进制数,377表示最近8次轮询全部成功,如果变成0说明这个源已经完全不可达。LastRx是距离上次收到数据包的秒数。Last sample是最近一次采样的偏移量,方括号里是上次采样的值。
重点关注两个东西:一是带*号的源,那就是你当前真正在用的时间源;二是Reach值,如果某个源的Reach持续下降到0,说明网络链路或源本身出了问题,需要排查。加-v参数可以看到更详细的信息:
chronyc sources -v
这个命令会额外显示每个源的IP地址、NTP模式、认证状态等信息,在排查问题时非常有用。
三、用chronyc sourcestats统计同步精度如果说chronyc sources告诉你"跟谁同步",那chronyc sourcestats就是告诉你"同步得好不好"。执行命令:
chronyc sourcestats -v
输出示例:
210 Number of sources = 5 Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev =============================================================================== ntp1.aliyun.com 8 8 352 +0.123 0.045 -128us 18ms ntp2.aliyun.com 8 8 348 +0.118 0.052 +245us 22ms ntp3.aliyun.com 8 8 355 +0.131 0.048 -189us 19ms ntp4.aliyun.com 8 8 341 +0.127 0.055 +312us 25ms ntp.ntsc.ac.cn 8 8 360 +0.115 0.042 -203us 21ms
这里每一列都有明确含义。NP是样本数量,NR是剩余有效样本数。Span是采样跨度(秒)。Frequency是频率偏差,单位ppm(百万分之一),这个值反映本地时钟相对于源的频率漂移,正常应该在±100ppm以内。Freq Skew是频率偏差的估计误差。Offset是平均偏移量,就是本地时钟和源之间的平均时间差,微秒级。Std Dev是标准差,反映偏移量的波动程度,这个值越小说明同步越稳定。
从运维角度来说,你需要重点盯这几个指标:Offset绝对值最好控制在1ms以内,Std Dev最好在几十毫秒以内。如果某个源的Std Dev突然飙到几百毫秒甚至秒级,说明这个源不稳定,chrony会自动降低它的权重甚至切换到其他源。
四、如何持续监控同步精度并生成统计报告手动执行命令查看只是临时手段,生产环境需要持续监控。有几种实用方法。
第一种,写一个简单的shell脚本定时采集数据并记录:
#!/bin/bash LOGFILE="/var/log/chrony_stats.log" echo "=== $(date '+%Y-%m-%d %H:%M:%S') ===" >> $LOGFILE chronyc sources -v >> $LOGFILE echo "---" >> $LOGFILE chronyc sourcestats -v >> $LOGFILE echo "" >> $LOGFILE
把这个脚本加入crontab每分钟执行一次:
* * * * * /usr/local/bin/chrony_monitor.sh
第二种,利用chronyc的tracking命令查看更综合的系统同步状态:
chronyc tracking
这个命令会输出参考ID、层级、频率偏差、RMS偏移、时钟漂移等综合指标。其中RMS offset是一个加权计算的综合偏移值,比单个源的offset更有参考意义。正常情况下RMS offset应该在1ms以下,如果超过10ms就需要检查网络或更换时间源了。
第三种,结合系统日志。chrony会在/var/log/messages或/var/log/chrony/目录下记录同步事件,包括源切换、大偏移告警等。可以用grep过滤关键信息:
grep -i chrony /var/log/messages | tail -50五、常见问题排查与精度优化建议
在实际运维中,你可能会遇到几种典型情况。
情况一:所有源的Reach都是0。这通常是防火墙问题。chrony使用UDP 123端口,确认iptables或firewalld没有拦截:
firewall-cmd --permanent --add-service=ntp firewall-cmd --reload
情况二:Offset很大但Std Dev很小。这说明本地时钟和源之间存在固定偏差,但同步本身是稳定的。可以用chronyc makestep手动强制步进校正:
chronyc makestep
情况三:频繁切换同步源。如果chronyc sources里的*号在不同源之间跳来跳去,说明没有一个源是稳定的。这时候需要增加源的数量,或者检查网络质量。建议至少配置4个以上的时间源,让chrony有足够的选择空间。
关于精度优化,有几个硬核建议。首先,如果你的服务器有硬件时钟(RTC),确保它是准确的,可以用hwclock --systohc同步。其次,在chrony.conf中可以添加leapsecmode指令来处理闰秒问题,避免闰秒导致的时间跳变。再次,对于虚拟化环境,宿主机的时钟质量直接影响虚拟机,建议宿主机也跑chrony并且配置硬件时钟源。最后,如果你对精度要求极高(比如金融交易系统),可以考虑使用PTP(精确时间协议)而不是NTP,但那是另一个话题了。
六、chronyc其他有用的诊断命令汇总除了sources和sourcestats,chronyc还有几个命令值得掌握。chronyc activity可以查看当前有多少源在线或离线;chronyc clients可以查看chrony作为NTP服务器时有哪些客户端连接;chronyc serverstats可以查看chrony自身作为服务端的统计信息。如果你的服务器同时充当内网NTP服务器,这个命令就很有用。
另外,chronyc -h可以查看所有可用命令的列表。养成习惯,遇到时间同步问题先跑一遍chronyc tracking和chronyc sourcestats,基本上80%的问题都能定位到。
总结一下,chronyc sources追踪时间源状态,chronyc sourcestats统计同步精度,这两个命令是CentOS运维中时间同步管理的核心工具。配合tracking命令、日志分析和定时脚本,你就能建立一套完整的NTP监控体系。不要等到业务出了时间相关的故障才去关注同步质量,日常巡检时就应该把这些指标纳入监控范围。
