您可以覆盖已运行进程中的 CPU 核心使用率吗?

您可以覆盖已运行进程中的 CPU 核心使用率吗?

有没有办法以(例如)10 个 CPU 核心运行进程,然后将 CPU 核心使用率覆盖到 5?

答案1

并不真地。

这当然不能以便携式方式完成。您没有指定要在哪个系统上执行此操作。我假设它是 Linux,因为这是我最了解的,但请随意澄清。

Linux 内核有两个处理“CPU 关联性”的系统调用,sched_setaffinity()以及sched_getaffinity().这些可以用来告诉内核哪个进程是核心可能运行。如果 CPU 数量低于进程当前使用的线程数量,则必然会开始使用更少的内核。然而,这种方法的问题在于它军队供进程运行的一组特定的 CPU 核心。如果这是一项 CPU 密集型工作,则意味着这些核心很容易变热;如果系统没有足够的冷却能力来冷却 CPU,从而减少问题的发生,那么通常的解决方案是内核将有问题的进程重新调度到另一个内核,从而允许刚刚使用的内核冷却一个内核同时。通过强制运行一组核心,此方法不再有效,然后内核将不得不回退到更改 CPU 频率。但是,如果您尝试限制内核,因为还有其他进程也在运行,您希望给予一些 CPU 时间,那么这可能并不那么重要。

可以使用以下命令从命令行访问sched_setaffinity()和系统调用:sched_getaffinity()taskset

taskset -p 0x3 $PID

将告诉内核,$PID从现在开始,具有 pid 的进程只能在处理器核心 0 和 1 上运行。(0x3 是位掩码,其中位 1 指核心 0,位 2 指核心 1)。

关联掩码是二进制的,并以十六进制数字的形式输入,您可以使用下面的四核处理器完整表来指定要使用的 CPU:

0x1 - cpu0
0x2 - cpu1
0x3 - cpu0 and cpu1
0x4 - cpu2
0x5 - cpu0 and cpu2
0x6 - cpu1 and cpu2
0x7 - cpu0, cpu1 and cpu2
0x8 - cpu3
0x9 - cpu0 and cpu3
0xA - cpu1 and cpu3
0xB - cpu0, cpu1 and cpu3
0xC - cpu2 and cpu3
0xD - cpu0, cpu2 and cpu3
0xE - cpu1, cpu2 and cpu3
0xF - cpu0, cpu1, cpu2 and cpu3

答案2

我找到了一个方法!!

cpulimit 对此非常有效:

https://github.com/opsengine/cpulimit

相关内容