cpulimit is a useful utility for stopping a program
from wasting CPU, but it only limits a single process. As all modern
web browsers use process isolation, limiting just
a single process doesn't do very much, we actually want to limit all of
the browser processes.
The following script will limit the CPU usage of all browser processes
$LIMIT percent CPU. Note that the limit is per process not total
over all processes, so you may want to set it quite low to actually have
LIMIT=10 # Hard-code a limit of 10% CPU as an example. # Kill child processes (stop limiting CPU) on script exit. for sig in INT QUIT HUP TERM; do trap " pkill -P $$ trap - $sig EXIT kill -s $sig "'"$$"' "$sig" done trap cleanup EXIT # Find and limit all child processes of all browsers. for name in firefox firefox-esr chromium chrome do for ppid in $(pgrep "$name") do cpulimit --pid="$ppid" --limit="$LIMIT" & for pid in "$ppid" $(pgrep --parent "$ppid") do cpulimit --pid="$pid" --limit="$LIMIT" & done done done
The script is fairly straight-forward: it has a list of names of browser
processes to look for and uses
pgrep to find instances
of them. In the middle loop, it uses
--parent option to
enumerate all processes whose parent is one of those browser processes.
Then it launches a separate
cpulimit process to limit each of
those. The code at the top is based on
my recent post on killing child jobs on script exit
to kill all of the
cpulimit processes, and therefore stop limiting
the CPU of all of the browser processes, when the script is killed.
One notable limitation of this approach is that it only limits processes that exist when the script is run. If you keep using the browser, it will probably spawn new processes which won't be limited. This wasn't relevant to the reason I made the script originally, but I may investigate augmenting the script to cover this case in a future blog post.
cpulimit has an option
--monitor-forks which is
documented as follows:
watch and throttle child processes of the target process Warning: It is usually a bad idea to use this flag on a shell script. The commands in the script will each spawn a process which will, in turn, spawn more copies of this program to throttle them, bogging down the system.
While it sounds like it should do the right thing... the warning is
accurate: its effect is to bog down the CPU with running
which is quite counter-productive.
Browser tab/task manager
It's possible the appropriate course of action isn't to blanket limit CPU for every tab. Firefox's task manager or the equivalent in Chromium/Chrome can be used to view their resource usage by subprocess to see which tabs are using processor power. The solution may be to just close a tab or not use websites that waste CPU power.