硬件时钟(RTC)本身不准,日误差几秒至几十秒;云服务器无独立RTC;系统负载、休眠唤醒、节能模块干扰内核时钟;手动date或ntpdate粗暴跳变时间易致服务崩溃;chronyd平滑调整更安全;RTC须设为UTC避免重启偏差;分布式系统需chronyd在线、RTC与系统时间一致、NTP源可靠。

硬件时钟(RTC)本身就不准
主板上的实时时钟靠晶振计时,出厂精度通常只有 ±20–50 ppm(即每天误差几秒到几十秒)。温度变化、老化、电压波动都会放大偏差。云服务器或虚拟机甚至压根没独立 RTC,全靠宿主机模拟——一旦宿主机时间不准,客户机必然漂移。
系统负载和电源管理会干扰内核时钟更新
Linux 内核靠定时器中断维护系统时间,但高负载下中断可能被延迟;休眠/唤醒过程若未正确处理时钟状态,也会导致跳变或累积误差。笔记本、边缘设备启用 CPUFreq 或 intel_idle 等节能模块时,尤其容易出现“唤醒后快几分钟”的现象。
没启用 NTP 同步,或用了错误的同步方式
手动执行 date -s 或 ntpdate 只是瞬时修正,不解决持续漂移;且 ntpdate 已被弃用,它粗暴跳变时间,ZooKeeper、Kafka、TiDB 等对单调时间敏感的服务会直接报错崩溃。而 chronyd 默认平滑调整(slew),只在偏差 > 3 秒时才允许跳变(需显式触发 chronyc makestep)。
硬件时钟与系统时钟不同步,重启就露馅
常见陷阱:timedatectl set-ntp true 开了同步,但 RTC in local TZ: yes —— 这意味着关机时把带时区的本地时间写进了硬件时钟,开机又当成 UTC 读出来,结果在北京时间环境里直接快 8 小时。正确做法是运行 sudo timedatectl set-local-rtc 0,确保硬件时钟始终存 UTC。
真正稳住时间,不是调一次 date,而是让 chronyd 持续在线、RTC 与系统时间方向一致、NTP 源低延迟可连——三者缺一不可。尤其在分布式系统里,500ms 的节点间偏差都可能触发脑裂。









