Establecer limites de consumo de cpu. #cpulimit

Tras estar probando unas maquinas virtuales con VirtualBox y VMPlayer, hay una opción de VirtualBox para asignar el limite de cpu a una maquina virtual, algo que en VMPlayer no existe y que tal vez a mas de uno le seria necesario.

Uno de los posibles usos que se me ocurre es que si estamos desarrollando alguna aplicación web y esta de repente hace alguna función por la cual se queda ciclada y empieza a consumir muchos recursos, pues estos mismos se pasaran a cpu anfitrión y podría empezar a estar bastante lento con lo cual afectaría a otros programas y/o maquinas virtuales que se estén ejecutando al mismo tiempo.

Entonces se me ocurrió buscar como limitar el consumo de cpu a un determinado proceso en linux, y para ello me encontré con cpulimit.

Para instalar cpulimit basta hacer lo siguiente

# apt-get install cpulimit

Esto sirve para distribuciones basadas en debian.

Ahora para establecer un limite de cpu se puede hacer de dos formas, una es indicando el nombre del programa y la otra es indicando el numero de proceso.

$ cpulimit -e chrome -l 50

Con el comando anterior le estamos diciendo que limite el uso de cpu a Google Chrome en un 50%, esto sirve para un solo procesador en caso de tener una maquina multinucleo el porcentaje sera de 100% por núcleo, es decir si tenemos un cpu con 2 núcleos el valor máximo sera de 200, supongo que si le damos un valor 50 a una maquina de dos núcleos se establecería para cada uno.

Esto se refleja por que el siguiente comando no es valido:

$ cpulimit -e chrome -l 200 -c 0

El parámetro -c indica el numero de cpu y estoy asignando 200% a un solo núcleo cuando la maquina es de dos, si cambio el 200 por 100 entonces ya seria valido.

Para hacer lo mismo pero ahora indicando el numero de proceso seria de la siguiente manera:

$ cpulimit -p 2555 -l 50

Donde 2555 seria el numero de proceso de Google Chrome por ejemplo.

Algo que no se exactamente es que si por ejemplo tenemos muchos procesos llamados chrome como es el caso de Google Chrome, ya que cada pestaña que se abre se ejecuta en un proceso diferente, cpulimit toma en cuenta todos ellos al establecer un limite mediante el nombre. Yo considero que si lo hace por que supongo que al establecer un limite mediante su numero pid estamos siendo bastante específicos al limitar cpu a un proceso en particular.

Actualización

Estuve probado ver si cuando se le pasaba el nombre del programa como parámetro automáticamente tomaba todos los procesos con ese nombre. No lo hace, solo funciona para un solo proceso (nombre), para lo cual se crea un proceso con nombre cpulimit que es el que esta funcionando para el programa que asignamos.

Mi recomendación es que asignemos limites mediante el numero pid.

Por ultimo algo a tener muy en cuenta es que si ejecutamos el comando en modo backgroud para pararlo tendremos que matar el proceso mediante killall o kill. Si lo hacemos con killall mataríamos todos los limites que hubiéramos aignado a diferentes programas, lo mas conveniente es usar kill -9 y el numero de proceso.

Hay que estar pendientes cada vez que ejecutemos saber que numero de proceso cpulimit tiene el nombre o proceso de programa que asignamos ya que solo de esa forma mataríamos el proceso cpulimit y restableceríamos la ejecución normal del programa, esto es algo bastante tedioso y hay que estar usando la consola constantemente.

Busque y no encontré entorno gráfico alguno para este programa, por lo que se me esta ocurriendo que tal vez desarrolle uno para el mismo, veré ahora que tengo vacaciones si puedo llevar a cabo este proyecto.