Límites de memoria de Cgroup y eliminación de procesos

Límites de memoria de Cgroup y eliminación de procesos

Tengo la siguiente situación: (Las siguientes funciones son tomadas de Python)

Tengo un proceso A que se está ejecutando y tiene un límite de memoria de cgroup establecido.

Bifurco un proceso hijo de A usando os.fork(). Llamémoslo B. Luego ejecuto os.execvp para cargar un script de shell dentro de B. Segúnhttp://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/exec.htmleste proceso se ejecuta en el mismo espacio de direcciones que la persona que llama (es decir, B).

El script de shell que se ejecuta en B crea un programa Java que se ejecuta de forma indefinida con un tamaño de montón determinado y eliminación automática en OOM. Esto se logra pasando-XX:OnOutOfMemoryError='matar -9 %p'al comando java. Esto crea otro proceso C como hijo de B.

Mirando desde arriba, veo a B como hijo de A y a C como hijo de B, como se esperaba.

A continuación las dudas:

  1. ¿El límite del grupo c se aplica solo a A o (A+B) o (A+B+C)?

  2. Si se alcanza el límite de memoria, ¿qué procesos se eliminan: A o (A+B) o (A+B+C)? ¿Y por qué? ¿Se identifica mediante pids de proceso o espacio de direcciones del proceso al que se aplica el límite?

  3. Si en el punto anterior no se eliminan todos los procesos, ¿hay alguna manera de ajustar la configuración de cgroup para eliminar también todos los procesos secundarios, ya que en tales casos nos quedaríamos con procesos huérfanos?

Estoy trabajando en Centos7 como sistema operativo subyacente.

Respuesta1

Abordaré cada una de tus preguntas:

  1. El cgroup se aplica a A y a cualquier descendiente de A. Puede experimentar para verificar este comportamiento. Considerar:
Create a new memory cgroup
# mkdir /sys/fs/cgroup/memory/example

Note the shell's PID:
# echo $$
679

Put the running shell into the new cgroup
# echo $$ > /sys/fs/cgroup/memory/example/cgroup.procs

Examine what processes are in the cgroup.  Here 679 was the
shell's PID; 723 is the pid of cat
# cat /sys/fs/cgroup/memory/example/cgroup.procs
679
723

Start a new shell and note its PID
# bash
# echo $$
726

Examine what processes are in the cgroup.  679 was the original
shell.  726 is the second shell.  731 is cat:
# cat /sys/fs/cgroup/memory/example/cgroup.procs
679
726
731
  1. De acuerdo con ladocumentación del grupo c de memoria:

Cuando un cgroup supera su límite, primero intentamos recuperar memoria del cgroup para dejar espacio para las nuevas páginas que el cgroup ha tocado. Si la recuperación no tiene éxito, se invoca una rutina OOM para seleccionar y eliminar la tarea más voluminosa del cgroup.

En base a eso, no elimina todos los procesos en el cgroup; elige el que consume más memoria.

  1. No veo una manera de ajustar qué proceso se elimina para que coincida con lo que estás preguntando aquí. Hay una manera de tener cierto control sobre el asesino OOM; ver por ejemplo estoArtículo de noticias semanal de Linux. Dicho esto, si uno de los procesos principales se elimina, todos los procesos secundarios que tenía se vuelven a asignar al proceso con PID = 1 (de forma predeterminada).

información relacionada