我在具有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。 为了通过保持caching热度来提高性能,我想将VM的vCore固定到固定主机内核。
现在的问题是VM核心到主机核心的映射,考虑到主机CPU使用超线程的事实:
VM1: logical cores 1, 5 VM2: logical cores 2, 6 VM3: logical cores 3, 7
这样,虚拟机的两个虚拟核心将被映射到主机CPU上的同级超线程。 由于两个主机核心共享一些caching,所以客户代码将从caching本地获益。
但考虑到两个超线程也共享一些function单元,它们在计算负载下会相互减速。
VM1: logical cores 1, 2 VM2: logical cores 3, 5 VM3: logical cores 6, 7
这种映射的优点是,如果虚拟机在其两个虚拟内核上都经历了计算负载,则该负载被映射到主机上的两个独立的物理内核上。 如果此时没有其他虚拟机处于负载状态,则前者可以使用两个物理内核,而不是只有一个具有选项1。
虚拟机主要运行Web服务(Nginx,MySQL,PHP-FPM),所以我知道这个问题具有相当的理论性 – 但我仍然想知道。
你可能正在反思这个。
在这里手动分配内核可能会导致性能下降。 在VMware环境中,除非有非常特殊的要求,否则我们不这样做,但是对于您所描述的工作负载和应用程序来说,这是没有必要的。 让KVM安排事情并完成。 如果有疑问,获得更多的核心和sockets。 但是CPU不会成为这种小型部署的限制因素。
scheme1在大多数情况下不应该放慢速度,但是操作系统和程序可以触发他们的工作量。 它可能堆积起来。 如果你的邻居不介意这个微小的放缓,我认为选项2会更好。