报错是这么冒出来的。CentOS 7.9 上装了 chrony 又保留着 ntpd,两个服务都在跑,date 看到的时间每隔几分钟跳几百毫秒,日志里两个服务互相报 offset 过大。
中间走过弯路,把「两个服务的配置文件指向不同的时间源,各自认为对方是错的」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。两个时间守护进程同时改内核时钟,调整量互相抵消又互相覆盖。另一种情况是ntpd 用的是 step 模式,chronyd 用 slew,策略冲突。
还有一种情况,systemd 里两个 unit 都被 enable,开机各起一份。
先确认有几个时间服务在跑
systemctl list-units --type=service | grep -E 'chronyd|ntpd|ntpdate'
再往下停掉并禁用 ntpd,只留 chrony
systemctl disable --now ntpd && systemctl enable --now chronyd
接着确认只剩一个进程在改时钟
pgrep -a 'chronyd|ntpd'
剩下的就是看同步状态是否稳定
chronyc tracking && chronyc sources -v
恢复的判定其实很直接。pgrep 只剩 chronyd 一个进程,chronyc tracking 的 offset 稳定在毫秒以内,date 不再出现跳变。
一台机器只能有一个时间同步服务,装新的一定要卸旧的;容器里不要跑时间守护进程,交给宿主机统一同步。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
