InicioLinuxLimita el consumo de CPU de las aplicaciones en Linux

Limita el consumo de CPU de las aplicaciones en Linux

Linux9/27/2010

Limita el consumo de CPU de las aplicaciones en Linux




Seguro que en más de una ocasión te habras encontrado con un equipo en cuestión en el que un programa/aplicación específico consume casi todo el tiempo de proceso del ordenador, llegando a dejar al sistema casi sin recursos y en un estado de semicuelgue. En nuestro caso lo hemos comprobado en alguna ocasión con Firefox / Swiftfox. ¿Sabes cómo evitarlo -sin dejar de utilizarlo -obviamente-?.



Como se puede ver en la imagen anterior Swiftfox es el causante del problema que comentamos y vamos a utilizar Cpulimit para limitar el uso de CPU del mismo. Se puede realizar de manera individual, si nos interesa en este momento, o bien utilizar un demonio y automatizar la tarea para cada arranque.

Utilizaremos Ubuntu como sistema base para instalarlo, pero es compatible con otras distribuciones. Se puede descargar desde Ubuntu Software Center, haciendo clic aca o escribiendo el siguiente comando en el terminal:

sudo apt-get install cpulimit

Para utilizarlo sólo tenemos que llamar a la aplicación de la siguiente manera:

sudo cpulimit -p PID -l CPU%

El PID es la identificación del proceso, que podemos ver en la primera imagen, fácilmente desde System Monitor, en nuestro caso 6517. De esta manera tecleando el siguiente comando bloquearíamos una demanda superior al 20%.



Bajando automáticamente el consumo a 18% en este instante:



Como vemos, funciona, pero, ¿y si queremos dejarlo así de manera perenne? Sólo tenemos que configurar un demonio que trabaje como servicio de manera sencilla. Comenzamos instalando CPUlimit y gawk:


sudo apt-get install cpulimit gawk

Creamos un archivo con el nombre cpulimit_daemon.sh con el siguiente contenido



#!/bin/bash

# ==============================================================
# CPU limit daemon - set PID's max. percentage CPU consumptions
# ==============================================================

# Variables
CPU_LIMIT=70 # Maximum percentage CPU consumption by each PID
DAEMON_INTERVAL=3 # Daemon check interval in seconds
BLACK_PROCESSES_LIST="firefox|firefox-bin" # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited.
WHITE_PROCESSES_LIST= # Limit all processes except processes defined in this variable. If variable is empty (default) all violating processes are limited.

# Check if one of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST is defined.
if [[ -n "$BLACK_PROCESSES_LIST" && -n "$WHITE_PROCESSES_LIST" ]] ; then # If both variables are defined then error is produced.
echo "At least one or both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST must be empty."
exit 1
elif [[ -n "$BLACK_PROCESSES_LIST" ]] ; then # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
NEW_PIDS_COMMAND="top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '$9>CPU_LIMIT {print $1}' CPU_LIMIT=$CPU_LIMIT"
elif [[ -n "$WHITE_PROCESSES_LIST" ]] ; then # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6' | grep -E -v '$WHITE_PROCESSES_LIST' | gawk '$9>CPU_LIMIT {print $1}' CPU_LIMIT=$CPU_LIMIT"
else
NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6 && $9>CPU_LIMIT {print $1}' CPU_LIMIT=$CPU_LIMIT"
fi

# Search and limit violating PIDs
while sleep $DAEMON_INTERVAL
do
NEW_PIDS=$(eval "$NEW_PIDS_COMMAND" # Violating PIDs
LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}') # Already limited PIDs
QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$') # PIDs in queue

for i in $QUEUE_PIDS
do
cpulimit -p $i -l $CPU_LIMIT -z & # Limit new violating processes
done
done

y el de cpulimit es éste:

#!/bin/sh
#
# Script to start CPU limit daemon
#
set -e

case "$1" in
start)
if [ $(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | wc -l) -eq 0 ]; then
nohup /usr/bin/cpulimit_daemon.sh >/dev/null 2>&1 &
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon started successfully"; else print " * cpulimit daemon can not be started" }'
else
echo " * cpulimit daemon can't be started, because it is already running"
fi
;;
stop)
CPULIMIT_DAEMON=$(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | wc -l)
CPULIMIT_INSTANCE=$(ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | wc -l)
CPULIMIT_ALL=$((CPULIMIT_DAEMON + CPULIMIT_INSTANCE))
if [ $CPULIMIT_ALL -gt 0 ]; then
if [ $CPULIMIT_DAEMON -gt 0 ]; then
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | xargs kill -9 # kill cpulimit daemon
fi

if [ $CPULIMIT_INSTANCE -gt 0 ]; then
ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | xargs kill -9 # release cpulimited process to normal priority
fi
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon can not be stopped"; else print " * cpulimit daemon stopped successfully" }'
else
echo " * cpulimit daemon can't be stopped, because it is not running"
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
status)
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon is running"; else print " * cpulimit daemon is not running" }'
;;
esac
exit 0


Gracias @SeAgradece por el aporte



CPU_LIMIT: el límite máximo de recursos CPU en porcentaje.
DAEMON_INTERVAL: intervalo de chequeo del sistema
BLACK_PROCESS_LIST: Es una lista de los procesos que monitorizará, por ejemplo “mysql|firefox|gedit“.
WHITE_PROCESSES_LIST: Procesos que NO quieres monitorizar.

Nota: Sólo se puede utilizar una u otra lista, la otra tiene que estar vacía. En la primera se restringe el uso a la aplicación que listes y en la segunda se bloquea el uso a todas menos las que escribas.



Configurando el sistema


Copiar cpulimit_daemon.sh a /usr/bin/

sudo cp ~/cpulimit/cpulimit_daemon.sh /usr/bin
sudo chmod 700 /usr/bin/cpulimit_daemon.sh
Copiar el archivo cpulimit a /etc/init.d/ y configurar los permisos necesarios para ejecución durante el arranque.

sudo cp ~/cpulimit/cpulimit /etc/init.d/
sudo chown root:root /etc/init.d/cpulimit
sudo chmod +x /etc/init.d/cpulimit
sudo update-rc.d cpulimit defaults


Una vez todo listo, sólo queda reiniciar el sistema y ver cómo nuestro ordenador bloquea selectivamente a esas aplicaciones tragonas de CPU, evitando esos incómodos periodos de espera, en nuestro caso, debidos en su mayoría al plugin Flash.

Puedes monitorizar el estado de cpulimit desde consola:

sudo service cpulimit status


Fuente
Datos archivados del Taringa! original
41puntos
0visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
2visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

M
MukenioArg🇦🇷
Usuario
Puntos0
Posts442
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.