Está enviando o SIGKILL para um processo trocado antes de ser eliminado?

6

Suponha que eu queira finalizar um processo na máquina Linux com swap (que é na verdade um zram). A troca é metade do tamanho da RAM. Há apenas 10% de espaço livre na RAM e a troca também está quase cheia.

O processo está usando apenas 2% de RAM, mas cerca de 90% de swap.

Fazer um fechamento suave (SIGTERM) e permitir que o processo capture o sinal e feche sozinho causaria a perda de todos os mapeamentos trocados, mas não há memória RAM suficiente para caber todo o processo.

Por causa disso, pode ser melhor matar o processo com o SIGKILL, mas ainda tenho medo de que o OOM-killer mate outros processos ou até mesmo a sessão X inteira ou o init devido a falta de memória.

Então, o envio de um sinal de 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 é terminar o processo sem tocar no resto (existem outros processos importantes em execução).

Além disso, como matá-lo corretamente quando não é um processo único, mas uma árvore de processos e não posso deixar o aplicativo terminar sozinho?

    
por Adam W. 13.04.2017 / 16:49

2 respostas

0

sobre matar toda a árvore de processos, você pode tentar isto:

# 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)
    
por 31.05.2017 / 18:05
0

Em geral, as páginas não são trocadas de volta na 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 SO controlaria carregando a página de volta na RAM antes de permitir que o thread de acesso continuasse). Matar com dificuldade o 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 se você não matar o processo e ele continuar a ser executado, ele ainda trará (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 SO selecionará alguma outra página da RAM para trocar (em disco) para liberar espaço na RAM para a página que seu programa precisa acessar. Contanto que haja algum espaço na partição swap no disco, essa troca de páginas pode continuar indefinidamente, mantendo tudo vivo, sem acionar o killer da OOM. É claro que, se isso acontecer muito, pode realmente desacelerar sua máquina, porque ela está gastando a maior parte do tempo movendo a memória entre a RAM e o disco, em vez de executar as instruções do programa. Isso é chamado de "surra".

    
por 23.10.2017 / 21:27