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.


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).



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.


-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

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'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.