Suspender / retomar processo único para / do disco

22

Ocasionalmente, gostaríamos de suspender processos com muita memória em nossos servidores Ubuntu e OS X para liberar temporariamente RAM para outros trabalhos. Se estivéssemos preocupados com o uso da CPU, um simples Ctrl-Zfuncionaria. No entanto, precisamos liberar a RAM (gravando-a no disco) e reiniciar o processo (disco -> RAM) ou, em outras palavras, "hibernar" um único processo. Alguma pista sobre como fazer isso? (De preferência da CLI.) Obrigado.

Mike Covington
fonte
7
Suponho que, quando um processo está em um estado suspenso, sua memória usada é candidata a uma troca de disco, se necessário, e isso deve ser feito automaticamente a partir do kernel.
enzotib 22/10/11
1
@enzotib - Não faço ideia se isso ocorre e, em teoria, isso soa bem. No entanto, eu apenas fiz um teste difícil e, na prática, não funciona. Quaisquer novos processos gerados enquanto 'comedores de RAM' estão suspensos são extremamente lentos e não detecto nenhuma atividade em disco que seria esperada se a RAM estivesse sendo trocada para o disco.
Mike Covington
1
@frozenwithjoy Posso confirmar que isso ocorre. As únicas razões pelas quais consigo pensar que um processo suspenso não seria gradualmente trocado é se for solicitada memória não trocável (muito rara e (principalmente) reservada para raiz) ou se a memória mapeada for compartilhada com outro processo ativo .
Gilles 'SO- stop be evil'
1
Um termo que pode ajudar aqui é "ponto de verificação" (sim, uma forma verbal feia). Geralmente, esse é um problema difícil, pois o programa pode estar usando alguns recursos que podem mudar de estado enquanto o programa está em suspensão. Gerenciar esse problema costumava ser uma das distinções entre Big Iron e pequenos computadores complicados.
dmckee

Respostas:

8

Não há facilidade geral para hibernar um único processo, apenas todo o sistema.

No entanto, se você não se importa com o fato de a imagem do processo não sobreviver a uma reinicialização, há um recurso interno para salvar a imagem do processo no disco: troca. Verifique se você possui espaço de troca suficiente e, se houver pressão de memória e o processo não estiver ativo (por exemplo, porque está suspenso), sua memória será trocada.

Se você sabe que o processo provavelmente ficará inativo por um longo tempo e precisará de um tempo de resposta rápido em algum momento, você pode forçar a liberação de muita RAM agora, alocando muita RAM em uma processo de curta duração, por exemplo

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

Você não tem controle sobre o que é trocado, portanto outros processos podem ser trocados. No Linux, você pode alternar um processo acessando à força as páginas que ele mapeia. O script nesta resposta fará isso: carregar na memória todas as páginas mapeadas por um processo (observe que isso inclui arquivos abertos; você pode percorrer regiões seletivamente com base nas informações do mapa para evitar a troca de dados que você sabe que não precisará , consulte esta resposta para obter mais informações).

Gilles 'SO- parar de ser mau'
fonte
13

O termo que você está procurando é " Ponto de verificação do aplicativo ".

As ferramentas que eu sei que podem fazer isso são o CryoPID e o CryoPID2 .

Ambas as ferramentas são apenas para Linux.

Não conheço uma ferramenta semelhante para BSD ou OS X.

Ikem
fonte
2
Outro aplicativo para uso é DMTCP: dmtcp.sourceforge.net
Deer Hunter
5

Verifique se você tem bastante espaço de troca. Verifique se o seu sistema está configurado para preferir trocar páginas inativas ( vm.swappiness = 100 ). Então deve ser suficiente suspender o processo. O kernel prefere trocar as páginas inativas.

David Schwartz
fonte
-1

No Mac OS X, você pode tentar usar o purgecomando (fornecido com o Xcode) para liberar alguma RAM (inativa).

vm_stat
purge
vm_stat
jefz
fonte
2
purgenão ajudaria aqui. Ele remove o cache do disco, mas isso não fará com que a memória de um processo seja trocada e não tornará mais rápido para outro processo obter RAM.
Gilles 'SO- stop be evil'