我有一堆同名的进程 - 它们占用了我 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
。值的范围是-20到19。
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