我正在尝试在 ESXi 上的虚拟机中运行应用程序。该应用程序运行一个高度延迟敏感的线程。它以紧密轮询模式运行,几乎总是以 99.9% 的 CPU 运行,这是意料之中的。
虚拟机和服务器的详细信息:
Number of vCPUs allocated to the VM: 36
Number of sockets: 2
Number of cores per socket: 10
Total number of logical CPUs on the server: 40
Hyper threading : Enabeld
ESXi version: 6.50
如果在 VM 上没有运行其他任何内容,则没有问题。但是,如果我在 VM 上运行其他消耗 CPU 的应用程序,我之前谈到的线程开始获得更少的 CPU 周期。我已经通过添加一些计算的计数器来验证这一点rdtsc()
在 KVM 上,这可以通过以下方式解决:
- 将 vCPU 固定到物理 CPU
virsh vcpupin <domain> ...
- 将应用程序固定在 VM 上以在特定 vCPU 上运行
ESX CPU 调度程序如何工作?有没有办法将 vCPU 映射到 ESXi 上的物理 CPU?
当我在主机上监控esxtop
时,我看到占用 99.9% CPU 的线程并不总是在同一个内核上运行。它不断围绕不同的核心移动。有几次,我看到它与其他 CPU 密集型应用程序共享物理内核。