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:
O limite cgroup se aplica apenas a A ou (A+B) ou (A+B+C)?
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?
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:
- 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
- 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.
- 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).