Suponha que eu queira encerrar um processo em uma máquina Linux com swap (que na verdade é um zram). A troca tem metade do tamanho da RAM. Há apenas 10% de espaço livre na RAM e a troca também está quase cheia.
O processo usa apenas 2% de RAM, mas cerca de 90% de swap.
Fazer um fechamento suave (SIGTERM) e permitir que o processo capte o sinal e feche sozinho causaria o cancelamento de todos os mapeamentos trocados, mas não há RAM livre suficiente para acomodar todo o processo.
Por causa disso, pode ser melhor encerrar o processo com SIGKILL, mas ainda tenho medo de que o OOM-killer elimine outros processos ou até mesmo toda a sessão X ou inicialização devido à falta de memória.
Então, enviar um sinal kill faz com que o kernel mova partes trocadas do processo para a memória física?(O que devo esperar? Depende da versão do kernel?)
Se sim, o que fazer nesse caso? O objetivo é encerrar o processo sem mexer no restante (há outros processos importantes em execução).
Além disso, como eliminá-lo corretamente quando não é um processo, mas uma árvore de processos e não posso deixar o aplicativo terminar sozinho?
Responder1
De modo geral, as páginas não são trocadas de volta para a RAM, a menos que sejam necessárias. Ou seja, a página só seria carregada de volta na RAM se a página fosse realmente acessada por algo (causando uma exceção de falha de página na MMU que o sistema operacional trataria carregando a página de volta na RAM antes de permitir que o thread de acesso continuasse). A eliminação forçada do processo (com SIGKILL) não executa nenhum dos threads do processo, portanto, o processo eliminado não pode tentar acessar nenhuma de suas páginas, e essas páginas não devem ser carregadas na RAM.
Na verdade, mesmo que você não elimine o processo e ele retome a execução, ele ainda trocará (para a RAM) apenas as páginas que realmente acessa. Além disso, se toda a RAM estiver cheia e precisar acessar outra página que não esteja na RAM, o sistema operacional selecionará alguma outra página da RAM para trocar (para o disco) para liberar espaço na RAM para a página que seu programa precisa acessar. Enquanto houver espaço na partição swap do disco, essa troca de páginas pode continuar indefinidamente, mantendo tudo vivo, sem acionar o assassino OOM. É claro que, se isso acontecer com frequência, pode realmente tornar sua máquina mais lenta, pois ela gasta a maior parte do tempo movendo a memória entre a RAM e o disco, em vez de executar instruções do programa. Isso é chamado de "debulha".
Responder2
em relação à eliminação de toda a árvore de processos, você pode tentar o seguinte:
# in pid is saved pid of the parent process
CPIDS=`pgrep -P $pid` # gets pids of child processes
for cpid in $CPIDS ; do kill -9 $cpid ; done # first kill children
kill -9 $pid # then the parent (yeah, that sound kinda bad)