有多种方法可以设置进程/线程的亲和性。
例如,告诉操作系统仅在特定核心上运行。
或者告诉线程在特定核心上运行。
这在虚拟机上意味着什么,其中 cpu 实际上是虚拟的(并以某种方式映射到物理 cpu)?
答案1
它只会设置 VM 内和虚拟 CPU 内的关联性。这可能与实际主机 CPU 没有静态关系,但假设 VM 主机尝试将虚拟 CPU 保留在单独的物理 CPU 上(这可能应该如此),在来宾上设置关联性可能仍然有助于将进程保持在单个物理 CPU 上。 CPU,取决于主机和客户机上的负载类型。
如果主机上的物理 CPU 与来宾上的虚拟 CPU 数量一样多,则 VM 主机不需要移动虚拟 CPU。但由于您可能有更多虚拟机,因此需要移动它们,而在来宾中您对此无能为力。如果需要,您还需要在主机级别设置关联性。
也就是说,假设没有特殊的驱动程序向虚拟机显示主机系统 CPU。
答案2
我可以看到一个虚拟机可以从中受益的案例SCHED_SETAFFINITY(2)
。让我们采用一个“特殊”VM,每个虚拟机有 2 个“虚拟套接字”(映射并固定到同一主机上的 2 个不同物理 CPU)和 2 个“虚拟内核”。您可能希望确保要在来宾内部设置亲和力的进程具有更低的性能成本,如联机帮助页中所述:
限制线程在单个 CPU 上运行还可以避免因线程停止在一个 CPU 上执行然后在另一 CPU 上重新开始执行时发生的缓存失效而导致的性能成本。
为什么要进行这样的设置?我不知道:),但是通过拥有 2 个虚拟套接字,您仍然会遇到缓存失效问题。
还有一些使用 24 核的基准测试在 vmware 上具有多种配置(1 插槽、24 核心 - 24 插槽、1 核心 - 2 插槽、12 核心)。在过去,一旦您可以证明进程已绑定到套接字,此亲和力集就可以用于需要“CPU 套接字许可”(cof、cof、Oracle...)的软件,但就今天而言,有很多这样的软件解决方案在虚拟环境许可方面变得越来越清晰,要求对运行虚拟机的整个物理 CPU 进行许可。正如您所看到的,vmware 解决方案根据您拥有的 vSocket 数量创建不同的 vNUMAS。
除此之外,在来宾内部设置亲和力可能会增加通过在虚拟机管理程序中移动虚拟机时设置亲和力来完成的操作的复杂性。