Limitar el uso de CPU por parte de un proceso en Linux

cpulimit

En ocasiones nos encontramos con algún programa que consume más CPU de lo deseado, incluso provocando que el entorno gráfico deje de responder. En GNU/Linux es posible controlar eso, con una sencilla pero eficaz herramienta llamada cpulimit.

Cpulimit se encarga de limitar el uso de CPU por proceso, en un porcentaje respecto del total del sistema.

Proceso que podemos identificar mediante la ruta del programa, el nombre del ejecutable o bien mediante su PID.

De las tres opciones la que más me gusta es la última, así que vamos a tomar el cliente de bittorrent deluge como ejemplo y vamos a ver cual es el número que identifica su proceso activo, antes de proceder a cortarle las alas con cpulimit.

[jose@replicante ~]$ ps -A | grep deluge

15067 tty2 00:00:51 deluge-gtk

Ahora le limitamos a un máximo del 5% de consumo de CPU su ejecución (algo extremo lo se).

sudo cpulimit -p 15067 -l 5

Un comando bastante sencillito, donde la variable -p va seguida del número PID correspondiente al proceso y -l del tanto por cierto de CPU que le asignamos.

Se puede ejecutar con o sin privilegios de root. La diferencia es que si lo ejecutamos con “sudo” establece su prioridad automáticamente respecto a otros procesos. Un poco en la linea de los comandos nice y renice, también muy interesantes y de los que un día de estos habrá que hacer un post (aunque como diría Vito Corleone, es posible que ese día nunca llegue).

cpulimit2

Si además queremos ver las estadísticas en tiempo real y extender dicho límite a los procesos hijos, le añadimos un par de parámetros más:

sudo cpulimit -p 15067 -l 5 -v -i

Técnicamente lo que hace el programa para mantener los valores máximos establecidos de CPU es enviar señales de tipo SIGSTOP y SIGCONT, de forma periódica al proceso que hayamos seleccionado.

Un ajetreado “parar y continuar”, que permite a cpulimit adaptarse de forma dinámica, casi inmediata, a la carga total existente en ese momento.

En los sistemas con multiprocesador, habrá que tener en cuenta su número a la hora de establecer el límite (por ejemplo si tenemos 8 núcleos, el intervalo irá del 0 al 800 % y si queremos limitar el porcentaje de uso a la mitad, tendríamos que establecer un valor de 400% )

Instalación en Linux

Vamos a ver como instalarlo en algunas de las principales distribuciones GNU/Linux, tirando de terminal.

  • En Arch Linux y derivadas como Manjaro o Antergos:
sudo pacman -S cpulimit
  • En Debian, Ubuntu y derivadas varias (Elementary OS, Linux Mint):
sudo apt install cpulimit
  • En openSUSE:
su

zypper in cpulimit

Si queréis saber más sobre cpulimit os podéis pasar por su página de Github. Obviamente una limitación exagerada de CPU puede afectar al rendimiento del programa en cuestión. Pero para determinadas tareas repetitivas o aplicaciones que tienden a desmadrarse es un programa muy interesante.

14 thoughts on “Limitar el uso de CPU por parte de un proceso en Linux”

  1. Roberto D says:

    el comando correcto en Debian, Ubuntu y derivados es
    apt install cpulimit

    o

    aptitude install cpulimit.

    Creo que en el articulo esta como una errata porque falta la opcion “install” del comando apt o de aptitude

    1. tannhausser says:

      Corregido!

      Se ve que me emocioné al quitarle el “get” y me llevé el “install” también por delante.

      Gracias por la observación.

  2. José GDF says:

    Hace un tiempo le vi cierta utilidad para no quemar el procesador en renders largos de Blender.

    Lo que no terminaba de entender es lo del número para limitar. En mi caso, cuatro núcleos, para reducir a la mitad sería 200, supongo.

    1. tannhausser says:

      Exacto es como tu dices.

  3. monxp says:

    Este comando no lo conocía, ¡que útil!

    Ya lo estoy usando en un cluster de virtualización de la empresa. Algunas VM de Windows se desmadran y con esto puedo limitar el consumo innecesario de CPU.

    Muchas gracias por ilustrarnos tannhausser.

    1. tannhausser says:

      De nada @monxp, gracias a ti por pasarte y comentar 🙂

  4. alunado says:

    que buen tip, que buena info! aparte el resumen de lo que uno quiere saber, lo mas importante para ejecutarlo sin “comerse” el man..jeje

    Gracias tannhausser.

    1. tannhausser says:

      De nada amigo!

      PD: “No manual entry for cpulimit”

  5. Héctor Jaime García Rojas says:

    Muchas gracias por el dato, como única duda ¿ La configuración indicada al reiniciar se pierde? R= Claro, ya que al iniciar el proceso aparece con un PID diferente.

    Hay alguna manera de hacerlo no se, por nombre de programa o similar ?¿

    Tiene tiempo que sigo tu foro, muy bueno saludos !

    PD: Mi primer comentario.

    1. Joan says:

      Hola Héctor, tal y como se indica en el post original, se puede limitar también por ruta o comando ejecutado, por tanto, si que es posible 😉
      Pd.: también es mi primer comentario, pero estoy viciado a tu blog, muchas felicidades por él!

      1. tannhausser says:

        Bueno pues gracias a los dos. Tal como comenta @Joan lo puedes limitar con el nombre del ejecutable. Incluso puedes crearte un script en bash con el comando cpulimit correspondiente y marcarlo como programa de inicio para su ejecución.

  6. Fede Diaz says:

    No me aparece -i como opción en cpulimit v2.0……
    Saludos

    1. tannhausser says:

      Debe ser una función incluida recientemente. En mi caso en Antergos (cpulimit 20160304-1) si aparece.

  7. Vicent Vega says:

    ¡Post genial! Gracias tannhausser.

    Solo añadir: También puedes indicar el nombre del proceso si no sabes su PID con el parámetro -e:

    http://www.sysadmit.com/2016/09/linux-limitar-uso-cpu-con-cpulimit.html

Deja un comentario