In this brief guide, we will see what is CPULimit, how to install CPULimit in Linux and how to limit the CPU usage of a process using CPULimit in Linux.
Table of Contents
Introduction
Some times, a particular process might consume more CPU usage, and affects the performance of the whole system. Since that particular process consumes more CPU, you couldn't do other tasks. You need to wait for that process to finish before starting a new task. Luckily, this can now be solved by an useful utility called CPULimit.
What is CPULimit?
As the name implies, CPULimit limits the CPU usage of a process. This is quite useful to control the batch jobs, when you don't want them to consume more CPU usage.
The main goal of CPULimit is prevent a process from running for more than a specified time ratio. It does not change the nice value or other scheduling priority settings, but the real CPU usage. Also, it is able to adapt itself to the overall system load, dynamically and quickly. It will work on most Linux and Unix-like distributions.
Install CPULimit in Linux
CPULimit is available on most Unix-like distribution's default repositories. You can install it using the default package managers in the respective Linux distribution as shown below.
On Arch Linux and its derivatives:
$ sudo pacman -S cpulimit
On Debian, Ubuntu, Linux Mint:
$ sudo apt-get install cpulimit
On RHEL, CentOS, Fedora:
Enable EPEL repository first.
$ sudo yum install epel-release
And then, install cpuclimit using command:
$ sudo yum install cpulimit
Or,
$ sudo dnf install cpulimit
On SUSE/openSUSE:
$ sudo zypper install cpulimit
Limit CPU Usage of a Process in Linux using CPULimit
Let us run a program that consumes more CPU usage. The following commands should be run as root user.
Create a file called highcpu.sh.
$ vi highcpu.sh
Add the following contents.
#!/bin/bash while :; do :; done;
Press ESC key and type :wq to save and close the file. This short program will loop endlessly and consumes maximum CPU usage. So, I recommend you to test it in a virtual machine.
Make this file executable:
$ chmod +x highcpu.sh
Then, run the process in the background using command:
$ ./highcpu.sh &
Sample output:
[1] 2331
Here 2331 is PID of the above process.
To view how much CPU it consumes, use "top" command.
$ top
Sample output:
top - 17:16:34 up 10 min, 2 users, load average: 1.12, 0.53, 0.26 Tasks: 87 total, 4 running, 83 sleeping, 0 stopped, 0 zombie %Cpu(s): 91.9 us, 2.7 sy, 5.4 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 630108 total, 274868 free, 85904 used, 269336 buff/cache KiB Swap: 1343484 total, 1343484 free, 0 used. 428172 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2331 root 20 0 113120 1184 1004 R 97.7 0.2 2:40.91 highcpu.sh 2412 root 39 19 244516 11020 4496 R 1.3 1.7 0:00.11 dnf 10 root 20 0 0 0 0 S 0.3 0.0 0:00.68 rcu_sched 1 root 20 0 43900 6480 3900 S 0.0 1.0 0:01.61 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.06 ksoftirqd/0 6 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u2:0 7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0 11 root 20 0 0 0 0 R 0.0 0.0 0:00.38 rcuos/0 12 root rt 0 0 0 0 S 0.0 0.0 0:00.02 watchdog/0 13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 perf 17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeb
As you see in the above output, highcpu.sh process consumes more than 97% CPU usage. Since it consumed more CPU usage, It is quite difficult to run other tasks. After a few minutes, your system might hang or freeze. This is where CPULimt comes in help.
Now, let us limit the CPU usage of this process using CPULimit tool. Say for example, we will limit this process by PID to 30% CPU.
To do so, run:
$ cpulimit -l 30 -p 2331 &
Here,
- "-l 30" flag limits the process to 30%.
- "-p 2331" is the PID of highcpu.sh
Now, let us again check the CPU usage of the above process using command:
$ top
Sample output:
top - 17:29:16 up 5 min, 1 user, load average: 0.61, 0.57, 0.27 Tasks: 86 total, 2 running, 83 sleeping, 1 stopped, 0 zombie %Cpu(s): 7.2 us, 0.0 sy, 0.0 ni, 92.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 630108 total, 435348 free, 78052 used, 116708 buff/cache KiB Swap: 1343484 total, 1343484 free, 0 used. 442040 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2331 root 20 0 113120 1180 1004 T 29.7 0.2 3:36.97 highcpu.sh 2334 root 9 -11 4324 692 572 S 1.7 0.1 0:00.47 cpulimit 1 root 20 0 43900 6480 3900 S 0.3 1.0 0:01.65 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kworker/u2:0 7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0 10 root 20 0 0 0 0 S 0.0 0.0 0:00.44 rcu_sched 11 root 20 0 0 0 0 R 0.0 0.0 0:00.37 rcuos/0 12 root rt 0 0 0 0 S 0.0 0.0 0:00.05 watchdog/0 13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 perf
As you see in the above output, the CPU usage of highcpu.sh has been dropped to 29.7%, which is very close to 30%. Now, you can have more CPU resources to run other processes freely.
We have seen how to limit a process by PID. Alternatively, we can run the above command by specifying the name of the executable program file.
For example, the above command would be:
$ cpulimit -l 30 ./highcpu.sh &
Similarly, You can start any number processes in the background and limit their CPU usage as you wish.
You can bring the processes which are running in the background to foreground at any time using "fg" command:
$ fg
Sample output:
cpulimit -l 30 -p 2331
Conclusion
CPULimit can be useful while you are running a process that consumes more CPU usage. Next time If you notice a program consumes more CPU usage, just find PID of the process using "top" command and limit its CPU usage to a minimum value using CPULimit command as described above. You can also use this application to test how an application performs under low CPU usage.
Resource: