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=1或modprobe kvm_amd nested=1,并持久化配置。
2. KVM 层优化参数
- CPU 模式:使用
host-passthrough暴露真实 CPU 特性给 L2 虚拟机。 - 内存管理:启用 KSM(
echo 1 > /sys/kernel/mm/ksm/run)并监控共享率。 - 调度绑定:利用
numactl或taskset将关键虚拟机绑定到特定 NUMA 节点,减少跨节点访问延迟。
3. 监控与可观测性
- 部署 eBPF/BCC 工具集,定期采集
runqlat、cpudist、memleak等指标。 - 为嵌套虚拟机建立独立于宿主机的监控通道,避免监控流量加剧资源竞争。
- 设置基于调度延迟和内存脏页率的迁移触发阈值。
4. 迁移就绪检查清单
- 验证源和目标主机的 CPU 特性兼容性(可通过
/proc/cpuinfo或lscpu对比)。 - 确保共享存储(如 EFS 或第三方解决方案)在 L1 主机间可访问且延迟可接受。
- 对关键工作负载进行迁移演练,测量实际停机时间与业务影响。
结论
AWS Nitro 的硬件辅助虚拟化架构为嵌套 KVM 提供了接近原生的性能基础,通过 VMCS Shadowing、EPT 和 Posted Interrupts 等技术极大削减了传统嵌套虚拟化的性能开销。极限测试表明,在 CPU 和内存维度上,系统具备惊人的资源过载能力。然而,生产部署需谨慎评估 I/O 瓶颈与热迁移兼容性,并建立相应的监控与迁移就绪机制。随着 AWS 在更多实例类型上扩展嵌套虚拟化支持,这一技术栈有望成为构建云原生虚拟化平台、开发测试环境隔离和多租户 SaaS 基础设施的重要基石。
资料来源
- AWS 官方文档:The components of the Nitro System
- Two Six Technologies 博客:Running Thousands of KVM Guests on Amazon's new i3.metal Instances
- AWS 嵌套虚拟化支持与热迁移相关技术讨论