为什么“cpulimit”不能限制chrome浏览器?

hop*_*hop 13 chrome cpulimit

由于 CPU 使用率高,我想限制 Chromium 网络浏览器cpulimit并使用终端运行:

cpulimit -l 30 -- chromium --incognito
Run Code Online (Sandbox Code Playgroud)

但它并没有像预期的那样限制 CPU 使用率(即最大为 30%)。它再次使用 100%。为什么?我究竟做错了什么?

Mar*_*ler 28

是的,当你停止它的一个线程时,铬并不在意。

cpulimit是,在 2021 年,真的不是你想要使用的那种工具,尤其是交互式软件:它通过信号停止和恢复进程来“节流”进程(或者在你的情况下尝试不成功)。嗯。这是一个可怕的黑客攻击,它会导致您在可能正在处理音频和视频或尝试平滑滚动的现代浏览器中真正不想要的不可靠性。

好消息是你真的不需要它。Linux 具有cgroups,这些可用于限制任何进程或进程组的资源消耗(例如,如果您不希望铬、Skype 和缩放一起消耗超过 50% 的整体 CPU 容量) . 它们还可用于限制其他事物,例如存储访问速度和网络传输。

就您的浏览器而言,这归结为(头顶,未测试):

# 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
Run Code Online (Sandbox Code Playgroud)

诀窍通常是为您的交互式会话(例如gnome-session)提供较高的份额,而其他内容则较低。

请注意,这保证了股份;它不会带走,除非必要。即,如果您的 CPU 在那段时间内不能做任何其他事情(因为没有其他东西在运行,或者因为所有具有更多份额的东西都被阻塞了,例如等待硬盘驱动器),它仍将分配给浏览器进程。但这通常是您想要的:它没有缺点(它不会使系统的其余部分运行得更慢,浏览器只是更快地“完成”了它必须做的事情,从好的方面来说甚至可能节省能源平均值:当多个 CPU 内核刚刚完成时,事情可以自动降频/挂起)。

  • @jamesqf 您是否确认您的行为是由 Firefox 消耗过多 CPU 引起的?这类事情可能有很多原因,例如 IO 争用、GPU 错误、其他一些进程在 Firefox 与其交互后遇到 CPU 峰值等等。当然,很可能是 Firefox 使用了过多的 CPU,但并非总是如此。 (2认同)
  • @jamesqf 如果无论如何都不会使用给定的 CPU 时间片,将它提供给 Firefox/Chromium/任何东西都不会减慢系统速度。事实上,这样做将使系统*更*响应,而不仅仅是浪费切片。 (2认同)
  • @jamesqf 我几乎可以肯定您在此处描述的问题是其他方面的错误;如果你只是启动一个占用 CPU 时间的程序,你应该仍然能够*做*你的计算机的事情,因为 Linux 调度程序*应该*分配一些时间给其他任务。它是*这个*断断续续的事实可能真的是由于firefox和X或您的图形驱动程序之间的一些邪恶的交互 (2认同)
  • Cgroups 是完成这项工作的正确工具,但它们可能应该通过 systemd 使用,而不是直接使用。创建一个带有 `CPUWeight` 的新切片,并将应用程序 `systemd-run` 放入其中。它不需要 sudo(用户可以控制他们切片中发生的事情)并且它设置相对于其他用户的应用程序的权重(他们已经存在于 `/user.slice/user-$uid.slice` cgroup 中)。 (2认同)

Joh*_*esB 5

我认为专注于找出它使用这么多 CPU 的原因,使用 Chromium 内置的 Taskmanager 来查找哪个选项卡正在使用它,或者像性能图和火焰图这样的分析器可能会很有用。

但如果你真的想减慢浏览器的速度,你应该考虑使用现代内置解决方案 cgroups,例如参见:https : //forums.gentoo.org/viewtopic-t-1010870-start-0.html

或者考虑使用 (re)nice 降低铬的优先级,使用 AdBlockers 或升级您的硬件。

为什么 cpulimit 没有按预期工作可能是由于多个线程,当 sigstop 停止父进程时子进程没有停止,但我不确定。

更新:这个https://github.com/opsengine/cpulimit/issues/39和这个:/sf/ask/2213658821/ -allowed-to-use证实了我的怀疑,您可能没有限制所有子进程。较新版本的 cpulimit 提供了选项:--include-children或:-i为此。