傳統物理機中,RTC/PIT/HPET (週期性中斷時鐘) 與 TSC (時間戳計數器) 由獨立硬體電路驅動,物理特性保證其長期同步。虛擬化環境打破了這一前提:
結果:Guest OS 看到的「週期性時鐘走得慢」,而「TSC 跑得快」 → 時間漂移、Losing too many ticks!、定時器失效、效能測試異常。
| 時鐘類型 | 代表 | 機制 | Linux 角色 | |
|---|---|---|---|---|
| 週期性中斷時鐘 | PIT (100/250/1000Hz)、RTC、HPET | 硬體定時發送中斷 | Timekeeping 主時鐘源 (jiffies 遞增) | |
| 自由運行計數器 | TSC (x86)、CNTvCT (ARM) | CPU 頻率計數,無中斷 | 時間插值、校準、高精度定時器 |
| Hypervisor | 主要時間源 | TSC 策略 | PV 時鐘 | SMP 支援 |
|---|---|---|---|---|
| Xen | 虛擬 HPET/RTC | TSC Offset 動態調整 | 無 (早期) | 綁定 BSP,AP 失步 |
| KVM/QEMU | kvmclock (PV) | TSC Offset + TSC Scaling (新) | kvmclock (MSR) | 各 vCPU 獨立 kvmclock |
| VMware ESXi | 虛擬 HPET + VMware Tools | TSC 追蹤 + 回滾保護 | VMware Tools 時鐘同步 | 較好,支援 vCPU 熱插拔 |
| Hyper-V | Hyper-V 參考時間計數器 | TSC 同步 + 偏移 | Hyper-V 參考時鐘 (MSR) | 良好,支援時間旅行偵測 |
# 內核命令行參數
clocksource=kvmclock tsc=reliable nohz=on
# 或
clocksource=hyperv_clocksource tsc=reliable
# 關閉有問題的時鐘源
clocksource=acpi_pm # 避免使用不穩定的 ACPI PM Timer
CONFIG_KVM_GUEST、CONFIG_HYPERVISOR_GUESTqemu-guest-agent 協助宿主機同步systemd-timesyncd / chronyd 同步 NTP (最終防線)HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters → Type=NTP
# 1. 時鐘源狀態
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
cat /sys/devices/system/clocksource/clocksource0/available_clocksource
# 2. 時間漂移檢測
adjtimex --print | grep -E 'offset|freq|status'
ntpdate -q pool.ntp.org
chronyc tracking
# 3. TSC 穩定性
dmesg -T | grep -i tsc
lscpu | grep -i tsc
# 4. 虛擬化專用
# Xen
xenstore-read /vm//vcpu//tsc_offset
# KVM
cat /sys/kernel/debug/kvm/guest_tsc_offset (需 debugfs)
虛擬化時鐘同步是**硬體輔助 (TSC Offset/Scaling) + Hypervisor 軟體協議 (PV Clock) + Guest OS 適配**三位一體的系統工程。現代方案傾向於**繞過 TSC/RTC 同步**,直接向 Guest 提供單調、穩定的 PV 時鐘源 (kvmclock, hypervclock),並輔以 NTP 作為長期基準校準。SMP 多核時鐘一致性仍是演進中的課題,關鍵在於 vCPU 調度與時間虛擬化的深度協同。