“kernel: timekeeping watchdog expired” 导致时间跳跃的硬件/虚拟化排查

14次阅读

timekeeping watchdog expired 表明内核检测到单调时钟停滞或倒退超阈值(约1秒),强制校正导致 CLOCK_REALTIME 跳变;主因是硬件计时器异常或虚拟化时间同步失控。

“kernel: timekeeping watchdog expired” 导致时间跳跃的硬件/虚拟化排查为什么 timekeeping watchdog expired 会引发时间跳跃

这个内核日志不是警告,而是故障已发生的信号:内核时间子系统检测到单调时钟(如 TSCHPET)在两次更新之间停滞或倒退超阈值(默认约 1 秒),于是强制触发时间校正——表现为系统时间突然跳变(clock_gettime(CLOCK_MONOTONIC) 不跳,但 CLOCK_REALTIME 可能跳)。根本原因几乎总是硬件计时器异常或虚拟化层时间同步失控。

物理机上重点检查 TSC 稳定性与 bios 设置

现代 x86 物理服务器默认依赖 TSC(时间戳计数器)作为主时钟源,但它必须满足 invariant TSC(频率恒定、跨核同步)才能安全使用。若 BIOS 关闭了 Invariant TSCIntel SpeedStep(或 amd Cool’n’Quiet)动态调频未禁用,或 CPU 进入深度 C-state 后 TSC 暂停,就可能触发 watchdog。

  • 确认当前时钟源:cat /sys/devices/system/clocksource/clocksource0/current_clocksource,若为 tsc,继续排查
  • 检查 TSC 是否 invariant:dmesg | grep -i "tsc.*invariant",应有类似 TSC now invariant 的输出
  • BIOS 中关闭所有 CPU 节能特性(C-states > C1、SpeedStep、Turbo Boost),并启用 Invariant TSC(名称因厂商而异,如 Intel 的 Enhanced Intel SpeedStep Technology 需禁用)
  • 启动参数强制降级时钟源测试:clocksource=acpi_pmclocksource=hpet,观察是否消失(性能会下降,仅用于验证)

KVM/QEMU 虚拟机需禁用 host-passthrough 的 TSC 并校准 guest 时间

当 KVM 使用 host-passthrough 暴露宿主机 CPU 特性给 guest 时,guest 的 TSC 直接映射宿主机 TSC。一旦宿主机因节能、迁移或负载导致 TSC 异常,guest 就会立即中招。这不是 guest 自身问题,而是虚拟化层透传了不稳定的硬件行为。

  • 修改 VM xml,将 改为 ,避免透传 TSC 相关标志
  • 确保宿主机已启用 kvm-clock:检查 dmesg | grep kvm-clock,应有 using kvm clock
  • guest 内安装 chrony 并配置为只用 kvm-clock 校准:makestep 1 -1 + rtcsync,禁用 NTP 硬件时钟同步(hwtimestamp
  • 宿主机上禁用 qemu-ga 的时间同步功能(org.qemu.guest_agent.0.command_time_sync 设为 false),避免干扰内核 timekeeping

容器与云环境要警惕 hypervisor 时间漂移传递

在 AWS EC2(尤其是 t3/t4g burstable 实例)、azure 的 B-series 或 GCP 的 E2 实例上,底层 hypervisor 为控制 CPU 积分会主动暂停 vCPU,导致 guest TSC 停滞。这种暂停对 guest 内核不可见,但 timekeeping watchdog 能感知到“时间没走”,从而跳变。

  • 查看实例类型文档,确认是否属于 burstable 类型;如果是,升级到固定性能实例(如 EC2 m5、GCP e2-standard)是根治方案
  • 临时缓解:在 guest 中设置 kernel.tsc=reliable(仅限已知稳定 TSC 的场景),或加启动参数 clocksource=tsc tsc=reliable
  • 云平台监控中重点关注 CPUCreditBalance(AWS)或 cpu-usage-rate(GCP),持续低于阈值说明 CPU 被节流,时间异常大概率伴随发生

真正棘手的不是日志本身,而是它往往只在时间跳变后才出现——等你看到 timekeeping watchdog expired,服务可能已经因时间回跳丢弃了 TLS 证书、拒绝了 NTP 请求、或让分布式锁失效。务必在部署前就锁定时钟源和虚拟化配置,而不是等告警再查。

text=ZqhQzanResources