{T}

虚拟化关键技术浅析(NUMA、dpdk、绑核)

0. 引言

理解虚拟化技术原理有助于更合理地应用虚拟化:从软件虚拟化到硬件虚拟化再到容器化,性能与成本不断优化。本文重点讲解计算资源虚拟化的核心原理,以及 NUMA、CPU 绑核等关键优化技术。

1. 虚拟化技术演变

  • 软件系统层虚拟化:早期实现,如 2000 年前诞生的 VirtualBox,性能开销大;
  • 硬件层虚拟化:硬件承担部分虚拟化工作,KVM 是典型的开源实践;
  • 轻量级虚拟化:Docker、早期 LXC,相比纯主机虚拟更轻量,易于发布管理与迁移,是当前主流。

虚拟化中的关键技术包括:资源虚拟化、NUMA、CPU 绑核、资源隔离、虚拟机热迁移等。

2. 资源虚拟化

资源虚拟化覆盖 CPU、内存、IO、网络、磁盘、GPU 六个维度,其中最重要的基础是计算资源(CPU)虚拟化。

2.1 CPU 虚拟化原理

Linux 进程运行级别分为用户态与内核态,CPU 指令级别通过 Ring 级别访问控制,共 4 层:Ring0 权限最大(内核态),Ring3 权限最小(用户态)。应用执行特权指令(如访问磁盘、写文件)时,通过中断或异常从 Ring3 切换到 Ring0,跳转到系统调用对应的内核代码执行。

在底层系统再加一层虚拟机的层次关系为:硬件层 → 物理机系统 → 虚拟机管理软件 VMM → 虚拟主机系统 → 虚拟主机应用。虚拟机应用执行特权指令时的切换方式,决定了虚拟化的性能。

2.2 CPU 全虚拟化

CPU 全虚拟化原理

内核态 Ring0 运行 VMM 软件,负责特权指令集翻译。虚拟机 OS 在 Ring1,应用执行特权指令时先发给虚拟机 OS,触发异常后由 VMM 捕获并做翻译模拟再返回。一条指令需要多次转发,性能差。早期 Vmware、VirtualBox 均基于此方式。

2.3 CPU 半虚拟化

虚拟机 OS 移到 Ring0,封装 Hypervisor 层。需要修改操作系统内核,用 Hypercall 直接与底层 Hypervisor 通信,省去捕获和模拟,效率大幅提高。缺点:虚拟机 OS 必须做内核改造,早期 Xen 只能支持 Linux 虚拟机,无法支持 Windows,存在兼容性局限。

2.4 CPU 硬件虚拟化

Intel 引入 Intel-VT 虚拟化指令集,CPU 提供 VMX root operation 与 VMX non-root operation 两种模式,各自带一套 Ring0-3 权限级别。VMM 运行在 root 模式,客户 OS 运行在 non-root 模式,两种模式可互相转换。依赖硬件支持的虚拟化应用广泛、性能出众。

3. NUMA 虚拟化技术

早期 CPU 架构中,CPU 访问内存都要通过北桥芯片,核数增加后冲突严重,于是把内存绑定到不同 CPU 的寄存器上。多核物理服务器下,内存控制器拆分到不同 CPU,导致 CPU 访问非本地内存(Remote)比访问本地内存慢约 10%。

NUMA 内存访问模型

软件层使用 NUMA 技术避免跨 NUMA 调用:虚拟机装箱时根据虚拟 CPU 与内存的调用关系提前分配,尽量让虚拟机 CPU 落在同一 NUMA 节点。装箱算法遵循两点:

  • 物理 CPU 虚拟核数足够时,尽量把虚拟机 CPU 放到单个物理 CPU 上;
  • 物理 CPU 核数不足时,尽量在物理 CPU 间均分。

同时尽量把 NUMA 信息透传给虚拟机,帮助应用层做 NUMA 绑定优化(DBA 优化 MySQL 时常考虑 NUMA 配置)。

4. CPU 绑核

与 Nginx 优化中的 CPU 亲和性同理:让虚拟机 VCPU 固定绑定到底层虚拟化服务的固定线程(物理 CPU)上,实现一对一绑定。好处是避免其他虚拟机争抢 VCPU 资源,也避免 CPU 来回切换的开销,是虚拟机性能优化的常规设置。

5. 小结

虚拟化演进主线是"软件模拟 → 半虚拟化 → 硬件辅助":全虚拟化靠 VMM 翻译指令、性能差;半虚拟化靠 Hypercall 直通但要求 OS 改造;硬件虚拟化(Intel-VT)由 CPU 提供双模式支持,成为主流。性能优化上,NUMA 解决跨节点内存访问慢 10% 的问题(装箱时尽量同节点),绑核解决 VCPU 争抢与切换开销。对运维而言,理解这些原理是做好虚拟化选型与性能调优的前提。

下一章分析 Anycast 的应用程度与场景,看网络层就近接入如何提升访问速度与容灾能力。