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

47

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, eu 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" é simplesmente irritante).

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

Aqui estão algumas informações sobre o processo que você pode precisar. Por favor, sinta-se à vontade para pedir mais informações, se necessário.

  • Liguei para o processo em um terminal com o comando " ./binary > ./somefile & " ou "time ./binary > ./somefile &", não consigo me lembrar.
  • Ele está imprimindo algumas informações de depuração para std :: cerr (não muito frequentemente).
  • Atualmente, está usando 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, o cpu é um AMD, o sistema operacional é o Ubuntu 12.04 x86.
  • funciona desde 9 dias e 14 horas (tempo demais para cancelá-lo ;-))
por stefan 24.07.2012 / 19:49

4 respostas

37

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

Com base na página da Wikipédia sobre snapshots do aplicativo , existem várias alternativas:

  1. Há também cryopid , mas parece não ser mantido.
  2. ponto de verificação / reinicialização do Linux parece ser uma boa escolha, mas seu kernel precisa ter CONFIG_CHECKPOINT_RESTORE ativado.
  3. o criu é provavelmente o projeto mais atualizado e provavelmente o seu melhor, mas depende também de algumas especificidades Kernel options que sua distribuição provavelmente não definiu.

Isso já é tarde demais, mas outra abordagem mais prática é iniciar seu 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 hosts diferentes.

Para o futuro, pense em onde você executa seus processos de longa duração, como paralizá-los e como lidar com problemas, por exemplo, discos completos, o processo é morto etc.

    
por 24.07.2012 / 20:28
18

Uma maneira bastante "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. Depois de inicializar, restaure a VM & estado.

Isso tem a desvantagem de precisar matar e reiniciar o trabalho. Mas se ele realmente estiver funcionando por vários meses, então uma diferença de nove dias se torna trivial (aumento de 5% em 6 meses).

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

Eu ainda encorajo você a considerar isso como uma opção, especialmente porque nenhuma das alternativas parece ser uma solução robusta. Cada um tem um motivo pelo qual pode não funcionar.

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

    
por 24.07.2012 / 20:55
14

Dê uma olhada na ferramenta CryoPID .

Na home page: "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, seja após uma reinicialização ou até mesmo em outra máquina."

    
por 24.07.2012 / 20:29
6

Se você precisar reiniciar o programa, recomendamos que gaste 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, ser capaz de salvar todo o estado do processo quando você reiniciar a máquina talvez não seja extremamente útil se o processo travar enquanto estiver em execução.

Eu encorajaria você a ter a saída do seu programa em um arquivo de "ponto de verificação". Esses dados devem ser suficientes para que o programa possa continuar do estado em que estava quando o arquivo do ponto de verificação foi salvo. Você não precisa salvar todo o processo, apenas um instantâneo das variáveis relevantes que estão sendo usadas no cálculo, o suficiente para que o cálculo seja retomado de onde parou. Seu código também precisaria 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" de 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ó!

    
por 02.08.2012 / 10:08