AWS 工程师一直在努力改进 Linux 内核中 KVM 的 VMX 代码,以增强处理嵌套虚拟机时的非管理 来宾 内存。改进后的代码解决了某些正确性问题,同时在合成基准测试中提供了显著的性能提升。
周五,Amazon/AWS 工程师 Fred Griffoul 发布了最新的 KVM nVMX 代码补丁,以提升非管理 来宾 内存性能。Fred 解释了当前代码的问题以及所做的改进:
这个补丁系列解决了嵌套 VMX 在处理客户内存时存在的性能和正确性问题。
在嵌套 VMX 操作期间,L0(KVM)访问特定的 L1 客户页面以管理 L2 执行。这些页面分为两类:仅由 L0 访问的页面(如 L1 MSR 位图页面或 eVMCS 页面),以及通过 vmcs02 传递给 L2 客户的页面(如 APIC 访问、虚拟 APIC 和发布中断描述符页面)。
当前实现使用 kvm_vcpu_map/unmap,这导致了两个问题。
首先,当前方法在关键场景中缺少正确的无效化处理。当 memslots 被修改时,启发式 VMCS(eVMCS)页面可能会变得过时,因为没有机制来无效化缓存的映射。类似地,APIC 访问和虚拟 APIC 页面可能会被主机迁移,但如果没有通过 mmu_notifier 回调进行适当的通知,映射会变得无效,并可能导致不正确的行为。
其次,对于非管理态客户内存(如未直接由内核映射的内存,例如通过 mem=参数传递的内存或非 CoCo VM 的 guest_memfd),此工作流程在每次 L2 VM 进入/退出周期中都会调用昂贵的 memremap/memunmap 操作。这会产生显著的额外开销,影响嵌套虚拟化性能。
这一系列将 kvm_host_map 替换为 nested VMX 中的 gfn_to_pfn_cache。pfncache 基础设施在页面全局地址(GPA)不发生变化时保持持久映射,从而消除了每次 VM 进入/退出周期中的 memremap/memunmap 额外开销。此外,pfncache 通过 mmu_notifier 回调和 memslots 生成检查提供正确的失效处理,确保在 memslot 更新和页面迁移事件期间映射能够正确更新。
最终结果相当惊人,通过合成微基准测试展示了非管理态客户内存的 nested VMX 操作性能提升。使用 AWS EC2 Nitro 实例,其合成微基准测试显示内存映射性能约为 17 倍更快,解映射分块性能约为 2014 倍更快,解映射操作性能提升约2353倍”!

对这方面感兴趣的人可以在 Linux 内核邮件列表上找到这个待处理的补丁系列。
转自 Linux Patches Improve Intel Nested VM Memory Performance Up To ~2353x In Synthetic Test – Phoronix
Linuxeden开源社区