
Tengo un script que comienza en grande, un árbol de procesos que consume CPU y memoria. Hay Python y ejecutables ahí abajo, pero todo comienza con un único script bash y subprocesos de Python.
Durante la ejecución, el resto del sistema queda completamente bloqueado. Intenté mitigarlo
$ nice -n10 ionice -c2 ./Script.sh
, sin embargo, esto no es suficiente: el uso de la computadora es muy lento (en realidad, este es un escritorio de desarrollo, pero el problema en el servidor designado será el mismo).
Sospecho que el problema está en los procesos que utilizan demasiada memoria: todo termina intercambiado y se vuelve lento.
¿Hay alguna manera de reducir la prioridad de un proceso (y sus hijos recursivos) en el acceso a la memoria física? Prefiero que se haga más lento en segundo plano con una influencia limitada en otras tareas.
Respuesta1
No puede limitar el "ritmo" de consumo de memoria, pero puede limitar su uso total de memoria mediante varios mecanismos diferentes.
1) límites de seguridad Limite el uso de memoria para el usuario que ejecuta el proceso a través de /etc/security/limits.conf. Es posible que esto no funcione en su caso si está ejecutando este proceso como el mismo usuario trabajando en cosas diferentes.
Ejemplo:
username hard as 1000000
2) Grupos de control Puede, con cgroups, crear un grupo y también limitar el uso de memoria. Simplemente crea un cgroup, así:
# cat >> /etc/cgconfig.conf << EOF
group memlimit {
memory {
memory.limit_in_bytes = 1073741824;
}
}
EOF
# cat >> /etc/cgrules.conf <<EOF
username memory memlimit/
EOF
Por supuesto, en ambos casos, debe desarrollar su programa para que pueda recuperarse de no poder asignar más memoria.
En caso de que no sea posible, sólo necesita agregar más memoria a su sistema para evitar el intercambio. Una vez que comienza el intercambio, está en manos del kernel y no puede, por ejemplo, reducir la prioridad de kswapd, e incluso si pudiera, eso no garantiza que algunos de los programas que usa no se intercambien de todos modos. fuera, provocando así una respuesta del sistema aún más lenta. Simplemente no vayas allí.
Respuesta2
Si bien el siguiente no lo ayudará con el intercambio de memoria, debería ayudarlo con el impacto IO de su proceso.
level
Parece que también deberías configurarlo explícitamente .
ionice -c2 -n5 ./slowscript.sh
Es posible que C2 por sí solo no sea suficiente, dependiendo de su kernel.
Cita de la página de manual ( man ionice
)
Note that before kernel 2.6.26 a process that has not asked for an I/O priority formally uses "none" as scheduling class, but the I/O scheduler will treat such
processes as if it were in the best-effort class. The priority within the best-effort class will be dynamically derived from the CPU nice level of the process:
io_priority = (cpu_nice + 20) / 5.
For kernels after 2.6.26 with the CFQ I/O scheduler, a process that has not asked for an I/O priority inherits its CPU scheduling class. The I/O priority is
derived from the CPU nice level of the process (same as before kernel 2.6.26).
Básicamente: cada proceso recién iniciado obtendrá C2 N4, por lo que cuando desee reducir el IO al mínimo posible, vaya solo a inactivo (C3) o C2 N7.