计算虚拟化 应用现代化

为什么虚机可以跑得比裸机还快

VMworld 2019 大会上 VMware 发布了 Project Pacific,让 vSphere 虚拟化平台原生支持 Kubernetes,在 ESXi hypervisor 上直接运行 Kubernetes Pod (称之为 vSphere Native Pod),并且性能可以超过裸机 8%。这可能有悖于大家对于虚拟化技术的一贯印象:虚拟化不是比裸机多了一层,会有一些额外的性能损耗吗?要回答这一问题,首先要介绍一下现代服务器的体系架构 NUMA。

现代服务器的 NUMA 架构

NUMA 的全称是 Non-Uniform Memory Access (非一致性内存访问),它是由 UMA (Uniform Memory Access,一致性内存访问) 技术发展而来的,UMA 和 NUMA 都是构建多处理器服务器的基础架构。在 UMA 架构中,服务器中的多个 CPU 通过一个集中的内存控制器 (Memory Controller) 来统一访问所有的内存,这可以有效地避免多个 CPU 对于内存访问的竞争和冲突。但是内存控制器很容易成为整个系统的性能瓶颈,当一个 CPU 通过它访问内存时,其他的 CPU 只能在旁边等待;当系统中的 CPU 数量越来越多时,这个瓶颈很快就会把增加 CPU 所带来的性能提升抵消掉。

 一致性内存访问 (Uniform Memory Access)

随着 CPU 性能的不断提高,UMA 架构阻碍了服务器性能的进一步提升,所以又提出了 NUMA 架构,把内存控制器集成在 CPU 内部,由 CPU 来直接管理和访问内存。Intel 从 Nehalem (2007年) 处理器开始把内存控制器集成在 CPU 内部,这样内存就从 CPU 的总线来访问了,性能大大提高;但是内存从集中管理变成了由各个 CPU 来分别管理。CPU 对于自己所控制的本地内存可以直接访问,访问速度是最快的;对于连接在其他 CPU 上的异地内存则需要通过 CPU 之间的 Ultra Path Interconnect Link 总线 (这种总线以前也叫 QPI – Quick Path Interconnect) 来间接访问,访问速度有所降低。

非一致性内存访问 (Non-Uniform Memory Access)

vSphere 针对 NUMA 的优化

通过 NUMA 架构的内存访问原理我们可以看到,在 CPU 上运行软件的时候,要尽量让 CPU 访问本地内存,这样有助于提高系统性能。这就要求操作系统针对 NUMA 架构优化对进程调度,把同一个进程和需要共享内存的进程尽量放在同一个 CPU 上来运行,vSphere 就是利用这一原理来进行性能优化的。

Project Pacific 针对 NUMA 的优化

Project Pacific 在 vSphere 环境中增加了一种 ESXi 原生的容器运行时环境 CRX (Container Runtime for ESXi ),CRX 是一种轻量级的虚机,其中仅包含 Linux 内核和必要的容器运行环境,Pod 就运行在 CRX 虚机中。大家知道一个 Pod 中会容纳多个容器进程,vSphere 会把这几个进程都调度在同一个 CPU 上运行,使得这几个进程都可以通过本地内存来进行数据交换。 在性能测试中,我们发现 vSphere Native Pod 比物理服务器还要快上 8% (详情请阅读博文 How Does Project Pacific Deliver 8% Better Performance Than Bare Metal? )。

vSphere 针对 Big Data 环境的优化

同样的,针对大数据应用场景,vSphere 也有一系列地针对 NUMA 架构的优化措施,详情可参见技术白皮书“Big Data Performance on vSphere 6”。在测试环境中,我们发现在 TeraSort Suite、TestDFSIO、Spark Support Vector Machine 等多个计算场景下,跟物理平台上的性能相比,vSphere 虚拟化环境取得了更好的成绩。

当然,这种针对 NUMA 架构优化而取得的性能提升还是比较小的,很多人可能并不会在意这些微小的性能差异。重要的是,我们要看到 vSphere 虚拟化环境可以达到跟物理机环境一致的性能水平,在某些情况下甚至可以比裸机做得更好。对于应用在 vSphere 虚拟化平台上运行,不必纠结于性能损失方面的担心。