Per limitare l’utilizzo della cpu sui sistemi linux è possibile usufruire dell’utility CPULIMIT.

  1. Installazione Cpulimit

Debian/Ubuntu

claudio@ubuntu:~$ sudo apt-get install cpulimit

CentOS 6

Prima di tutto installare il repository EPEL seguendo le istruzioni di questo articolo (REMI non è necessario):

http://www.homelab.it/index.php/2014/05/20/come-installare-i-repositories-epel-e-remi-su-centos-6

Una volta acquisito il repository, installare cpulimit:

[root@centos6 ~]# yum install cpulimit

  1. Test Cpulimit

Per spiegare il funzionamento di cpulimit nel migliore dei modi, utilizzerò uno script bash che creerà loop fino a portare la CPU al limite.

Tramite editor creare un file dal nome loop.sh e srivere:

#!/bin/bash
while true
do
        :;
done

Salvare il file e renderlo eseguibile:

[root@centos6 ~]# chmod +x loop.sh

Eseguire lo script in background:

[root@centos6 ~]# ./loop.sh &
[1] 8928 <-- Numero pid processo
[root@centos6 ~]#

Controllare l’utilizzo della cpu da parte dello script loop.sh:

[root@centos6 ~]# top
top - 23:05:08 up 6 days, 12:44,  1 user,  load average: 0.51, 0.64, 0.36
Tasks: 100 total,   2 running,  98 sleeping,   0 stopped,   0 zombie
Cpu(s): 33.3%us,  0.1%sy,  0.0%ni, 66.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2979068k total,  2825512k used,   153556k free,   424712k buffers
Swap:  1675256k total,    47504k used,  1627752k free,  2170224k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 8928 root      20   0  5060 1144 1012 R 100.0  0.0   7:01.62 loop.sh

Come si può notare lo script sta spremendo il processore al massimo.

Per limitare l’utilizzo al 30% tramite cpulimit, individuare il numero pid del processo e scrivere:

[root@centos6 ~]# cpulimit -l 30 -p 8928 &
[2] 8956
Process 8928 detected
[root@centos6 ~]#

Ricontrollare lo stato del processo per confermare l’applicazione del limite:

[root@centos ~]# top
top - 23:09:34 up 6 days, 12:48,  1 user,  load average: 0.39, 0.60, 0.42
Tasks: 101 total,   1 running,  99 sleeping,   1 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.3%ni, 99.5%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2979068k total,  2825140k used,   153928k free,   424712k buffers
Swap:  1675256k total,    47504k used,  1627752k free,  2170224k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 8928 root     

Per terminare l’utilizzo di cpulimit basta cercare il numero pid ed eseguire il comando kill:

[root@centos6 ~]# ps aux | grep cpulimit
root      8956  0.0  0.0   2184   576 pts/0    S<   23:07   0:00 cpulimit -l 30 -p 8928
root      8960  0.0  0.0   4364   744 pts/0    S+   23:12   0:00 grep cpulimit

[root@centos6 ~]# kill -9 8956

[2]-  Killed                  cpulimit -l 30 -p 8928
[root@centos6 ~]#

Tengo a precisare che al momento dell’esecuzione di cpulimit è possibile specificare anche il nome dell’esegubile, a discapito del numero pid, con lo switch: -e nomeprocesso

(La procedura è compatibile sia su CentOS6, Ubuntu e Debian)