Limiting processes to not exceed more than 10% of CPU usage
nice / renice
nice
is a great tool for 'one off' tweaks to a system.
nice COMMAND
cpulimit
cpulimit
if you need to run a CPU intensive job and having free CPU time is essential for the responsiveness of a system.
cpulimit -l 50 -- COMMAND
cgroups
cgroups
apply limits to a set of processes, rather than to just one
cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3
Resources
http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups
http://manpages.ubuntu.com/manpages/xenial/man1/cpulimit.1.html
While it can be an abuse for memory, it isn't for CPU: when a CPU is idle, a running process (by "running", I mean that the process isn't waiting for I/O or something else) will take 100% CPU time by default. And there's no reason to enforce a limit.
Now, you can set up priorities thanks to nice
. If you want them to apply to all processes for a given user, you just need to make sure that his login shell is run with nice
: the child processes will inherit the nice
value. This depends on how the users log in. See Prioritise ssh logins (nice) for instance.
Alternatively, you can set up virtual machines. Indeed setting a per-process limit doesn't make much sense since the user can start many processes, abusing the system. With a virtual machine, all the limits will be global to the virtual machine.
Another solution is to set /etc/security/limits.conf
limits; see the limits.conf(5) man page. For instance, you can set the maximum CPU time per login and/or the maximum number of processes per login. You can also set maxlogins
to 1 for each user.
Did you look at cgroups? There is some information on the Arch Wiki about them. Read the section about cpu.shares
, it looks like it's doing what you need, and they can operate on a user-level, so you can limit all user processes at once.