Guarde todo el proceso para continuar después de reiniciar


54

Desarrollé un algoritmo para un problema matemático bastante difícil que probablemente necesite varios meses para terminar. Como solo tengo recursos limitados, comencé esto en mi computadora portátil Ubuntu 12.04 (x86). Ahora quiero instalar algunas actualizaciones y reiniciar la computadora portátil (el mensaje "reiniciar" es molesto).

¿Hay alguna manera de guardar un proceso completo, incluida su memoria asignada para continuar más allá de un reinicio?

Aquí hay información sobre el proceso que podría necesitar. No dude en solicitar más información si es necesario.

  • Llamé al proceso en una terminal con el comando " ./binary > ./somefile &" o "time ./binary> ./somefile &", realmente no puedo recordar.
  • Está imprimiendo información de depuración en std :: cerr (no muy a menudo).
  • Actualmente está utilizando aproximadamente 600.0 kiB y aunque esto aumentará, es poco probable que aumente rápidamente.
  • el proceso se ejecuta con prioridad normal
  • el kernel es 3.2.0-26-generic-pae, la cpu es una AMD, el sistema operativo es Ubuntu 12.04 x86.
  • funciona desde 9 días y 14 horas (demasiado tiempo para cancelarlo ;-))

3
Por curiosidad, ¿qué estás calculando?
Viktor Mellgren

3
@ user1261166: estudio el problema de visitas objetivo (que es una extensión del problema del vendedor ambulante) con el enfoque de ramificación y corte. Por lo tanto, necesito conocer tantas facetas de un politopo especial de alta dimensión como sea posible. Básicamente, está explotando un gran problema a uno gigantesco y luego tratando de resolver un poco para reducirlo después.
stefan

55
No responde a su pregunta, pero ¿ha considerado ejecutar su código en un clúster dedicado en el futuro? Apenas se cierran y estoy seguro de que hay disponible una red informática. No solo están encendidos todo el tiempo, sino también un poco más rápido (especialmente si puede paralelizar su código). Incluso podría intentar configurar uno usted mismo (busque Oracle Grid Engine).
Wojtek Rzepala

Nunca pensé que esto fuera una pregunta tan popular (al menos mucho más popular que cualquier otra pregunta de mi parte). Como el proceso terminó ahora (inesperadamente, aunque sin un bloqueo), probaré cada método en breve. ¡Gracias a todos!
stefan

Respuestas:


41

La solución mejor / más simple es cambiar su programa para guardar el estado en un archivo y reutilizar ese archivo para restaurar el proceso.

Según la página de wikipedia sobre instantáneas de aplicaciones, existen múltiples alternativas:

  1. También hay crioides, pero parece que no se mantiene.
  2. El punto de control / reinicio de Linux parece ser una buena opción, pero su núcleo debe estar CONFIG_CHECKPOINT_RESTOREhabilitado.
  3. criu es probablemente el proyecto más actualizado y probablemente su mejor opción, pero depende también de algunas opciones específicas de Kernel que su distribución probablemente no haya configurado.

Esto ya es demasiado tarde, pero otro enfoque más práctico es comenzar su proceso en una máquina virtual dedicada y simplemente suspender y restaurar toda la máquina virtual. Dependiendo de su hipervisor, también puede mover la máquina entre diferentes hosts.

Para el futuro, piense en dónde ejecuta sus procesos de larga duración, cómo paralizarlos y cómo manejar los problemas, por ejemplo, discos completos, procesos que se eliminan, etc.


20

Una forma bastante "barata" de hacer esto sería hacer el procesamiento en una VM (por ejemplo, con VirtualBox). Antes de apagar, suspenda la VM y guarde el estado. Después del arranque, restaure la VM y el estado.

Esto tiene la desventaja de requerir matar y reiniciar el trabajo. Pero si realmente va a estar funcionando durante varios meses, entonces una diferencia de nueve días se vuelve trivial (aumento del 5% en 6 meses).


Editar: Me acabo de dar cuenta de que Ulrich ya mencionó esto en el elemento 4 sin numerar en su lista.

Todavía te animo a que consideres esto como una opción, especialmente porque ninguna de las alternativas parece una solución sólida. Cada uno tiene una razón por la que puede no funcionar.

Supongo que lo mejor sería probar uno de esos y, si no funciona, reiniciar el trabajo en una máquina virtual.


15

Eche un vistazo a la herramienta CryoPID .

Desde la página de inicio: "CryoPID le permite capturar el estado de un proceso en ejecución en Linux y guardarlo en un archivo. Este archivo se puede usar para reanudar el proceso más adelante, ya sea después de un reinicio o incluso en otra máquina".


44
Usé esto antes para guardar el estado de un script de Python que se ejecuta en un cuadro de Linux y lo movió a un cuadro de FreeBSD y lo reanudó allí. Un poco de magia arcana sucede allí;)
Tim

No sabía que FreeBSD y Linux eran compatibles con binarios; eso es algo muy interesante que acabo de aprender. ¿Pero eso significa que tienen modelos de memoria exactamente idénticos? Me parece incrédulo que tengan las mismas convenciones de syscall, la misma libc (supongo que fbsd usa glibc), las mismas convenciones de llamadas exactas a nivel asm, etc. Las incompatibilidades me parecen como si hubieras tomado un proceso MacOS y lo hubieras dejado en una caja de Windows; eso es realmente asombroso.
gato

¿Alguien ha intentado esto recientemente? El sitio se ha ido, no puedo encontrar un .deb, falla la construcción desde la fuente, etc. Me gustaría saber si es posible antes de gastar más tiempo en él. Estoy en Debian si es importante.
John P

1
@JohnP Está disponible en GitHub ahora: github.com/maaziz/cryopid
starbeamrainbowlabs

7

Si termina necesitando reiniciar su programa, le recomiendo que dedique un poco de tiempo agregando algunas características a su código que podrían ahorrarle tiempo en el futuro.

Si el proceso se va a ejecutar durante mucho tiempo, poder guardar todo el estado del proceso cuando reinicie la máquina quizás no sea de gran ayuda si su proceso se bloquea mientras se está ejecutando.

Le animo a que envíe su programa a un archivo de datos de "punto de control". Estos datos deberían ser suficientes para que su programa pueda reanudar desde el estado en que se encontraba cuando se guardó el archivo de punto de control. No necesita guardar todo el proceso, solo una instantánea de las variables relevantes que se utilizan en su cálculo, suficiente para que su cálculo se reanude donde lo dejó. Su código también necesitaría incluir alguna forma de lectura en los datos de este archivo para obtener su estado inicial.

Puede configurar su código para que cuando le envíe una señal, guarde uno de estos archivos de punto de control, de modo que pueda guardar el "estado" de su cálculo en cualquier momento.

¡Además, poder ver cómo cambian los datos a medida que avanza el cálculo puede ser interesante en sí mismo!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.