Limites de memória do Cgroup e eliminação de processos

Limites de memória do Cgroup e eliminação de processos

Eu tenho a seguinte situação: (As seguintes funções são retiradas do python)

Eu tenho um processo A que está em execução e possui um limite de memória cgroup definido.

Eu bifurco um processo filho de A usando os.fork(). Vamos chamá-lo de B. Então eu executo os.execvp para carregar um script de shell dentro de B. Conformehttp://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/exec.htmlesse processo é executado no mesmo espaço de endereço do chamador (ou seja, B).

O shell script em execução em B cria um programa Java que é executado indefinidamente com um determinado tamanho de heap e eliminação automática no OOM. Isto é conseguido passando-XX:OnOutOfMemoryError='matar -9 %p'ao comando java. Isso cria outro processo C como filho de B.

Olhando de cima, vejo B como filho de A e C como filho de B, conforme esperado.

Abaixo estão as dúvidas:

  1. O limite cgroup se aplica apenas a A ou (A+B) ou (A+B+C)?

  2. Se o limite de memória for atingido, todos os processos serão eliminados: A ou (A+B) ou (A+B+C)? E porque? É identificado usando pids de processo ou espaço de endereços do processo ao qual o limite é aplicado?

  3. Se no ponto acima, nem todos os processos forem eliminados, existe uma maneira de ajustar a configuração do cgroup para eliminar todos os processos filhos também, já que ficaríamos com processos órfãos nesses casos?

Estou trabalhando no Centos7 como sistema operacional subjacente.

Responder1

Vou abordar cada uma de suas perguntas:

  1. O cgroup se aplica a A e a quaisquer descendentes de A. Você pode experimentar para verificar esse comportamento. 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 acordo comdocumentação do cgroup de memória:

Quando um cgroup ultrapassa seu limite, primeiro tentamos recuperar a memória do cgroup para liberar espaço para as novas páginas que o cgroup tocou. Se a recuperação não for bem-sucedida, uma rotina OOM será invocada para selecionar e eliminar a tarefa mais volumosa do cgroup.

Com base nisso, não mata todos os processos do cgroup; ele escolhe aquele que consome mais memória.

  1. Não vejo uma maneira de ajustar qual processo será eliminado para corresponder ao que você está perguntando aqui. Existe uma maneira de ter algum controle sobre o assassino OOM; veja por exemplo issoArtigo de notícias semanais sobre Linux. Dito isto, se um dos processos pai for eliminado, todos os processos filhos que ele tiver serão reparentados ao processo com PID = 1 (por padrão).

informação relacionada