我在具有 Core i7-2600 CPU 的 Linux 服务器上使用 KVM/libvirt,该服务器具有以下 CPU 拓扑(1 个插槽,4 个核心,8 个线程):
Physical | Logical
---------+--------
Core 0 | 0, 4
Core 1 | 1, 5
Core 2 | 2, 6
Core 3 | 3, 7
我通常在此主机上运行 3 台虚拟机,每台虚拟机有 2 个虚拟 CPU。为了通过保持缓存热度来提高性能,我想将虚拟机的 vCore 固定到固定主机核心。
现在的问题是虚拟机核心到主机核心的映射,考虑到主机 CPU 使用超线程:
选项 1:每个物理主机核心一个虚拟机
VM1: logical cores 1, 5
VM2: logical cores 2, 6
VM3: logical cores 3, 7
这样,虚拟机的两个虚拟核心将映射到主机 CPU 上的同级超线程。由于两个主机核心共享一些缓存,因此客户代码将受益于缓存局部性。
但考虑到两个超线程也共享一些功能单元,它们会在计算负载下相互减慢速度。
选项 2:分布式 VM 核心
VM1: logical cores 1, 2
VM2: logical cores 3, 5
VM3: logical cores 6, 7
这种映射的优点是,如果虚拟机在其两个虚拟核心上都经历了计算负载,则该负载将映射到主机上的两个单独的物理核心上。如果当时没有其他虚拟机处于负载状态,则前者可以使用两个物理核心,而不是像选项 1 那样只使用一个。
所有虚拟机主要运行 Web 服务(Nginx、MySQL、PHP-FPM),所以我知道这个问题属于理论性问题 - 但我仍然想知道。
答案1
你可能想太多了。
此处手动分配核心实际上可能会导致性能降低。在 VMware 世界中,除非有非常具体的要求,否则我们不会这样做,但对于您描述的工作负载和应用程序,这不是必要的。让 KVM 安排事情并完成。如果有疑问,请获得更多核心和插槽。但在如此小的部署中,CPU 不会成为限制因素。
答案2
在大多数情况下,选项 1 不会减慢速度,但操作系统和程序可能会因为负载过大而变得不堪重负。它可能会堆积起来。我认为,如果你的邻居不介意~微小~的减速,选项 2 会更好。