Como “hibernar” um processo no Linux armazenando sua memória em disco e restaurando-o mais tarde?

99

É 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?

Hap497
fonte
8
Pergunta interessante: D
hazardstat em
O que você descreve geralmente é chamado de 'ponto de verificação', você pode ter mais sorte ao pesquisar com esse termo.
Tim Post
Deve ser. Bom recurso. Hibernate vs close.
Vitaly Fadeev de
unix.stackexchange.com/questions/43854/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respostas:

54

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.

Tim Post
fonte
5
Em julho de 2014, infelizmente, o CryoPID não é mais mantido e não roda em kernels recentes. Mas nesse ínterim, novos projetos nascem (alguns passos foram dados até na "hibernação" da conexão TCP). Coloquei uma resposta abaixo com informações atualizadas. Confira! ;)
dappiu
1
@dappiu Isso é ótimo - mas o CryoPID foi apenas um exemplo nesta resposta para ilustrar o quão complicado pode ser, onde eu passei a sugerir que eles salvassem o estado dentro do próprio programa, de forma que pudesse ser facilmente retomado. A estagnação do CryoPID não torna a resposta menos relevante.
Tim Post
Cryopid2 está ativo mais recentemente (2013): sourceforge.net/projects/cryopid2
Leopd
31

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.

Checkpoint / Restore In Userspace, ou CRIU (pronuncia-se kree-oo, IPA: / krɪʊ /, Russo: криу), é uma ferramenta de software para o sistema operacional Linux. Usando esta ferramenta, você pode congelar um aplicativo em execução (ou parte dele) e marcá-lo em um disco rígido como uma coleção de arquivos. Você pode então usar os arquivos para restaurar e executar o aplicativo a partir do ponto em que foi congelado. A característica distintiva do projeto CRIU é que ele é implementado principalmente no espaço do usuário.

O último é DMTCP ; citando de sua página principal:

DMTCP (Distributed MultiThreaded Checkpointing) é uma ferramenta para verificar de forma transparente o estado de vários aplicativos simultâneos, incluindo aplicativos multi-threaded e distribuídos. Ele opera diretamente no executável binário do usuário, sem quaisquer módulos do kernel Linux ou outras modificações do kernel.

Há também uma boa página da Wikipedia sobre o argumento: Application_checkpointing

dappiu
fonte
20

As respostas mencionadas ctrl-zestão realmente falando sobre parar o processo com um sinal, neste caso SIGTSTP. Você pode emitir um sinal de parada com kill:

kill -STOP <pid>

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

kill -CONT <pid>

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.

caf
fonte
13

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.

Vai
fonte
12

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:

Arquivos abertos e deslocamentos são restaurados. Os arquivos temporários que foram desvinculados e não estão acessíveis no sistema de arquivos são sempre salvos na imagem. Outros arquivos que não existem na retomada ainda não foram restaurados. O suporte para salvar o conteúdo do arquivo para tais situações está planejado.

Os mesmos problemas também afetarão as conexões TCP, embora o CryoPID ofereça suporte a tcpcp para retomar a conexão.

Ulisses Montenegro
fonte
3
Depois de clicar no botão de envio, agora percebo que isso se parece muito com spam / propaganda do CryoPID. Não é - sou simplesmente um usuário satisfeito do utilitário, na verdade.
Ulisses Montenegro
6

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.

Mark O'Neill
fonte
3

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 .

Cerin
fonte
0

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.

Tobu
fonte
0

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.

florim
fonte
0

Esse é o objetivo final do sistema operacional em cluster. Mathew Dillon se esforça muito para implementar algo assim em seu projeto Dragonfly BSD .

Nikolai Fetissov
fonte
Este recurso está totalmente implementado no Dragonfly BSD?
Arjun J Rao
0

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.

Omid Ataollahi
fonte
-2

Existe ctrl+zno Linux, mas não tenho certeza se oferece os recursos que você especificou. Eu suspeito que você fez esta pergunta, pois não

Simon Walker
fonte