Monday, January 30, 2017

[Quick Tips: Limit CPU Usage]: How To Limit CPU Usage Of A Process In Linux

How To Limit CPU Usage Of A Process In Linux

Some times, a particular 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 the particular process to finish before starting a new task. Luckily, this can be now solved by an useful utility called CPULimit. As the name implies, CPULimit limits the CPU usage of a process. This can be really 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 Unix-like distributions. In this brief guide, we will see how to limit the CPU usage of a process in Linux.

Limit CPU Usage Of A Process In Linux using CPULimit

Install CPULimit

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

Usage

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;

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, you 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: 

No comments: