Proxmox 和 VMware 提供相互竞争的虚拟化平台。Proxmox 是一款利用 QEMU 和 KVM 的 开源产品。VMware ESXi 是一款基于专有软件构建的商业产品。
本技术说明比较了 Proxmox VE 7.2 和 VMware ESXi 7.0 Update 3c 对于存储主导型应用程序的性能。实验是在中度到重度负载下运行的相同硬件配置上进行的。测试重点关注 32 个并发活动虚拟机的聚合存储性能。
我们的测试系统是 Dell PowerEdge R7515,配备 AMD EPYC 7452 32 核处理器和 Mellanox 100Gbit 网络。服务器配置为双引导:Proxmox 7.2 和 ESXi 7.0 Update 3c。存储使用 NVMe/TCP 连接网络。后端存储软件是 Blockbridge 6。
该测试床由在单个主机上运行的 32 个 Ubuntu 虚拟机组成,每个虚拟机配置有四个虚拟 CPU。每个虚拟机都附加一个虚拟磁盘以进行测试。每个虚拟机作为一个 fio 工作者运行;测试在所有 32 个虚拟机上同时执行。对于每个队列深度和块大小,都会收集一个数据点,该数据点表示紧随 1 分钟预热期之后的 20 分钟间隔内的平均性能。
您可以在此处查看我们的调查结果/TLDR,并在此处查看我们的原始基准数据。
VMware 通过虚拟化 SCSI、SATA 或 NVMe 控制器向来宾提供存储。通常,存储是使用 VMware 准虚拟 SCSI 适配器提供的虚拟 SCSI 磁盘。与这些虚拟磁盘关联的后备存储通常是存储在称为 VMFS 的专用集群文件系统上的文件。VFMS 提供存储管理功能,包括精简配置、快照和集群移动性。
注意:VVOL 和原始设备映射提供更直接的路径,但 NVMeOF 设备不支持。
下图说明了来宾发出的 I/O 流程。请注意,现有的存储堆栈主要以 SCSI 为中心。NVMe 设备使用薄 SCSI 虚拟化层(图中称为“垫片”)来适应此模型。
GUEST
│ ┌────────┐
│ │ PVSCSI │
│ │ DRIVER │
▼ └┬───────┘
KERNEL │
│ ┌▼───────┐ ┌────────┐ ┌─────────┐ ┌────────┐
│ │ PVSCSI ├──► VMFS ├──► I/O ├──► SCSI │
│ │ DEVICE │ │ │ │ SCHED │ │ DISK │
│ └────────┘ └────────┘ └─────────┘ └┬───────┘
│ │
│ ┌▼───────┐ ┌────────┐ ┌────────┐
│ │ HPP ├──► SCSI ├──► NVME │
│ │ │ │ PATH │ │ SHIM │
│ └────────┘ └────────┘ └┬───────┘
│ │
│ ┌▼───────┐ ┌────────┐
│ │ NVME ├──► NVME │
│ │ CORE │ │ TCP │
▼ └────────┘ └────────┘
我们的经验表明,集中式 I/O 调度程序是一个重要的瓶颈和延迟来源。幸运的是,NVMe/TCP 默认使用更新的“高性能插件”(即 HPP)。只要后端存储保持快速,HPP 插件就允许来宾 I/O 绕过调度程序。
提示:绕过 I/O 调度程序的延迟阈值配置如下:esxcli storage core device latencythreshold set -t [value in milliseconds]。更多信息请点击此处
Proxmox 通常将存储作为连接到使用 virtio-scsi 实现的虚拟 SCSI 控制器的虚拟化 SCSI 设备提供给来宾。当与网络附加存储一起使用时,来宾的虚拟 SCSI 设备由本机 Linux 块设备支持;Proxmox 中没有中间集群文件系统层。自动精简配置、快照、加密和高可用性是由网络附加存储实现的。
下图说明了来宾发出的 I/O 流程。请注意,Proxmox 和 VMware 之间的调度域明显不同。Proxmox 为各个设备调度 I/O,NVMe 设备使用 Linux no-op 调度程序。VMware 为竞争的虚拟机调度 I/O,试图协调物理设备 I/O 排队功能的有效使用。
注意:我们非常小心地确保聚合队列深度不是性能的限制因素。
GUEST
│ ┌─────────────┐
│ │ VIRTIO-SCSI │
│ │ DRIVER │
▼ └┬────────────┘
QEMU │
│ ┌▼────────────┐ ┌─────────┐
│ │ VIRTIO-SCSI ├───► ASYNC │
│ │ DEVICE │ │ I/O │
▼ └─────────────┘ └┬────────┘
KERNEL │
│ ┌▼────────┐ ┌─────────┐
│ │ BLOCK ├──► SCHED │
│ │ LAYER │ │ NOOP │
│ └─────────┘ └┬────────┘
│ │
│ ┌▼────────┐ ┌─────────┐
│ │ NVME ├──► NVME │
│ │ CORE │ │ TCP │
▼ └─────────┘ └─────────┘
Proxmox VE 在 57 项测试中的 56 项中击败了 VMware ESXi,IOPS 性能提升了近 50%。在具有较大队列深度和较小 I/O 大小的各个测试用例中,峰值增益超过 70%。
下图显示了每个队列深度的百分比增益(跨块大小的平均值)。例如,数据点 QD=128 是在队列深度为 128 时针对 0.5KiB、4KiB、8KiB、16KiB、32KiB、64KiB 和 128KiB 块大小测量的平均增益。该图显示了 48.9% 的平均性能优势 Proxmox 的青睐。
Proxmox VE 将延迟减少了 30% 以上,同时提供了更高的 IOPS,在 57 项测试中的 56 项中击败了 VMware。
下图显示了每个队列深度的延迟减少(跨块大小的平均值)。例如,数据点 QD=128 是队列深度为 128 时 0.5KiB、4KiB、8KiB、16KiB、32KiB、64KiB 和 128KiB 块大小的延迟平均减少量。该图显示 32.6% 的性能优势有利于普罗克斯莫克斯。
在峰值负载条件下,Proxmox 的带宽比 VMware ESXi 高出 38%:Proxmox 的带宽为 12.8GB/s,而 VMware ESXi 的带宽为 9.3GB/s。
注意:进一步调查表明 VMware ESXi 难以维持高带宽存储网络。性能问题可能与动态接收端扩展(即 RSS)的交互、网络中断的定期重新平衡以及为 NVMe 实现的路径选择策略的行为有关。
以下 IOPS 图表绘制了 Proxmox VE 和 VMware ESXi 的相对性能。每个图表显示了以固定块大小运行的八个不同队列深度的平均 IOPS 结果。显示了七种块大小的结果,包括 0.5K、4K、8K、16K、32K、64K 和 128K。IOPS 结果越高越好。
以下延迟图表绘制了 Proxmox VE 和 VMware IOPS 测试期间测得的平均 I/O 延迟。每个图表显示了在固定块大小下运行的八个队列深度的平均延迟。显示了七种块大小的结果,包括 0.5K、4K、8K、16K、32K、64K 和 128K。延迟越低越好。
提示:直接比较在不同 IOPS 性能水平下运行时的延迟可能会产生误导。
带宽图表绘制了 Proxmox VE 和 VMware IOPS 测试期间测得的平均数据吞吐量。每个图表显示了以固定块大小运行的八个队列深度的平均带宽。显示了七种块大小的结果,包括 0.5K、4K、8K、16K、32K、64K 和 128K。带宽越高越好。
提示:由于块大小是固定的,带宽应与 IOPS 直接相关!带宽 = IOPS * 队列深度