É possível 'hibernar' um processo no linux? Assim como 'hibernar' no laptop, gostaria de gravar toda a memória usada por um processo no disco, liberando a RAM. E então, mais tarde, posso 'retomar o processo', ou seja, ler todos os dados da memória e colocá-los de volta na RAM e posso continuar com meu processo?
linux
linux-kernel
Hap497
fonte
fonte
Respostas:
Eu costumava manter o CryoPID , que é um programa que faz exatamente o que você está falando. Ele grava o conteúdo do espaço de endereço de um programa, VDSO, referências do descritor de arquivo e estados em um arquivo que pode ser reconstruído posteriormente. O CryoPID começou quando não havia ganchos utilizáveis no próprio Linux e funcionou inteiramente a partir do espaço do usuário (na verdade, ele ainda funciona, dependendo das configurações de distro / kernel / segurança).
Os problemas eram (de fato) sockets, sinais RT pendentes, vários problemas com o X11, a implementação do glibc caching getpid () entre muitos outros. A randomização (especialmente o VDSO) acabou se tornando intransponível para os poucos de nós que trabalhamos nisso depois que Bernard se afastou dela. No entanto, foi divertido e virou tema de várias teses de mestrado.
Se você está apenas pensando em um programa que pode salvar seu estado de execução e reiniciar diretamente nesse estado, é muito ... muito ... mais fácil apenas salvar essas informações de dentro do próprio programa, talvez ao atender um sinal.
fonte
Eu gostaria de colocar uma atualização de status aqui, a partir de 2014.
A resposta aceita sugere CryoPID como uma ferramenta para realizar Checkpoint / Restore, mas achei o projeto não mantido e impossível de compilar com kernels recentes. Agora, eu encontrei dois projetos mantidos ativamente fornecendo o recurso de verificação de aplicativo.
O primeiro, o que eu sugiro porque tenho mais sorte ao executá-lo, é o CRIU que executa checkpoint / restore principalmente no espaço do usuário e requer a opção de kernel CONFIG_CHECKPOINT_RESTORE habilitada para funcionar.
O último é DMTCP ; citando de sua página principal:
Há também uma boa página da Wikipedia sobre o argumento: Application_checkpointing
fonte
As respostas mencionadas
ctrl-z
estão realmente falando sobre parar o processo com um sinal, neste casoSIGTSTP
. Você pode emitir um sinal de parada comkill
:Isso suspenderá a execução do processo. Ele não liberará imediatamente a memória usada por ele, mas como a memória é necessária para outros processos, a memória usada pelo processo interrompido será gradualmente substituída.
Quando você quiser acordá-lo novamente, use
As soluções mais complicadas, como CryoPID, são realmente necessárias apenas se você quiser que o processo interrompido seja capaz de sobreviver a um desligamento / reinicialização do sistema - não parece que você precise disso.
fonte
O problema é restaurar os fluxos - arquivos e soquetes - que o programa abriu.
Quando todo o sistema operacional hiberna, os arquivos locais e outros podem obviamente ser restaurados. As conexões de rede não, mas o código que acessa a Internet é normalmente mais verificação de erros e tal e sobrevive às condições de erro (ou deveria).
Se você fizesse a hibernação por programa (sem suporte de aplicativo), como lidaria com os arquivos abertos? E se outro processo acessar esses arquivos nesse ínterim? etc?
Manter o estado quando o programa não está carregado vai ser difícil.
Simplesmente suspender os threads e permitir que sejam trocados no disco teria o mesmo efeito?
Ou execute o programa em uma máquina virtual e deixe a VM lidar com a suspensão.
fonte
A resposta curta é "sim, mas nem sempre confiável". Confira CryoPID:
http://cryopid.berlios.de/
Arquivos abertos serão de fato o problema mais comum. O CryoPID declara explicitamente:
Os mesmos problemas também afetarão as conexões TCP, embora o CryoPID ofereça suporte a tcpcp para retomar a conexão.
fonte
O kernel do Linux agora implementou parcialmente os futuros de ponto de verificação / reinicialização: https://ckpt.wiki.kernel.org/ , o status está aqui .
Algumas informações úteis estão na lwn (rede semanal linux): http://lwn.net/Articles/375855/ http://lwn.net/Articles/412749/ ......
Então a resposta é sim"
fonte
A resposta curta é sim." Você pode começar procurando por algumas idéias: Reconstrução do executável ELF a partir de uma imagem central ( http://vx.netlux.org/lib/vsc03.html )
fonte
Estendi o Cryopid produzindo um pacote chamado Cryopid2 disponível no SourceForge. Isso pode migrar um processo, bem como hiberná-lo (junto com quaisquer arquivos e sockets abertos - dados em sockets / pipes são sugados para o processo durante a hibernação e devolvidos a eles quando o processo é reiniciado).
A razão pela qual não estive ativo neste projeto é que não sou um desenvolvedor de kernel - tanto este (e / ou o criopid original) precisam ter alguém a bordo que possa fazê-los rodar com os kernels mais recentes (por exemplo, Linux 3.x) .
O método Cryopid funciona - e é provavelmente a melhor solução para hibernação / migração de processos de propósito geral no Linux que encontrei.
fonte
Como outros observaram, é difícil para o sistema operacional fornecer essa funcionalidade, porque o aplicativo precisa ter alguma verificação de erros embutida para lidar com fluxos interrompidos.
No entanto, em uma observação lateral, algumas linguagens de programação e ferramentas que usam máquinas virtuais suportam explicitamente essa funcionalidade, como a linguagem de programação Self .
fonte
Ctrl-Z aumenta as chances de as páginas do processo serem trocadas, mas não libera os recursos do processo completamente. O problema de liberar os recursos de um processo completamente é que coisas como identificadores de arquivo e sockets são recursos do kernel que o processo usa, mas não sabe como persistir por conta própria. Portanto, Ctrl-Z é o melhor que existe.
fonte
Houve alguma pesquisa sobre checkpoint / restauração para Linux em 2.2 e 2.4 dias, mas nunca passou do protótipo. É possível (com as ressalvas descritas nas outras respostas) para certos valores possíveis - se você pode escrever um módulo do kernel para fazer isso, é possível. Mas pelo valor comum do possível (posso fazer isso do shell em uma distribuição Linux comercial), ainda não é possível.
fonte
Esse é o objetivo final do sistema operacional em cluster. Mathew Dillon se esforça muito para implementar algo assim em seu projeto Dragonfly BSD .
fonte
adicionando outra solução alternativa: você pode usar o virtualbox. execute seus aplicativos em uma máquina virtual normal e simplesmente "salve o estado da máquina" quando quiser. Sei que não é uma resposta, mas achei que poderia ser útil quando não havia opções reais.
se por algum motivo você não gosta do virtualbox, vmware e Qemu são tão bons.
fonte
Existe
ctrl+z
no Linux, mas não tenho certeza se oferece os recursos que você especificou. Eu suspeito que você fez esta pergunta, pois nãofonte