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 ;-))
Respostas:
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:
CONFIG_CHECKPOINT_RESTORE
ativado.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.
fonte
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.
fonte
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."
fonte
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ó!
fonte