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