背景
X86 PC体系架构中的中断控制器,早先是8259A,现在更普遍使用的是APIC,他们处理中断的流程遵循如下流程:
-
- 外部设备产生一个中断,如果该中断没有被屏蔽掉,中断控制器将IRR寄存器中相应的位置1,表示收到中断,但是还未提交给CPU处理;
- 中断控制器将该中断提交给CPU,CPU收到中断请求后,会应答中断控制器;
- 中断控制器收到CPU的中断应答后,将IRR寄存器中相应的位清0,并将ISR寄存器相应的位置1,表示CPU正在处理该中断;
- 当该中断的处理程序结束以前,需要将中断控制器的EOI寄存器对应的位置1, 表示CPU完成了对该中断的处理;
- 中断控制器收到EOI后,ISR寄存器中相应的位清0,允许下次中断;
在虚拟化场景中,该流程至少会导致两次VM Exit: 第一次是VMM截获到设备中断的时候,通知客户机退出,将这个中断注入到客户机中;另外一次是当客户机操作系统处理完该中断后,写中断控制器的EOI寄存器,这是个MMIO操作,也会导致客户机退出。在一个外部IO比较频繁的场景中,外部中断会导致大量的VM Exit, 影响客户机的整体性能。
原理
PV-EOI其实就是通过半虚拟化的办法来优化上述的VM Exit影响,virtio也是使用这个思想来优化网络和磁盘;就EOI的优化来说,其思想本质上很简单:
-
- 客户机和VMM协商,首先确定双方是否都能支持PV-EOI特性,如果成功,则进一步协商一块2 bytes的内存区间作为双方处理EOI的共享缓存;
- 在VMM向客户机注入中断之前,会把缓存的最低位置1,表示客户机不需要通过写EOI寄存器;
- 客户机在写EOI之前,如果发现该位被设置,则将该位清0;VMM轮询这个标志位,当检查到清0后,会更新模拟中断控制器中的EOI寄存器;如果客户机发现该位未被设置,则继续使用MMIO或者MSR写EOI寄存器;

KVM的Paravirtualized End-of-Interrupt Indication (PV-EOI)通过半虚拟化减少虚拟机退出,提高性能。在传统的中断处理流程中,写EOI寄存器会导致VM Exit,而PV-EOI使用共享内存来避免这一情况,降低了中断处理的开销。PV-EOI自Linux 3.6和QEMU 1.2开始支持,适用于Linux客户机,但不适用于Windows。
最低0.47元/天 解锁文章
11

被折叠的 条评论
为什么被折叠?



