虚拟化 CPU 核心与线程

虚拟化 CPU 核心与线程

我们在 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 的答案无疑是正确的。不过,我还是想听听硬件专家的意见,他们可以阐明线程与核心的性能方面......有人吗?

答案1

设置服务器执行其功能所需的最低 vCPU 数量,不要过度分配,否则很容易减速你的虚拟机。

答案2

通常,HT 在 I/O 负载较大的工作负载上效果很好——CPU 可以从另一个虚拟 CPU 的队列中安排更多处理任务,而第一个虚拟 CPU 则等待 I/O。实际上,HT 子系统为您带来的只是硬件加速上下文切换——这也是在虚拟机之间切换时使用的工作负载模式。因此,如果您拥有的虚拟机多于核心,HT 通常会稍微减少减速,前提是每个虚拟机都有一个虚拟核心。

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

答案3

这相当棘手。根据负载,HT 可以将性能提高约 30% 或降低。通常我建议不要为单个 VM 分配比物理核心更多的 vCPU,但如果 VM 相当空闲(当然,这样的 VM 实际上不需要太多 CPU),则可以为它分配与线程数量相同的 vCPU。您实际上并不想为单个 VM 分配比物理核心更多的 vCPU可调度核心就是我的意思。无论如何,@Chopper3 的建议是正确的 - 不要为 VM 提供超过其绝对需要的 v-CPU 数量。

因此,根据虚拟机的负载和关键程度,您要么根本不进行过度分配,要么坚持物理核心数,要么将每个虚拟机的线程数提高到最高。

现在,讨论 HT 的问题,通常来说,它是一件好事,特别是当您为虚拟机投入的 vCPU 数量多于物理核心甚至线程数量时,因为它使 Linux 调度程序更容易调度这些 vCPU。

最后一点,使用 kvm,分配给虚拟机的 vCPU 只是主机上的一个进程,由 Linux 调度程序调度,因此您可以轻松应用此处可以执行的所有常规优化。此外,核心/插槽设置只是此进程在虚拟机的客户操作系统上的显示方式,在主机上它仍然只是一个进程,无论虚拟机如何看待它。

答案4

我想详细说明一下 Chopper3 的回答:如果系统大部分 CPU 空闲,则不要分配大量 vCPU,如果系统 CPU 密集型,则要非常小心不要过度分配。您应该能够分配总共 8 个 vCPU 而不会发生争用。您可以过度分配,但如果这样做,请确保没有单个客户机(尤其是 CPU 密集型客户机)有 8 个 vCPU,否则您将发生争用。我不知道 KVM 调度程序机制是否比这更具体。

以上内容基于对 vCPU 与固定 CPU 的理解,同时也假设如果您为 KVM 分配足够的线程,KVM 将允许单个客户机(或多个客户机)占用其他客户机的所有实际 CPU。vCPU ~ 主机线程,客户机 CPU CPU = 主机核心,客户机 CPU(我没有在同一个客户机上使用混合 vCPU 和固定 CPU,因为我没有超线程。)

相关内容