理解虚拟化技术原理有助于更合理地应用虚拟化:从软件虚拟化到硬件虚拟化再到容器化,性能与成本不断优化。本文重点讲解计算资源虚拟化的核心原理,以及 NUMA、CPU 绑核等关键优化技术。
虚拟化中的关键技术包括:资源虚拟化、NUMA、CPU 绑核、资源隔离、虚拟机热迁移等。
资源虚拟化覆盖 CPU、内存、IO、网络、磁盘、GPU 六个维度,其中最重要的基础是计算资源(CPU)虚拟化。
Linux 进程运行级别分为用户态与内核态,CPU 指令级别通过 Ring 级别访问控制,共 4 层:Ring0 权限最大(内核态),Ring3 权限最小(用户态)。应用执行特权指令(如访问磁盘、写文件)时,通过中断或异常从 Ring3 切换到 Ring0,跳转到系统调用对应的内核代码执行。
在底层系统再加一层虚拟机的层次关系为:硬件层 → 物理机系统 → 虚拟机管理软件 VMM → 虚拟主机系统 → 虚拟主机应用。虚拟机应用执行特权指令时的切换方式,决定了虚拟化的性能。

内核态 Ring0 运行 VMM 软件,负责特权指令集翻译。虚拟机 OS 在 Ring1,应用执行特权指令时先发给虚拟机 OS,触发异常后由 VMM 捕获并做翻译模拟再返回。一条指令需要多次转发,性能差。早期 VMware、VirtualBox 均基于此方式。
虚拟机 OS 移到 Ring0,封装 Hypervisor 层。需要修改操作系统内核,用 Hypercall 直接与底层 Hypervisor 通信,省去捕获和模拟,效率大幅提高。缺点:虚拟机 OS 必须做内核改造,早期 Xen 只能支持 Linux 虚拟机,无法支持 Windows,存在兼容性局限。
Intel 引入 Intel-VT 虚拟化指令集,CPU 提供 VMX root operation 与 VMX non-root operation 两种模式,各自带一套 Ring0-3 权限级别。VMM 运行在 root 模式,客户 OS 运行在 non-root 模式,两种模式可互相转换。依赖硬件支持的虚拟化应用广泛、性能出众。
早期 CPU 架构中,CPU 访问内存都要通过北桥芯片,核数增加后冲突严重,于是把内存控制器与内存拆分绑定到不同 CPU 上。多核物理服务器下,内存控制器拆分到不同 CPU,导致 CPU 访问非本地内存(Remote)比访问本地内存慢约 10%。

软件层使用 NUMA 技术避免跨 NUMA 调用:虚拟机装箱时根据虚拟 CPU 与内存的调用关系提前分配,尽量让虚拟机 CPU 落在同一 NUMA 节点。装箱算法遵循两点:
同时尽量把 NUMA 信息透传给虚拟机,帮助应用层做 NUMA 绑定优化(DBA 优化 MySQL 时常考虑 NUMA 配置)。
与 Nginx 优化中的 CPU 亲和性同理:让虚拟机 VCPU 固定绑定到底层虚拟化服务的固定线程(物理 CPU)上,实现一对一绑定。好处是避免其他虚拟机争抢 VCPU 资源,也避免 CPU 来回切换的开销,是虚拟机性能优化的常规设置。
虚拟化演进主线是"软件模拟 → 半虚拟化 → 硬件辅助":全虚拟化靠 VMM 翻译指令、性能差;半虚拟化靠 Hypercall 直通但要求 OS 改造;硬件虚拟化(Intel-VT)由 CPU 提供双模式支持,成为主流。性能优化上,NUMA 解决跨节点内存访问慢 10% 的问题(装箱时尽量同节点),绑核解决 VCPU 争抢与切换开销。对运维而言,理解这些原理是做好虚拟化选型与性能调优的前提。
下一章分析 Anycast 的应用程度与场景,看网络层就近接入如何提升访问速度与容灾能力。