多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

虚拟机时间虚拟化难点与Xvisor的应对之道

虚拟机时间虚拟化难点与Xvisor的应对之道 1. 为什么虚拟机的时间这么难做搞过虚拟化底层的人都知道guest里的时间比别的资源都难伺候。CPU你可以分片调度内存你可以做影子页表IO你可以走virtio队列但时间这玩意儿有个非常不讲理的性质它压根不在物理机上真实存在却又要求guest感知到的时间与真实世界保持同步。先看裸机上的时间是怎么工作的。x86上有个TSCTime Stamp Counter寄存器每个时钟周期递增一次应用程序可以用rdtsc指令直接读还有个PITProgrammable Interval Timer、HPETHigh Precision Event Timer这类外设用来触发周期性的时钟中断。操作系统拿这些硬件当心跳一边靠中断节拍驱动进程调度一边靠计数寄存器推算墙上时钟wall clock和单调时钟monotonic clock。到了虚拟化环境麻烦就来了。假设一台物理机上有4个vCPU每个vCPU对应一个物理核而物理核上的TSC频率是固定的。guest里的操作系统跑着跑着突然发现自己的节拍慢了或者快了又或者读取到的时间戳出现了严重的非线性跳变。典型的问题是频率不一致物理CPU的TSC频率和guest期望的基准频率不同guest按自己校准过的频率去换算纳秒算出来全是错的。多核不同步如果vCPU被调度到不同的物理核上而这些核之间TSC没有做同步校准guest在不同vCPU上读到的时间基准不一致锁竞争和定时逻辑全部乱套。迁移导致跳变虚拟机从一台物理机热迁移到另一台如果两台机器TSC频率不同guest时间会突然往前跳或者往后倒NTP还能救但内核里的hrtimer会直接崩掉。暂停与恢复物理机休眠或者VM被suspend的时候TSC停止增长guest里时间停滞恢复后所有定时器堆积在一起触发造成时间风暴。Xvisor作为一类轻量级虚拟化方案Type-1 hypervisor同样绕不开这些问题。但它的设计思路和x86上常见的KVM很不一样因为Xvisor从一开始就面向嵌入式场景资源受限、CPU频率动态变化、guest寡而精这些约束决定了它的时间虚拟化方案必须做得既简单又足够准确。
返回列表