Cómo establecer el límite de CPU para el proceso dado de forma permanente. Cpulimit y agradable no funcionan

12

Hay muchas preguntas similares, pero ninguna de ellas me ayuda con mi problema.

Tengo ubuntu 11.10 en el servidor (es la versión de escritorio). Tengo un sitio web en ejecución. Hay un proceso que es muy importante, pero no tiene que ejecutarse con alta prioridad. Quiero limitar permanentemente el uso de la CPU para el proceso , no para el usuario. Este proceso lo ejecuta la función exec (es la función php, no el proceso del sistema).

Entonces veo 2 opciones: 1. Agregar algún tipo de límite cada vez que se ejecuta la función. 2. Limite el uso de la CPU de forma permanente para este proceso.

He intentado usar "nice" y cpulimit, pero nada parece funcionar. Nice no tiene ningún efecto y cpulimit (con -e) dice: "no se encontró ningún proceso objetivo".

Soy un principiante, así que por favor asuma que no sé casi nada.

Rafal
fuente
¿Puede decirnos qué ha intentado? cgroups puede hacer esto por usted.
Panther
En cuanto a la configuración, puede ejecutar el cgsnapshot -spara recuperar la información sin escribir el archivo de configuración manualmente, lo que no se recomienda.
Mingliang Liu
¿Desea acelerar el proceso, es decir, asegurarse de que nunca exceda un tiempo determinado?
Ken Sharp
Usé
Mustafa Salman

Respuestas:

19

En ausencia de detalles solicitados ...

Así es como uso cgroups en ubuntu.

A lo largo de esta publicación, deberá cambiar la variable "$ USER" para el usuario que ejecuta el proceso

Agregué información para la memoria y eso será una pregunta frecuente, si no la necesita, no la use.

1) Instalar cgroup-bin

sudo apt-get install cgroup-bin

2) reiniciar. cgroups ahora se encuentra en/sys/fs/cgroup

3) Crea un cgroup para tu usuario (el propietario del proceso)

# Change $USER to the system user running your process.
sudo cgcreate -a $USER -g memory,cpu:$USER

4) Su usuario puede administrar recursos. Por defecto, los usuarios obtienen 1024 unidades de CPU (recursos compartidos), por lo que para limitar a aproximadamente 10% de CPU, la memoria está en bytes ...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5) Comience su proceso (cambie exec a cgexec)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

Configuración

Asumiendo que cgroups están trabajando para usted;)

Editar /etc/cgconfig.conf, agregar en su grupo c personalizado

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
sudo -e /etc/cgconfig.conf

Agregue en su cgroup. Nuevamente cambie $ USER por el nombre de usuario que posee el proceso.

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

También puede especificar grupos gid=$GROUP, /etc/cgconfig.conf está bien comentado.

Ahora vuelve a ejecutar tu proceso con cgexec -g cpu:$USER command <options>

Puede ver su proceso (por PID) en /sys/fs/cgroup/cpu/$USER/tasks

Ejemplo

bodhi @ ufbt: ~ $ cgexec -g cpu: bodhi sleep 100 &

[1] 1499

bodhi @ ufbt: ~ $ cat / sys / fs / cgroup / cpu / bodhi / tareas

1499

Para obtener información adicional, consulte: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/

Pantera
fuente
2
Logré terminar la parte 1. Está funcionando, pero debes agregar información de que el proceso es limitado solo mientras que otro proceso necesita CPU / memoria. No es obvio, y me lleva mucho tiempo darme cuenta (ya que soy un principiante). ¿Entiendo correctamente que "Configuración" es guardar la configuración incluso después de reiniciar?
Rafal
1
Me alegro de que lo arregló. Hay un poco de una curva de aprendizaje =) Sí, la configuración es mantener la configuración durante el arranque.
Panther
Cuando uso cgroup desde la línea de comando funciona bien. Pero cuando ejecuto el mismo comando desde la función exec en php: (<? Php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile"); no funciona. La única diferencia es que desde la línea de comandos utilizo archivos que están en carpeta en la que estoy y desde PHP utilizo una ruta larga a esos archivos. ¿Alguna idea de qué puede ser un problema? Uso el mismo usuario en ambos casos.
Rafal
1
@ Rafal: No creo que su primer comentario sea ​​correcto, la memoria debería estar limitada incluso si ningún otro proceso está ocupando mucha memoria.
Flimm
1
@Flimm Solo 2 procesos se estaban ejecutando cuando estaba probando esta solución: apache y proceso que deberían ser limitados. Cuando no había una conexión apache activa o solo había una conexión a apache, ese proceso limitado requería el 100% de la CPU. Se limitó solo una vez que se activaron varias conexiones a apache (lo hice renovando mucho el sitio web desde el navegador web). Entonces, tal vez no se haya ejecutado ningún otro proceso.
Rafal