vCPUs 映射到多个服务器上的 CPU

vCPUs mapped to CPU on multiple servers

我在多台服务器上部署了 openstack。每个服务器有 2 CPU,每个 8 个核心,每个 16 个线程。如果我打开超线程,我可以在我的 openstack 部署中使用多少 vCPUs,这样我就不会为任何 VM 过度使用任何 vCPUs。

超线程

我一般不建议在使用 KVM 时打开超线程,但我有偏见。当超线程和 kvm 都很年轻时,围绕 vcpu 和超线程出现了很多问题。

为清楚起见,超线程只是在 linux 内核中创建一个软逻辑处理器,以努力在 cpu 处理队列中达到更高的效率。

过度使用,vCPUs 和逻辑 CPUs

一个vCPU是一个分配给虚拟机的虚拟cpu。

逻辑 CPU 是 CPU 逻辑分配给主机系统的 Linux 内核。

正如超线程所见,有时逻辑 CPU 的数量超过主机上的物理 CPU 或内核。

当您拥有的 vcpu 内核多于物理内核时,您在技术上就是过度使用了。请注意我是怎么说物理核心的,而不是逻辑 CPUs。 linux 在 proc/cpuinfo 中向您展示的内容可能无法准确反映可用的物理内核,这在一定程度上要归功于超线程。

当 kvm 分配 vCPUs 时,默认情况下它们没有设置任何类型的 CPU 亲和力。这意味着,vCPU 将转到 linux 中当时似乎最可用的任何逻辑处理器。如果有人开始做 'MAKE=make -j64' 类工作,您可能会看到一些相当重要的利用率旋转起来,并开始围绕任何给定指令集中最可用的逻辑 CPU s 进行喷水。

现在如果你有一个 8 物理核心盒,托管 4 个虚拟机,2 个 vCPUs 一个,这很好。但是想想启用超线程会发生什么……现在您有 16 个逻辑 CPU,但只有 8 个内核。当您再调出 4 个虚拟机时会发生什么?您 运行 让虚拟机直接影响其邻居的资源可用性的风险。这在技术上是过度投入的。

如无必要,请不要过度投入。

还要考虑主人的需求。当您执行 CPU 密集操作时,您可能希望在主机系统上设置 cpu_affinity 并认为该物理核心专用于主机,并从可用(最大)vCPU 中减去它虚拟机可用的计数。

了解如何设置与任务集的亲和力:

参考:http://manpages.ubuntu.com/manpages/hardy/man1/taskset.1.html

每个 VM 的最大 vCPU

至于 cpu 配额,这基本上是您的管理程序而非 OpenStack 的功能。您需要通过 CFM 和一些周密的计划来处理它。

比如RedHat调优了自己的KVM包:

The maximum amount of virtual CPUs that is supported per guest varies depending on which minor version of Red Hat Enterprise Linux 6 you are using as a host machine. The release of 6.0 introduced a maximum of 64, while 6.3 introduced a maximum of 160. Currently with the release of 6.7, a maximum of 240 virtual CPUs per guest is supported.

参考:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/chap-Virtualization_Host_Configuration_and_Guest_Installation_Guide-Virtualization_Restrictions.html

这里有一些关于调整 PER vm cpu/资源分配的信息

参考:http://libvirt.org/formatdomain.html#elementsCPUAllocation