¿Ejecutar el proceso de Linux con muy, muy baja prioridad?

12

Tengo un proceso regular que no es tan importante pero que consumirá mucha energía de la CPU, y tengo otro proceso que es realmente importante, pero pasa la mayor parte del tiempo inactivo, pero cuando tiene un trabajo realmente necesita una gran potencia de cómputo

Intenté funcionar con nice -20 ./low_priority_processy nice --20 ./high_priority_processsin embargo sigue siendo la prioridad más baja consumir gran cantidad de CPU al proceso de alta prioridad está en la necesidad, ¿cómo puedo ejecutar un proceso que realmente va a producir o incluso se suspenderá automáticamente cuando otro proceso utilizando energía de la CPU

uray
fuente
¿Cómo está determinando que el proceso de alta prioridad es realmente necesario?
muru
que se generan una gran cantidad de hilos, o el proceso de comer la cpu más de 50% de la capacidad de la CPU
uray
Utilice la RRprogramación para el proceso de alta prioridad.
Ramesh
@Ramesh ¿Qué posible diferencia hará eso?
Ken Sharp

Respuestas:

10

Eche un vistazo a cgroups , debe proporcionar exactamente lo que necesita: reservas de CPU (y más). Sugeriría leer la prioridad de control de las aplicaciones que usan cgroups .

Dicho esto, coloque los procesos importantes pero a menudo inactivos en grupo con el 95% de la CPU asignada y sus otras aplicaciones en otra con el 5% asignado: obtendrá (casi) toda la potencia para sus trabajos cuando sea necesario, mientras que constantemente el proceso de hambre de energía solo obtendrá un 5% como máximo en esos momentos. Cuando desaparecen las sobretensiones computacionales, todo el rendimiento de la CPU se lanzará a los procesos restantes. Como beneficio, si crea un cgroup especial (con requisitos mínimos de rendimiento) para procesos como sshd, podrá iniciar sesión sin importar lo que intente obtener toda la CPU que pueda; se reservará un tiempo de CPU sshd.

Peterph
fuente
1
¿hay un comando como cpulimito nicepara modificar el cgroup de proceso? porque si cgroup es una llamada API, estoy en posición de no poder recompilar ninguna de esas aplicaciones para usar cgroup
uray
No, simplemente monta la jerarquía de cgroup en algún lugar, crea directorios por grupo y escribe PID de procesos en algunos archivos. Todo esto debe hacerse como root (o, más precisamente, con los privilegios apropiados). Algunos sistemas init (es decir systemd, al menos en algunos casos) "roban" la interfaz cgroups de los usuarios que tienen que usar la interfaz del sistema init (generalmente un comando especial). Lea la respuesta vinculada y el artículo de Wikipedia. De Verdad. :)
Peter
Ah, y también hay un libcgrouppaquete, que viene con utilidades para trabajar con cgroups, incluido un daemon ( cgrulesengd) que en realidad puede ordenar los procesos en grupos según algunas condiciones.
Peter
7

Si la prioridad del proceso (valor agradable) es baja, no interrumpirá un proceso de mayor prioridad. La razón por la que se está viendo el proceso de baja prioridad sigue siendo el consumo de una cantidad significativa de CPU cuando el proceso de mayor prioridad está en funcionamiento se debe a que el proceso de mayor prioridad no es que ocupados. Probablemente esperando a IO. Úselo chrt -p -i 0 $PIDpara ejecutar el proceso con una prioridad aún menor que nice 19 -p $PID(suponiendo que estamos hablando de Linux aquí).

chrt -p -i 0 $PID pone el proceso en el planificador inactivo "verdadero".

http://linux.die.net/man/1/chrt

Ken Sharp
fuente
2
chrt -p -i 0 $ PID
Robert Foss
chrt todavía no es suficiente. Lo que intento hacer es mirar videos mientras se vuelven a codificar otros videos en segundo plano. El uso de chrt ayudó con los videos de youtube pero los mkvs de muy alta calidad aún se saltan. Lo que deseaba era reproducir mi video normalmente, pero usar cada bit de energía de la CPU restante para volver a codificar porque tengo mucho que hacer.
Soger
0

Pruebe este ejemplo para ejecutar un proceso como un proceso bajo.

Si tu trabajo es bueno tar xvf asets.zip

Utilizar

bonito alquitrán xvf assets.zip

Después de eso, emitir

arriba para monitorear el proceso descomprimir con

ps aux | grep "alquitrán"

Prueba algo específico con cpulimit

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

cpulimit -l 50 python 0 9999999999> / dev / null &

unixmiah
fuente
Sí, -20es de "baja prioridad" y --20es de "alta prioridad". Mire el guión doble para el nicecomando. y sí, entiendo completamente sobre el buen valor, pero mi pregunta es, ¿hay alguna manera de decirle al planificador que no sea usar un buen valor
uray
2
@ user77710 ¿estás seguro? Ni la página de manual de Ubuntu ni la página de manual de POSIX especifican esta sintaxis. Ambos usan -n -20, -n 20etc.
muru
sí lo que, la sintaxis no es importante, mi punto es el valor settng agradable de muy baja y muy alta para ambos procesos no da el resultado de lo que quería
uray
2
@ user77710 ¿QUÉ? "la sintaxis no es importante"? ¿Cómo puede estar seguro de que está estableciendo los valores de amabilidad entonces?
muru
porque puedo ver el valor buen proceso de htopo topo pso lo que sea
uray
-1

Para futuras llegados, aquí es un ejemplo completo de nicela tensión .

  1. La máquina de prueba tiene 2 CPU.
$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2 
On-line CPU(s) list: 0,1
Thread(s) per core:  2
...
  1. Instalar stress:apt-get install stress
  2. Haga que las 2 CPU estén ocupadas con una llamada de baja prioridad al estrés: nice -20 stress --cpu 2
  3. Verifique el uso de la CPU con top:
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15894 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.43 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.42 stress                                                                                    

Esto muestra que ambas CPU están completamente ocupadas.

  1. Inicie un proceso de estrés de una sola CPU con alta prioridad: nice --20 stress --cpu 1
  2. Verifique el uso de la CPU nuevamente con top
                                                 v
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15928 ubuntu    20   0    8240    100      0 R  99.7  0.0   0:24.02 stress                                                                                    
15894 ubuntu    39  19    8240     96      0 R  51.2  0.0   1:12.46 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  48.8  0.0   1:12.35 stress                                                                                    

Esto muestra que el proceso de estrés de un solo núcleo obtiene su CPU completa, mientras que los procesos de menor prioridad comparten la 1 CPU restante

  1. Por otro lado, matar todas las stressllamadas anteriores y solo activar un solo proceso de 3 stress --cpu 3le daría un 66% de CPU a cada uno
Shadi
fuente