虚拟化的CPU核心与线程


8

我们在Ubuntu 9.10上拥有一个KVM主机系统,该系统具有更新的具有超线程功能的四核Xeon CPU。如英特尔产品页面上所述,该处理器具有4个核心,但具有8个线程。/ proc / cpuinfo和htop都列出了8个处理器,尽管每个处理器都在cpuinfo中声明了4个内核。KVM / QEMU还报告了可分配给guest虚拟机的8个VCPU。

我的问题是,当我为VM guest虚拟机分配VCPU时,应该分配每个内核还是每个线程?由于KVM / QEMU报告服务器有8个要分配的VCPU,我是否应该继续设置来宾使用4个CPU,而我以前将其设置为使用2个(假设总共有4个VCPU)?我想尽可能多地利用主机硬件而不会过度分配。

更新: Chopper3的答案无疑是正确的方法。但是,我仍然很乐意听取任何硬件专家的意见,他们可以阐明线程与内核的性能方面……有人吗?

Answers:


8

设置服务器执行功能所需的vCPU的最低数量,不要过度分配它们,否则您很容易降低 VM的速度


1
这似乎是一个明智的方法。不过,我很好奇每个线程而不是每个内核分配VCPU如何影响性能。但是我已经看到了过度分配可能导致的一些非常糟糕的事情,并且使用与非超线程主机中相同数量的VCPU似乎可以为来宾充分处理负载,因此我将独自待命并计划在非生产型盒上进行实验。
nedm

1
+1,答案还取决于您的工作量。对于受CPU严重限制的VM,请将其视为占用整个核心;对于处于空闲或IO限制的VM,请将其视为占用线程。但是总的来说,请尽量减少分配,以免造成头疼。
克里斯·S

1
虽然我同意极简主义的方法,但从这个意义上说,KVM不是VMWare。没有帮派调度,意味着可以无害地使用每个VM的更多vCPU
dyasny 2012年

5

通常,HT在IO上较重的工作负载上运行良好-当第一个虚拟CPU等待IO时,CPU可以从另一个虚拟CPU的队列中调度更多处理任务。实际上,所有HT子系统都能为您带来硬件加速的上下文切换-这是在VM之间切换时也使用的工作负载模式。因此,当每个虚拟机拥有一个虚拟核心时,如果您有更多的虚拟机而不是核心,那么HT通常(通常)会降低速度。

如果将虚拟机中的应用程序编写为线程化,则为虚拟机分配多个vCPU可以提高性能,但是这也会使虚拟机管理程序的工作更加困难;它必须一次在2个或4个CPU上分配时间-因此,如果您有四核CPU和四核vCPU VM,则在该时间片期间只能调度一个VM(而它可以运行4个不同的单核vCPU VM立刻)。


@ Chris,@ techieb0y:谢谢,这正是我一直在寻找的见解。
nedm

这不是真的。当具有四个vCPU的VM需要调度单个v核时,这是在主机上而不是所有4个核上进行调度的时间。至少KVM就是这种情况(我知道vmware的方法不太有效,因为它们确实会进行调度)
dyasny 2012年

5

这很棘手。根据负载,HT可以将性能提高约30%或降低。通常,我建议不要为单个VM分配比您具有物理核心更多的vCPU,但是如果VM相当闲置(当然,这样的VM并不需要太多的CPU),则可以将其分配为有线程的情况下可以使用多个vCPU。您真正不希望为单个VM提供比可调度核心更多的vCPU,这就是我要解决的问题。在任何情况下,@ Chopper3的建议都是正确的-不要给虚拟机提供超过其绝对需要数量的v-CPU。

因此,根据您的VM的负载和关键程度,您要么根本不整合,要么坚持物理核心数,要么就等于每个VM的线程数。

现在,进入HT问题,通常是一件好事,尤其是当您向虚拟机提交的vCPU数量超过物理核甚至线程数量时,因为Linux调度程序更容易调度这些vCPU。

最后一件事情是,使用kvm将分配给VM的vCPU只是主机上的进程,由Linux调度程序调度,因此您可以在此处轻松进行所有常规优化。此外,cores / sockets设置只是为VM的来宾OS显示此过程的方式,而在主机上,无论VM如何看,它仍然只是一个过程。


2

我想详细说明Chopper3的答案:如果系统主要是cpu-idle,则不要分配一堆vcpu,如果它们是cpu-inense,请非常注意不要整体分配。您应该能够总共分配8个vCPU而不发生争用。您可以总体分配,但是如果这样做,请确保没有单个来宾(尤其是CPU密集型来宾)具有8 vcpu,否则您将发生争用。我不知道KVM调度程序机制比这更具体。

以上内容基于以下对vCPU与固定CPU的理解,还基于以下假设:如果您为其分配了足够的线程,则KVM将允许一个来宾(或多个来宾)将所有实际CPU占用其他CPU。vCPU〜主机线程,来宾CPU CPU =主机核心,来宾CPU(未在同一来宾上使用混合vCPU和固定CPU玩,因为我没有超线程。)


1
固定vCPU只是一个虚拟CPU进程,被分配为仅在特定核心(或核心子集)上运行。如果您不进行总体分配并且要确保VM在相同内核的CPU时间上没有竞争,则可以将它们固定到不同的内核。这也是进行NUMA固定的一种方法,尽管您现在可以直接进行这种操作
dyasny
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.