虚拟机在挂起恢复后时间漂移问题
问题现象
虚拟机在从内存快照恢复后,存在时间漂移的情况,大约过3s后才被chronyd同步正确。
Linux时间分为内核时间,系统时间(用户态)。
用户态程序使用的都是系统时间,系统时间的同步有两种:
1.内核时间是通过内核时钟源(TSC/kvm-clock)获取的,然后同步到系统时间。
2.chronyd时间同步服务通过时间硬件设备(ptp0)或者网络(ntp)获取时间,然后同步到系统时间。
原因
1.TSC内核时钟源在虚拟机挂起恢复场景下存在时间漂移的情况,导致虚拟机resume后没法将系统时间同步到准确时间,原因是虚拟机的TSC内核时钟源是通过VCPU实现的,挂起后,VCPU也停止运行了,再恢复起来就会按挂起前的时间继续运行。
2.chronyd服务同步时间的动作在resume时会滞后3s左右(原因未明),所以就存在3s左右时间错误的阶段
解决办法
将内核时钟源修改为kvm-clock,kvm-clock是通过kvm模块直接向host获取时间的,虚拟机挂起不影响host上kvm模块的运行,在resume后,kvm-clock会第一时间将准确的内核时间同步到系统时间,之后chronyd只需要进行微调就好了。
给社区小提一个patch:https://github.com/e2b-dev/infra/pull/638