虚拟化 CPU 内核与线程

ned*_*edm 9 central-processing-unit vcpu multi-core threads kvm-virtualization

我们在 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 的答案无疑是正确的方法。但是,我仍然很想听听任何硬件专家的意见,他们可以阐明线程与内核的性能方面……有人吗?

Cho*_*er3 8

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


tec*_*b0y 5

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

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


dya*_*sny 5

这比较棘手。根据负载,HT 可以将性能提高约 30% 或降低性能。通常,我建议不要为单个 VM 分配比物理内核更多的 vCPU,但是如果 VM 相当空闲(当然,这样的 VM 不会真正需要太多 CPU),则可以放弃为许多 vCPU,因为您有线程。您真的不希望为单个 VM 提供比可调度内核更多的 vCPU,这正是我所得到的。无论如何,@Chopper3 的建议是正确的 - 不要为 VM 提供超过其绝对需要的 v-CPU。

因此,根据您的 VM 的负载和关键程度,您要么根本不过度分配,要么坚持物理核心数,要么与每个 VM 的线程数一样高。

现在,进入 HT 的问题,拥有它通常是一件好事,尤其是当您向 VM 提交的 vCPU 比物理内核甚至线程多时,因为它使 Linux 调度程序更容易调度这些 vCPU。

最后一件事,使用 kvm,分配给 VM 的 vCPU 只是主机上的一个进程,由 Linux 调度程序调度,因此您可以在此处轻松执行所有常规优化。此外,核心/套接字设置只是为 VM 的来宾操作系统显示此进程的方式,在主机上它仍然只是一个进程,无论 VM 如何看待它。