防止进程使用过多的 CPU(即使可用)

防止进程使用过多的 CPU(即使可用)

我想避免一个进程使用过多的CPU。事实上,我想防止我的 CPU 升温,因为我有一些非常长的 CPU 要求很高的任务(视频转换)需要从装有 Debian 的 Raspberry Pi 上运行:温度上升超过 80 °C。

我看到有一个cpulimit命令,但我不知道如何用它运行我的命令,因为它似乎采用 pid(进程 ID)作为参数或包含要运行的代码的可执行文件,而不是 bash 命令本身。我想直接查看我的任务返回的内容,并能够在需要时按 Ctrl-C。注意:如果我尝试将任务命令放入文件并运行cpulimit -l 20 --path=/path/to/my/file.sh,那么它会返回Warning: no target process found. Waiting for it...所以看起来我无法理解 1) --path 参数实际上做了什么,以及 2) 如何在任何终端上正确使用 cpulimit命令...

我会更喜欢 不使用类似的解决方法nohup my-command --my-args &,即使它其次返回 pid 并让我为其编写 cpulimit 命令。

提前致谢!

答案1

利用硬件的电源管理功能

如果您的目标是降低 CPU 温度,您可能需要考虑调整电源管理参数,以确保 CPU 更早受到限制。根据您的 Raspberry Pi 型号,您可能需要降低温度temp_soft_limitconfig.txt默认值似乎为 60°C)。请参阅树莓派文档了解详情。

使用控制组

另一种选择是使用 cgroup 来限制进程可以使用的资源量。请注意,cgroups 还考虑了可能产生的子进程,并且也可以应用于守护进程。如果你想限制 CPU 使用,比如你最喜欢的 shell 会生成 sed、awk 等工具,或者 Chrome 浏览器会为每个选项卡生成一个单独的进程,这将为 CPU 周期数设置限制全部受影响的 cgroup 中的进程可能会被烧毁。

您可以创建一个名为“cpulimit”的控制组,如下所示:

$ sudo cgcreate -g cpu:/cpulimit

将此控制组中的进程限制设置为 CPU 时间的 20%:

$ sudo cgset -r cpu.cfs_period_us=1000000 cpulimit
$ sudo cgset -r cpu.cfs_quota_us=200000 cpulimit

运行您的应用程序:

$ sudo cgexec -g cpu:cpulimit <command>

答案2

我会给你两个答案:一个是有用的cpulimit,另一个是更有意义的。

第一个答案:如果您尝试使用 限制脚本cpulimit,为什么不在 下的脚本内运行各个任务cpulimit?例如:

#!/bin/dash
cpulimit --limit 20 -- ~/bin/mprime/mprime -t  # starts a slow mprime

替代答案:你提出了一些 xy 问题。您想要给 CPU 时间来冷却,但您使用的程序是通过快速挂起和恢复进程来实现的。

NOTES
    cpulimit always sends the SIGSTOP and SIGCONT signals to a process,
    both to verify that it can control it  and  to  limit  the  average
    amount  of  CPU it consumes ...

这不仅是一种不准确的拼凑,可以用bash一行代码复制,而且还要注意,它cpulimit会以一种可能搞砸程序的方式扰乱文件描述符。例如,如果我在第一个示例中mprime以交互模式运行cpulimit --limit 20 -- ~/bin/mprime/mprime,我会看到无限循环的mprime提示充斥着我的终端,直到我手动发出 SIGKILL 信号cpulimit为止mprime

您的目标是给处理器一些空闲时间。执行此操作的正确方法是降低处理器的时钟频率,以便它可以花更多时间无所事事。由于所讨论的设备是 Raspberry Pi,因此这应该不会太难完成。

PS:Rui F Ribeiro 是正确的,将处理器密集型任务限制在单个核心将有助于保持较低的温度。在内核之间连续移动进程是没有意义的,因为这不会以任何方式帮助处理器冷却,因为相同数量的功率仍然被注入到同一芯片中。

相关内容