我需要从外部将进程/会话限制为一定数量的核心。
除了CPU亲和力(我不喜欢指定实际核心)和cgroup(很难集成到我们的项目中)之外,还有其他可能性吗?
答案1
嗯,对于 CPU 关联位,通常旨在解决与正在执行程序的物理 CPU 相关的一组不同问题。这就是为什么您必须通过 CPU 关联性来指定您正在谈论的特定 CPU。
从您不关心使用哪个 CPU 的事实来看,我猜您只是想重新调整时间片的形状。 cgroups 实际上完成了您想要的任务,并且是调整 CPU 时间的机制,而与执行 CPU 无关。
决定性的差异基本上可以归结为:要么您关心进程在哪些物理核心上运行,要么不关心。如果您没有任何需要在特定 CPU 上运行进程的性能要求(某些 CPU 缓存保持热状态、确保相关进程不在外部 NUMA 节点上执行、特定中断由一组特定 CPU 处理等)那么你可能只是想控制 CPU 时间分配。在这种情况下,当您真正的意思是“CPU 时间”时,用“CPU 核心”来思考是错误的。
您在集成 cgroup 的哪些部分时遇到困难?一旦我知道您遇到了什么具体问题,我就可以更新我的答案。
答案2
我们最终选择了 cgroups,因为似乎确实没有任何其他方法可以实现这一点。
Cgroup 允许通过内核调度程序使用cpu.cfs_period_us
和来限制 CPU 利用率cpu.cfs_quota_us
。这避免了 CPU 核心的明确指定。
答案3
这对您来说可能太大了,但如果我需要在比我的机器可用的内核更少的内核上测试某些内容,我会设置一个 VirtualBox VM 并在配置中指定 CPU 的数量。