先看现象。KVM 虚机上跑 CentOS 7.9,chronyc tracking 里状态显示正常同步,offset 却在正负三百毫秒之间来回跳,定时任务的时间戳偶尔比日志早两秒,业务按时间排序的数据出现乱序。

排查方向其实有限,先把可能性排一排。虚机没启用 kvm-clock,内核退回到 acpi_pm 这种精度很差的时间源。另一种情况是宿主机 CPU 超分严重,vCPU 被调度出去,时钟中断的延迟被拉长。

另外,chronyd 的 maxslewrate 设得太小,偏差大时只能慢慢追,追的过程一直在抖。

少数情况下是网卡中断合并把 NTP 回包的时间戳拖后,测出来的 offset 本身就偏。

第一件事是看内核当前用的是哪个时钟源

cat /sys/devices/system/clocksource/clocksource0/current_clocksource; dmesg | grep -i clocksource

随后看偏差和频率补偿的变化

chronyc tracking; chronyc sources -v

接着把时钟源切到 kvm-clock 并确认生效

echo kvm-clock > /sys/devices/system/clocksource/clocksource0/current_clocksource

允许大步调整,避免长时间追偏差

chronyc makestep; grep -E 'makestep|maxslewrate' /etc/chrony.conf

恢复的判定其实很直接。chronyc tracking 里 offset 稳定在五毫秒以内,频率补偿值不再大幅波动,连续观察两小时没有超过五十毫秒的跳变。

提醒一点。current_clocksource 是运行时参数,重启就回到默认,要改得在 grub 里加 clocksource=kvm-clock;容器里看到的 offset 抖动往往来自宿主机,先把这个虚机本身的时间源确认干净再往下查。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189