我想避免一个进程使用过多的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_limit
(config.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 是正确的,将处理器密集型任务限制在单个核心将有助于保持较低的温度。在内核之间连续移动进程是没有意义的,因为这不会以任何方式帮助处理器冷却,因为相同数量的功率仍然被注入到同一芯片中。