我们在Ubuntu 9.10上安装了带有超线程function的新款四核至强CPU。 如英特尔产品页面上所述,处理器有4个内核,但有8个线程。 / proc / cpuinfo和htop都列出了8个处理器,但是每个处理器在cpuinfo中声明4个核心。 KVM / QEMU也报告可以分配给客人的8个VCPU。
我的问题是,当我分配VCPU到VM guest,我应该分配每个内核还是每个线程? 由于KVM / QEMU报告服务器有8个VCPU要分配,我应该继续设置一个guest虚拟机来使用4个CPU,我以前曾经设置它使用2(假设有4个总的VCPU可用)? 我想从主机硬件中获得最大的可能,而不会过度分配。
更新: Chopper3的答案无疑是正确的做法。 不过,我仍然喜欢听到那里的硬件专家谁可以阐明线程与核心的性能方面…任何人?
设置您的服务器执行其function所需的vCPU数量最小,不要过度分配它们,否则可能会使您的虚拟机变慢 。
通常情况下,HT在IO上工作量较大的情况下工作良好–CPU可以在第一个虚拟CPU在IO上等待时,从另一个虚拟CPU的队列中调度更多的处理任务。 实际上,所有的HT子系统都是硬件加速的上下文切换 – 这也是在VM之间切换时使用的工作负载模式。 所以,如果每个虚拟机都有一个虚拟内核,那么当有更多虚拟机和核心时,HT(通常)会稍微降低速度。
将多个vCPU分配给虚拟机可以提高性能,如果虚拟机中的应用程序是用于线程编写的,但是也会使虚拟机pipe理程序变得更加困难。 它必须一次在2或4个CPU上分配时间,所以如果你有一个四核CPU和一个四核vCPU虚拟机,那么在这个时间片上只能有一个VM被调度(而它可以运行4个不同的单vCPU虚拟机立刻)。
这相当棘手。 根据负载,HT可以提高性能约30%或降低性能。 通常,我build议不要将更多的vCPU分配给单个虚拟机,但是如果虚拟机相当闲置(当然这样的虚拟机实际上并不需要太多的CPU),那么可以将其分配给你有许多vCPU线程。 你真的不想给单个虚拟机更多的vCPU,而不是你可以调度的核心 。 无论如何,@ Chopper3的build议是正确的 – 不要给虚拟机更多的v-CPU。
因此,根据虚拟机的负载和关键程度,您可以根本不占用物理核心数量,也可以高达每个虚拟机的线程数量。
现在,进入HT的问题,通常是一件好事,特别是当你向VM提交更多的vCPU,而不是物理内核甚至线程时,因为它使得Linux调度器更容易调度这些vCPU。
最后一件事情是,将虚拟机分配给虚拟机的虚拟机只是主机上的一个进程,由Linux调度程序调度,因此您可以轻松应用所有正常的优化。 而且,核心/套接字的设置就是虚拟机客户操作系统显示这个进程的方式,在主机上它仍然只是一个进程,而不pipe虚拟机如何看待它。
我想详细阐述一下Chopper3的回答:如果系统大部分是cpu-idle,那么不要分配一堆vcpu,如果它们是cpu-intense,那么要非常小心不要超额分配。 您应该可以分配总共8个vCPU而无需争用。 您可以重新定位,但是如果这样做,请确保没有单个guest虚拟机,尤其是CPU密集型guest虚拟机拥有8个vcpu,否则会发生争用。 我不知道KVM调度程序机制比这更具体。
以上是基于对vCPU和固定CPU的以下理解,还假设KVM将允许单个guest虚拟机(或多个guest虚拟机)将所有实际的CPU从其他guest虚拟机分配给足够的线程。 vCPU〜主机线程,来宾CPU CPU =主机核心,来宾CPU(未使用混合的vCPU和固定的CPU在同一个来宾上,因为我没有超线程。)