感谢intel的vt-x技术,让虚拟机大部分指令可以直接运行在CPU中,只有少部分敏感指令需要有VMM来模拟执行。其中,每个CPU的LAPIC接收到的中断是虚拟化的开销一个大头。
LAPIC接收到的中断分为外部中断,内部中断,IPI中断:
可见,目前公有云中,中断虚拟化中性能瓶颈点落在了IPI中断中。
虚拟机中IPI中断开销到底多大?我们可以写一个内核模块来定量分析,可以利用内核中的smp_call_function_single()和smp_call_function_many()函数,来测量IPI性能。
在我的测试环境中,物理机采用的是Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 2路共80超线程的CPU。虚拟机运行在KVM上的72核CentOS系统。
虚拟机默认配置
| IPI类型 |
100000次IPI耗时(ns) |
|---|---|
| 发给所有CPU |
15601355147 |
| 发给同NUMA的一个CPU |
230063725 |
| 发给跨NUMA的一个CPU |
665893155 |