¿Cómo "hibernar" un proceso en Linux almacenando su memoria en el disco y restaurándola más tarde?

99

¿Es posible 'hibernar' un proceso en linux? Al igual que 'hibernar' en una computadora portátil, debería escribir toda la memoria utilizada por un proceso en el disco, liberar la RAM. Y luego, más adelante, puedo 'reanudar el proceso', es decir, leer todos los datos de la memoria y volver a ponerlos en la RAM y puedo continuar con mi proceso.

hap497
fuente
8
Pregunta interesante: D
dangertat
Lo que usted describe a menudo se conoce como "punto de control", es posible que tenga más suerte buscando con ese término.
Tim Post
Debe ser una buena característica. Hibernar vs cerrar.
Vitaly Fadeev
unix.stackexchange.com/questions/43854/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

54

Solía ​​mantener CryoPID , que es un programa que hace exactamente lo que estás hablando. Escribe el contenido del espacio de direcciones de un programa, VDSO, referencias de descriptores de archivos y estados en un archivo que luego se puede reconstruir. CryoPID comenzó cuando no había ganchos utilizables en Linux y funcionó completamente desde el espacio de usuario (en realidad, todavía funciona, dependiendo de la configuración de su distribución / kernel / seguridad).

Los problemas fueron (de hecho) sockets, señales RT pendientes, numerosos problemas de X11, la implementación de getpid () de almacenamiento en caché de glibc, entre muchos otros. La aleatorización (especialmente VDSO) resultó ser insuperable para los pocos de nosotros que trabajamos en ella después de que Bernard se alejó de ella. Sin embargo, fue divertido y se convirtió en el tema de varias tesis de maestría.

Si solo está contemplando un programa que puede guardar su estado de ejecución y reiniciar directamente en ese estado, es mucho ... mucho ... más fácil guardar esa información desde el propio programa, tal vez al dar servicio a una señal.

Tim Post
fuente
5
A partir de julio de 2014, lamentablemente, CryoPID ya no se mantiene y no se ejecuta en kernels recientes. Pero mientras tanto nacen nuevos proyectos (se han dado algunos pasos incluso en la "hibernación" de la conexión TCP). He puesto una respuesta a continuación con información actualizada. ¡Echale un vistazo! ;)
dappiu
1
@dappiu Eso es genial, pero CryoPID fue solo un ejemplo en esta respuesta para ilustrar lo complicado que puede ser, donde seguí sugiriendo que manejen guardar el estado dentro del programa en sí, de tal manera que se pueda reanudar fácilmente. El estancamiento de CryoPID no hace que la respuesta sea menos relevante.
Tim Post
Cryopid2 está activo más recientemente (2013): sourceforge.net/projects/cryopid2
Leopd
31

Me gustaría poner una actualización de estado aquí, a partir de 2014.

La respuesta aceptada sugiere CryoPID como una herramienta para realizar Checkpoint / Restore, pero encontré que el proyecto no se mantenía y era imposible de compilar con kernels recientes. Ahora, encontré dos proyectos mantenidos activamente que proporcionan la función de control de aplicaciones.

El primero, el que sugiero porque tengo más suerte ejecutándolo, es CRIU que realiza el punto de control / restauración principalmente en el espacio de usuario, y requiere que la opción del kernel CONFIG_CHECKPOINT_RESTORE esté habilitada para funcionar.

Checkpoint / Restore In Userspace, o CRIU (pronunciado kree-oo, IPA: / krɪʊ /, ruso: криу), es una herramienta de software para el sistema operativo Linux. Con esta herramienta, puede congelar una aplicación en ejecución (o parte de ella) y colocarla en un disco duro como una colección de archivos. Luego puede usar los archivos para restaurar y ejecutar la aplicación desde el punto en el que se inmovilizó. La característica distintiva del proyecto CRIU es que se implementa principalmente en el espacio del usuario.

Este último es DMTCP ; citando de su página principal:

DMTCP (Distributed MultiThreaded Checkpointing) es una herramienta para verificar de forma transparente el estado de múltiples aplicaciones simultáneas, incluidas las aplicaciones multiproceso y distribuidas. Opera directamente en el ejecutable binario del usuario, sin ningún módulo del kernel de Linux u otras modificaciones del kernel.

También hay una bonita página de Wikipedia sobre el argumento: Application_checkpointing

dappiu
fuente
20

Las respuestas que mencionan ctrl-zrealmente hablan de detener el proceso con una señal, en este caso SIGTSTP. Puede emitir una señal de parada con kill:

kill -STOP <pid>

Eso suspenderá la ejecución del proceso. No liberará inmediatamente la memoria utilizada por él, pero como se requiere memoria para otros procesos, la memoria utilizada por el proceso detenido se irá intercambiando gradualmente.

Cuando quieras volver a despertarlo, usa

kill -CONT <pid>

Las soluciones más complicadas, como CryoPID, en realidad solo son necesarias si desea que el proceso detenido pueda sobrevivir a un apagado / reinicio del sistema; no parece que lo necesite.

coste y flete
fuente
13

El problema es restaurar los flujos (archivos y sockets) que el programa tiene abiertos.

Cuando todo su sistema operativo hiberna, los archivos locales y demás, obviamente, se pueden restaurar. Las conexiones de red no lo hacen, pero luego el código que accede a Internet suele ser más una verificación de errores y sobrevive a las condiciones de error (o debería hacerlo).

Si hiciera una hibernación por programa (sin compatibilidad con la aplicación), ¿cómo manejaría los archivos abiertos? ¿Qué pasa si otro proceso accede a esos archivos mientras tanto? etc?

Mantener el estado cuando el programa no está cargado será difícil.

¿Simplemente suspender los hilos y dejar que se intercambien en el disco tendría el mismo efecto?

O ejecute el programa en una máquina virtual y deje que la VM maneje la suspensión.

Será
fuente
12

La respuesta corta es "sí, pero no siempre de forma fiable". Echa un vistazo a CryoPID:

http://cryopid.berlios.de/

De hecho, los archivos abiertos serán el problema más común. CryoPID establece explícitamente:

Se restauran los archivos abiertos y las compensaciones. Los archivos temporales que se han desvinculado y no son accesibles en el sistema de archivos siempre se guardan en la imagen. Otros archivos que no existen en el currículum aún no se restauran. Está previsto el soporte para guardar el contenido del archivo para tales situaciones.

Los mismos problemas también afectarán las conexiones TCP, aunque CryoPID admite tcpcp para reanudar la conexión.

Ulisses Montenegro
fuente
3
Después de presionar el botón de enviar, ahora me doy cuenta de que esto se parece mucho a spam / publicidad de CryoPID. No lo es, en realidad soy simplemente un usuario satisfecho de la utilidad.
Ulisses Montenegro
6

Extendí Cryopid produciendo un paquete llamado Cryopid2 disponible en SourceForge. Esto puede migrar un proceso, así como hibernarlo (junto con cualquier archivo y sockets abiertos; los datos en sockets / tuberías se absorben en el proceso en hibernación y se escupen nuevamente cuando se reinicia el proceso).

La razón por la que no he estado activo con este proyecto es que no soy un desarrollador de kernel; tanto esto (como el cryopid original) necesitan contar con alguien que pueda hacerlos funcionar con los últimos kernels (por ejemplo, Linux 3.x) .

El método Cryopid funciona, y es probablemente la mejor solución para la hibernación / migración de procesos de propósito general en Linux con la que me he encontrado.

Mark O'Neill
fuente
3

Como han señalado otros, es difícil para el sistema operativo proporcionar esta funcionalidad, porque la aplicación necesita tener alguna verificación de errores incorporada para manejar transmisiones rotas.

Sin embargo, en una nota al margen, algunos lenguajes de programación y herramientas que utilizan máquinas virtuales admiten explícitamente esta funcionalidad, como el lenguaje de programación Self .

Cerin
fuente
0

Ctrl-Z aumenta las posibilidades de que se intercambien las páginas del proceso, pero no libera completamente los recursos del proceso. El problema de liberar completamente los recursos de un proceso es que cosas como los manejadores de archivos, los sockets son recursos del kernel que el proceso puede usar, pero no sabe cómo persistir por sí solo. Entonces Ctrl-Z es tan bueno como parece.

Tobu
fuente
0

Hubo algunas investigaciones sobre el punto de control / restauración para Linux en 2.2 y 2.4 días, pero nunca pasó del prototipo. Es posible (con las advertencias descritas en las otras respuestas) para ciertos valores de posible; puede escribir un módulo del kernel para hacerlo, es posible. Pero por el valor común de posible (puedo hacerlo desde el shell en una distribución comercial de Linux), todavía no es posible.

florín
fuente
0

Este es el objetivo final del sistema operativo agrupado. Mathew Dillon hace un gran esfuerzo para implementar algo como esto en su proyecto Dragonfly BSD .

Nikolai Fetissov
fuente
¿Esta función está completamente implementada en Dragonfly BSD?
Arjun J Rao
0

agregando otra solución alternativa: puede usar virtualbox. ejecute sus aplicaciones en una máquina virtual normal y simplemente "guarde el estado de la máquina" cuando lo desee. Sé que esta no es una respuesta, pero pensé que podría ser útil cuando no hay opciones reales.

si por alguna razón no le gusta virtualbox, vmware y Qemu son tan buenos.

Omid Ataollahi
fuente
-2

Hay ctrl+zen linux, pero no estoy seguro de que ofrezca las características que especificó. Sospecho que hiciste esta pregunta porque no

Simon Walker
fuente