Salve todo o processo para continuação após a reinicialização

54

Eu desenvolvi um algoritmo para um problema bastante difícil em matemática que provavelmente precisará de vários meses para terminar. Como eu tenho apenas recursos limitados, iniciei isso no meu laptop Ubuntu 12.04 (x86). Agora eu quero instalar algumas atualizações e realmente reiniciar o laptop (a mensagem "por favor, reinicie" é apenas irritante).

Existe uma maneira de salvar um processo inteiro, incluindo a memória alocada, para continuar além de uma reinicialização?

Aqui estão algumas informações sobre o processo que você pode precisar. Por favor, não hesite em pedir mais informações, se necessário.

  • Chamei o processo em um terminal com o comando " ./binary > ./somefile &" ou "time ./binary> ./somefile &", não consigo me lembrar.
  • Está imprimindo algumas informações de depuração no std :: cerr (não com muita frequência).
  • Atualmente, ele usa aproximadamente 600,0 kiB e, embora isso aumente, é improvável que aumente rapidamente.
  • o processo é executado com prioridade normal
  • o kernel é 3.2.0-26-generic-pae, a CPU é uma AMD, o sistema operacional é o Ubuntu 12.04 x86.
  • funciona desde 9 dias e 14 horas (tempo demais para cancelá-lo ;-))
Stefan
fonte
3
Por curiosidade, o que você está calculando?
Viktor Mellgren
3
@ user1261166: Estudo o Problema da Visitação ao Alvo (que é uma extensão do Problema do Vendedor Viajante) com a abordagem Branch-and-Cut. Portanto, preciso conhecer o maior número possível de facetas de algum polítopo especial de alta dimensão. Basicamente, está explodindo um grande problema para um gigantesco e, em seguida, tentando resolver um pouco para reduzi-lo posteriormente.
27412 stefan
5
Isso não responde à sua pergunta, mas você pensou em executar seu código em um cluster dedicado no futuro? Essas são dificilmente encerradas e tenho certeza de que há uma grade de computação disponível para você. Eles não apenas estão ativados o tempo todo, mas também são um pouco mais rápidos (especialmente se você pode paralelizar seu código). Você pode até tentar configurar um você mesmo (consulte o Oracle Grid Engine).
Wojtek Rzepala
Eu nunca pensei que isso fosse uma pergunta tão popular (pelo menos muito mais popular do que qualquer outra pergunta minha). Como o processo terminou agora (inesperadamente, embora sem falhas), testarei cada método em breve. Obrigado a todos!
8118 stefan
11
stackoverflow.com/questions/2134771/…
Ciro Santilli escreveu:

Respostas:

41

A melhor / mais simples solução é alterar seu programa para salvar o estado em um arquivo e reutilizá-lo para restaurar o processo.

Com base na página da Wikipedia sobre instantâneos de aplicativos, há várias alternativas:

  1. Também há criopídio, mas parece não ser mantido.
  2. O ponto de verificação / reinicialização do Linux parece ser uma boa opção, mas seu kernel precisa estar CONFIG_CHECKPOINT_RESTOREativado.
  3. O criu é provavelmente o projeto mais atualizado e provavelmente sua melhor opção, mas depende também de algumas opções específicas do Kernel que sua distribuição provavelmente não definiu.

Já é tarde demais, mas outra abordagem prática é iniciar o processo em uma VM dedicada e apenas suspender e restaurar toda a máquina virtual. Dependendo do seu hypervisor, você também pode mover a máquina entre diferentes hosts.

Para o futuro, pense sobre onde você executa seus processos de longa execução, como paralisá-los e como lidar com problemas, por exemplo, discos completos, processos mortos etc.

Ulrich Dangel
fonte
20

Uma maneira razoavelmente "barata" de fazer isso seria fazer o processamento em uma VM (por exemplo, com o VirtualBox). Antes de desligar, suspenda a VM e salve o estado. Após a inicialização, restaure o VM & state.

Isso tem a desvantagem de exigir a morte e o reinício do trabalho. Mas se ele estiver funcionando por vários meses, uma diferença de nove dias se tornará trivial (aumento de 5% em 6 meses).


Edit: Acabei de perceber que Ulrich já mencionou isso no item não numerado 4 de sua lista.

Eu ainda o incentivaria a considerar isso como uma opção, especialmente porque nenhuma das alternativas parece uma solução robusta. Cada um tem uma razão pela qual pode não funcionar.

Suponho que a melhor coisa a fazer seria tentar um desses e, se não funcionar, reinicie o trabalho em uma VM.

bahamat
fonte
15

Dê uma olhada na ferramenta CryoPID .

Na página inicial: "O CryoPID permite capturar o estado de um processo em execução no Linux e salvá-lo em um arquivo. Esse arquivo pode ser usado para retomar o processo posteriormente, após uma reinicialização ou mesmo em outra máquina."

Tim
fonte
4
Usei isso antes para salvar o estado de um script python em execução em uma caixa Linux e movi-lo para uma caixa FreeBSD e retomar lá. Alguma mágica arcana acontecendo lá;)
Tim
Eu não sabia que o FreeBSD e o Linux eram compatíveis com binários; isso é algo muito interessante que acabei de aprender. Mas isso significa que eles têm modelos de memória exatamente idênticos? Parece-me incrédulo que eles tenham as mesmas convenções de syscall, a mesma libc (acho que o fbsd usa glibc), as mesmas convenções de chamada exatas no nível asm, etc. em uma caixa do Windows; isso é realmente incrível.
gato
Alguém já tentou isso recentemente? O site se foi, não consigo encontrar um .deb, a construção a partir da fonte falha etc. Gostaria de saber se é possível antes de gastar mais nele. Estou no Debian, se isso importa.
John P
11
@JohnP Ele está disponível no GitHub agora: github.com/maaziz/cryopid
starbeamrainbowlabs
7

Se você precisar reiniciar o programa, recomendamos que você dedique algum tempo adicionando alguns recursos ao seu código que podem economizar seu tempo no futuro.

Se o processo for executado por um longo tempo, conseguir salvar todo o estado do processo ao reiniciar a máquina talvez não seja extremamente útil se o processo travar enquanto estiver em execução.

Gostaria de encorajá-lo a enviar o seu programa para um arquivo "checkpoint" de dados. Esses dados devem ser suficientes para que seu programa possa retomar do estado em que estava quando o arquivo do ponto de verificação foi salvo. Você não precisa salvar o processo inteiro, apenas um instantâneo das variáveis ​​relevantes sendo usadas em seu cálculo, suficiente para que seu cálculo continue de onde parou. Seu código também precisará incluir alguma maneira de ler os dados desse arquivo para obter seu estado inicial.

Você pode configurar seu código para que, quando enviar um sinal, ele salve um desses arquivos de ponto de verificação, para que você possa salvar o "estado" do seu cálculo a qualquer momento.

Além disso, poder ver como os dados mudam à medida que o cálculo avança pode ser interessante por si só!

James Womack
fonte