Hotdry.
systems

AWS Nitro 硬件辅助嵌套虚拟化:KVM 资源隔离、性能开销与热迁移设计

深入分析 AWS Nitro 系统基于硬件的嵌套虚拟化实现,聚焦 KVM 资源隔离机制、VMCS Shadowing/EPT/Posted Interrupts 性能开销量化,以及热迁移兼容性设计与工程化参数配置。

AWS Nitro 系统代表了云计算虚拟化架构的一次根本性变革。与传统基于 Xen 或完整 KVM/QEMU 栈的虚拟化方案不同,Nitro 将虚拟化职责卸载到专用硬件,仅保留极简的 Hypervisor 负责核心资源分区。这种设计不仅为常规 EC2 实例带来了接近裸金属的性能,更在嵌套虚拟化场景下展现了独特的技术优势与工程挑战。

Nitro 架构:硬件辅助的虚拟化卸载

Nitro 系统由三个核心组件构成:专用 Nitro 卡、Nitro 安全芯片和 Nitro Hypervisor。其中,Nitro 卡作为独立的硬件模块,承载了网络(ENA)、存储(EBS/NVMe)和系统管理功能;Nitro 安全芯片扩展硬件信任链至主板组件;而 Nitro Hypervisor 则是一个基于 KVM 但极度精简的管理程序。

关键设计在于,Nitro Hypervisor 刻意剔除了网络栈、文件系统、设备驱动等传统 Hypervisor 组件。它仅保留两项核心职责:通过硬件虚拟化扩展(Intel VT-x/AMD-V)进行 CPU 和内存资源分区,以及通过 SR-IOV 将 Nitro 卡提供的虚拟功能(VF)直接分配给客户虚拟机。这种 “最小可行 Hypervisor” 哲学大幅减少了攻击面,同时为嵌套虚拟化奠定了性能基础。

嵌套虚拟化的硬件加速机制

在 Nitro 裸金属实例(如 i3.metal、m5.metal)上,客户获得的是完整的物理服务器访问权,包括硬件虚拟化扩展。这使得在实例内部运行 KVM、Xen 或 ESXi 等 Hypervisor 成为可能。Nitro 通过三项关键技术实现了高效的嵌套虚拟化支持:

1. VMCS Shadowing:寄存器缓存与边界监控

VMCS(Virtual Machine Control Structure)是 Intel VT-x 架构中控制虚拟机行为的关键寄存器集合。VMCS Shadowing 允许第一层 Hypervisor(Nitro)将第二层及更深层 Hypervisor 的 VMCS 副本缓存在硬件中。只有当嵌套 Hypervisor 尝试修改敏感寄存器或越界访问时,Nitro 才会介入。这种 “写时复制” 机制使得绝大多数 VM-entry/exit 操作完全绕过外层 Hypervisor,将嵌套虚拟化的 CPU 开销降至近乎为零。

2. EPT(Extended Page Tables):内存映射的硬件加速

EPT 实现了第二层地址转换的硬件加速。Nitro 为裸金属实例建立初始的 EPT 映射后,实例内部的 Hypervisor 可以自主管理其客户虚拟机的页表。只要嵌套 Hypervisor 的映射不超出 Nitro 分配的物理内存边界,内存访问就无需 Hypervisor 干预。实测表明,启用 EPT 后嵌套虚拟机的内存性能相比软件模拟提升两个数量级。

3. Posted Interrupts:中断的直接投递

对于分配给虚拟机的 PCIe 设备(如 Nitro 卡提供的网络和存储 VF),Posted Interrupts 机制允许硬件中断直接投递到目标虚拟 CPU,无需经过 Hypervisor 的中断处理路径。这在嵌套场景下尤为重要,避免了中断处理开销的层层累积。

性能开销量化与资源过载极限

Two Six Technologies 在 2018 年进行的极限测试提供了宝贵的数据点。他们在单个 i3.metal 实例(36 物理核心 / 72 线程)上成功运行了 6,417 个 KVM 虚拟机,远超团队最初约 2,000 个的悲观估计。每个虚拟机配置 1GB 内存和 1GB 存储,使用 virtio 虚拟设备。

关键发现包括:

  • CPU 过载能力:系统在 10:1 的虚拟 CPU 与物理 CPU 超配比下稳定运行,调度器等待时间分布集中(约 70% 的进程等待时间在 15 微秒以内)。
  • 内存共享效率:通过内核同页合并(KSM)技术,系统能够主动扫描并合并重复内存页,实现内存的超量分配。
  • 资源监控:使用 eBPF/BCC 工具集(如 runqlat.py)能够精确测量调度延迟分布,这是判断系统负载健康度的关键指标。

然而,该测试主要聚焦 CPU 和内存,未充分验证 I/O 密集型负载下的表现。在实际生产环境中,网络和存储 I/O 可能成为瓶颈,尤其是当嵌套虚拟机同时访问共享的 Nitro 卡虚拟功能时。

热迁移兼容性设计挑战

嵌套虚拟化环境下的热迁移涉及两个层面:迁移运行嵌套 Hypervisor 的 L1 虚拟机,以及迁移嵌套 Hypervisor 内部的 L2 虚拟机。

L1 虚拟机迁移

从外层 Hypervisor(Nitro)视角看,迁移一个运行着嵌套 KVM 的 L1 虚拟机与迁移任何大型繁忙虚拟机类似。挑战在于:

  • 内存脏页率:嵌套虚拟机活动会增加 L1 虚拟机的内存修改频率,可能影响迁移收敛时间。
  • 设备状态同步:直接分配的 SR-IOV VF 设备状态迁移复杂,通常需要客户机内协作或短暂停机。

L2 虚拟机迁移

在客户自管的 KVM 集群内迁移 L2 虚拟机,技术上与本地环境一致,但需确保:

  • CPU 特性一致性:源和目标宿主机的 CPU 特性集必须兼容,使用 host-passthrough 模式时尤其敏感。
  • 存储可访问性:L2 虚拟机的磁盘映像需在源和目标 L1 主机间共享或可快速复制。

AWS 特定约束包括:

  • 嵌套虚拟化支持因实例类型而异,需查阅最新文档确认。
  • 某些维护事件或实例类型迁移可能影响嵌套 Hypervisor 的运行连续性。

工程化参数配置清单

基于上述分析,为在 Nitro 上部署生产级嵌套 KVM 环境,建议以下配置要点:

1. 实例选择与基础配置

  • 优先选择 Nitro 裸金属实例(后缀为 .metal)以获得完整的硬件虚拟化扩展。
  • 确认目标实例类型在 AWS 文档中明确支持嵌套虚拟化(部分新型号非裸金属实例也已支持)。
  • 启用嵌套支持:modprobe kvm_intel nested=1modprobe kvm_amd nested=1,并持久化配置。

2. KVM 层优化参数

  • CPU 模式:使用 host-passthrough 暴露真实 CPU 特性给 L2 虚拟机。
  • 内存管理:启用 KSM(echo 1 > /sys/kernel/mm/ksm/run)并监控共享率。
  • 调度绑定:利用 numactltaskset 将关键虚拟机绑定到特定 NUMA 节点,减少跨节点访问延迟。

3. 监控与可观测性

  • 部署 eBPF/BCC 工具集,定期采集 runqlatcpudistmemleak 等指标。
  • 为嵌套虚拟机建立独立于宿主机的监控通道,避免监控流量加剧资源竞争。
  • 设置基于调度延迟和内存脏页率的迁移触发阈值。

4. 迁移就绪检查清单

  • 验证源和目标主机的 CPU 特性兼容性(可通过 /proc/cpuinfolscpu 对比)。
  • 确保共享存储(如 EFS 或第三方解决方案)在 L1 主机间可访问且延迟可接受。
  • 对关键工作负载进行迁移演练,测量实际停机时间与业务影响。

结论

AWS Nitro 的硬件辅助虚拟化架构为嵌套 KVM 提供了接近原生的性能基础,通过 VMCS Shadowing、EPT 和 Posted Interrupts 等技术极大削减了传统嵌套虚拟化的性能开销。极限测试表明,在 CPU 和内存维度上,系统具备惊人的资源过载能力。然而,生产部署需谨慎评估 I/O 瓶颈与热迁移兼容性,并建立相应的监控与迁移就绪机制。随着 AWS 在更多实例类型上扩展嵌套虚拟化支持,这一技术栈有望成为构建云原生虚拟化平台、开发测试环境隔离和多租户 SaaS 基础设施的重要基石。

资料来源

  1. AWS 官方文档:The components of the Nitro System
  2. Two Six Technologies 博客:Running Thousands of KVM Guests on Amazon's new i3.metal Instances
  3. AWS 嵌套虚拟化支持与热迁移相关技术讨论
查看归档