这类问题我又碰上了一次。CentOS 7.9 上有人用 date -s 把时间往前调了五分钟,之后 chronyd 一直显示已同步,offset 却每天缓慢增长,一周后差了四十多秒。
第一反应是「手动改时间没有通知 chronyd,内部状态还停留在旧值」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。chronyd 默认不校正超过阈值的跳变,判定为异常后只做缓慢 slew;makestep 没配置,启动后的大偏差不会被立即纠正;时间源本身不稳,chronyd 反复切换源,收敛很慢。
第一件事是看当前偏差和同步状态
chronyc tracking | grep -E 'System time|Last offset|Leap'
然后配置启动时允许大步调整
printf 'makestep 1.0 3\n' >> /etc/chrony.conf
再往下重启服务让它重新收敛
systemctl restart chronyd && sleep 5 && chronyc tracking
等前面都确认过,再确认偏差已经收敛到毫秒级
chronyc tracking | grep 'System time' && date
改完先别撤,确认这几项。chronyc tracking 里 System time 的偏差回到毫秒级,date 与其他机器一致,定时任务不再错点执行。
这里还有个坑。手动 date -s 之后一定要重启 chronyd,否则它会认为时钟是可信的;makestep 的第二个参数是前几次校正允许跳变。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
