如何使用标准 GNU/Linux 工具限制进程组的 CPU 消耗?

如何使用标准 GNU/Linux 工具限制进程组的 CPU 消耗?

我有一堆同名的进程 - 它们占用了我 100% 的 CPU 时间,我希望这个数字不超过 50%。

如何在不安装任何额外软件的情况下做到这一点?

答案1

对于内核级机制,你需要阅读 Linux对照组。这是一个仍然处于积极开发中的领域,因此您需要确保您所读的内容与您拥有的(或愿意安装的)内核一致。

尽管您说不要安装任何其他东西,但您可以考虑安装cgred以自动将名称匹配的进程移动到您的 CPU cgroup。在 Debian 上,这在软件包中cgroup-bin

答案2

您可以使用 STOP 和 CONT 信号通过 bash shell、sleep、pgrep 和 pkill 命令执行此操作。

以下一行代码将使进程最大使用总可用 CPU 时间的 50%。它将每 100 毫秒运行一次,然后再停止 100 毫秒。

while [ True ]; do pkill -STOP processname; sleep 0.1s; pkill -CONT processname; sleep 0.1s; done

为了便于阅读,下面将相同的代码分成多行:

while [ True ]
     do pkill -STOP processname
     sleep 0.1s
     pkill -CONT processname
     sleep 0.1s
done

无论有多少进程符合进程名模式,它们都不能超过 50% 的 CPU 使用率,因为它们都同时停止和继续 - 这意味着当它们处于活动状态时,它们需要在它们之间共享可用的 CPU 时间。这确保满足限制。

有一个名为 cpulimit 的程序可以做大致相同的事情。

答案3

无需安装任何额外的软件nice。值的范围是-2019

nice -20 some_command

给出some_command最高优先级, 和

nice 19 some_command

给出some_command最低优先级

答案4

如上所述,可以用作协助 OOM-killer 的脚本,也可以防止其使用

假设当 CPU 总体使用率达到 75% 并持续 x 分钟时,运行 pkill.sh

 ../scripts/boottime/OOMkiller.sh

while [ true] ; 
    do  inxi -tcm5 > ~/cpu.log 
    sleep 0.5s 
    inxi -tcm5 >> ~/cpu/log | diff -m > ~/offender.log
done

for i in offender.log ;
    do ./scripts/pkill.sh
done

 ../scripts/pkill.sh
while [true] 
    do pgrep $(i) -STOP $PID
    pkill -STOP $PID
    sleep 0.5s 
    pkill -CONT $PID
done

相关内容