![为什么“cpulimit”不能限制Chromium浏览器?](https://linux22.com/image/193404/%E4%B8%BA%E4%BB%80%E4%B9%88%E2%80%9Ccpulimit%E2%80%9D%E4%B8%8D%E8%83%BD%E9%99%90%E5%88%B6Chromium%E6%B5%8F%E8%A7%88%E5%99%A8%EF%BC%9F.png)
由于 CPU 使用率高,我想限制 Chromium Web 浏览器cpulimit
并使用终端运行:
cpulimit -l 30 -- chromium --incognito
但它并没有按预期限制 CPU 使用率(即最大限制为 30%)。它再次使用 100%。为什么?我究竟做错了什么?
答案1
是的,当你停止其中一个线程时,Chromium 并不太关心。
cpulimit
在 2021 年,这真的不是你想要使用的工具,尤其不适用于交互式软件:它通过信号停止和恢复进程来“限制”进程(或者在您的情况下尝试失败)。嗯。这是一个可怕的黑客行为,它会导致你在现代浏览器中真正不希望的不可靠性,因为它很可能正在处理音频和视频,或者试图平滑滚动。
好消息是您确实不需要它。 Linux 有cgroups
,这些可用于限制任何进程或进程组的资源消耗(例如,如果您不希望 chromium、skype 和 Zoom 一起消耗超过总体 CPU 容量的 50%) 。它们还可以用于限制其他事情,例如存储访问速度和网络传输。
对于您的浏览器,这可以归结为(头顶,未测试):
# you might need to create the right mountpoints first
sudo mkdir /sys/fs/cgroup/cpu
sudo mount -t cgroup -o cpu cpu /sys/fs/cgroup/cpu
# Create a group that controls `cpu` allotment, called `/browser`
sudo cgcreate -g cpu:/browser
# Create a group that controls `cpu` allotment, called `/important`
sudo cgcreate -g cpu:/important
# allocate few shares to your `browser` group, and many shares of the CPU time to the `important` group.
sudo cgset -r cpu.shares=128 browser
sudo cgset -r cpu.shares=1024 important
cgexec -g cpu:browser chromium --incognitio
cgexec -g cpu:important make -j10 #or whatever
诀窍通常是为您的交互式会话(例如gnome-session
)提供较高的份额,而为其他事物提供较低的份额。
请注意,这保证分享;事实并非如此带走,除非有必要。也就是说,如果您的 CPU 在这段时间内无法执行任何其他操作(因为没有其他任何操作正在运行,或者因为具有更多共享的所有内容都被阻止,例如通过等待硬盘驱动器),它仍然会分配给浏览器进程。但这通常就是您想要的:它没有缺点(它不会使系统的其余部分运行速度变慢,浏览器只是更快地“完成”它必须做的事情,从好的方面来说,这甚至可能节省能源平均:当多个CPU核心刚刚完成时,事情可以自动降频/暂停)。
答案2
我认为专注于找出它使用这么多 CPU 的原因,使用 chromium 内置的任务管理器来查找哪个选项卡正在使用它,或者像性能和火焰图这样的分析器可能会很有用。
但如果你真的想减慢浏览器的速度,你应该考虑现代的内置解决方案 cgroups,例如:https://forums.gentoo.org/viewtopic-t-1010870-start-0.html
或者考虑使用 (re)nice 来降低 chromium 的优先级、使用 AdBlockers 或升级硬件。
为什么 cpulimit 没有按预期工作可能是由于多个线程,当 sigstop 停止父进程时子进程没有停止,但我不确定。
更新:这个https://github.com/opsengine/cpulimit/issues/39和这个:https://stackoverflow.com/questions/31623697/limit-the-percentage-of-cpu-a-process-tree-is-allowed-to-use证实我的怀疑,您可能不会限制所有子进程。较新版本的 cpulimit 提供了选项:--include-children
或:-i
为此。