¿Es posible 'hibernar' un proceso en Linux? Al igual que 'hibernate' en la computadora portátil, me gustaría escribir toda la memoria utilizada por un proceso en el disco, liberar la memoria 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 memoria RAM y puedo continuar con mi proceso.¿Cómo "hibernar" un proceso en Linux almacenando su memoria en el disco y restaurándola más tarde?
¿Cómo "hibernar" un proceso en Linux almacenando su memoria en el disco y restaurándola más tarde?
Respuesta
Solía mantener CryoPID, que es un programa que hace exactamente lo que usted está hablando. Escribe los contenidos del espacio de direcciones de un programa, VDSO, referencias de descriptores de archivos y estados en un archivo que luego puede reconstruirse. CryoPID comenzó cuando no había ganchos utilizables en el propio Linux y funcionaba completamente desde el espacio del usuario (de hecho, todavía funciona, dependiendo de la distribución/kernel/configuración de seguridad).
Los problemas eran (de hecho) sockets, señales RT pendientes, numerosos problemas X11, la implementación de glibc caching getpid() 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 volver a iniciarse directamente en ese estado, es mucho más fácil simplemente guardar esa información desde el propio programa, tal vez cuando da servicio a una señal .
A partir de julio de 2014, desafortunadamente, 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 conexión TCP "hibernación"). He puesto una [respuesta] (http://stackoverflow.com/a/24991425/1161591) a continuación con información actualizada. ¡Echale un vistazo! ;) – dappiu
@dappiu Eso es genial, pero CryoPID fue solo un ejemplo en esta respuesta para ilustrar cuán complicado puede ser, donde sugerí que manejen guardar el estado dentro del programa, de manera que pueda reanudarse fácilmente . El estancamiento de CryoPID no hace que la respuesta sea menos relevante. –
¡Por supuesto, no quise decir eso! ;) – dappiu
Hay ctrl+z
en Linux, pero no estoy seguro de que ofrece las características especificadas. Sospecho que hizo esta pregunta ya que no hace
La respuesta corta es "sí". Puede comenzar por buscar algunas ideas: ELF executable reconstruction from a core image (http://vx.netlux.org/lib/vsc03.html)
Ctrl-Z aumenta las posibilidades de que las páginas del proceso se intercambien, pero no libera completamente los recursos del proceso. El problema de liberar por completo los recursos de un proceso es que, como los manejadores de archivos, los sockets son recursos de kernel que el proceso puede usar, pero no sabe cómo persistir por sí mismo. Entonces Ctrl-Z es tan bueno como se pone.
El problema es restaurar las secuencias de archivos y sockets que el programa ha abierto.
Cuando toda su SO hiberna, los archivos locales y, obviamente, por ejemplo se pueden restaurar. Las conexiones de red no lo hacen, pero luego el código que accede a Internet suele ser más de comprobación de errores y tal y sobrevive a las condiciones de error (o debería).
Si lo hizo la hibernación por programa (sin el apoyo de la aplicación), ¿cómo administrar los archivos abiertos? ¿Qué pasa si otro proceso accede a esos archivos mientras tanto? etc?
Mantener el estado cuando el programa no está cargado va a ser difícil.
simplemente suspendiendo los hilos y dejar que se vuelva intercambiada con 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.
Hubo algunas investigaciones sobre puesto de control/restauración para Linux de nuevo en 2,2 y 2,4 días, pero nunca llegó más allá del prototipo. Es posible (con las advertencias descritas en las otras respuestas) para ciertos valores de posible - Yo puedo escribir un módulo 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), aún no es posible.
La respuesta breve es "sí, pero no siempre de manera confiable". Salida CryoPID:
Abrir archivos de hecho será el problema más común. CryoPID establece explícitamente:
Se restauran los archivos abiertos y los desplazamientos. archivos temporales que han sido no enlazados y no son accesibles en el sistema de archivos siempre se guardan en la imagen de la . Otros archivos que no existen en la hoja de vida todavía no se restauran. Soporte para guardar contenido de archivos para tales situaciones están planificadas.
Los mismos problemas también afectarán a las conexiones TCP, aunque CryoPID admite tcpcp para la reanudación de la conexión.
Después de presionar el botón de enviar ahora me doy cuenta de que esto se parece mucho al spam/publicidad de CryoPID. No lo es, simplemente soy un usuario satisfecho de la utilidad, realmente. –
Este es el objetivo final del sistema operativo en clúster. Mathew Dillon pone mucho esfuerzo para implementar algo como esto en su proyecto Dragonfly BSD.
¿Esta característica está completamente implementada en Dragonfly BSD? –
No lo crea, es el objetivo "definitivo" ... –
Como han señalado otros, es difícil para el sistema operativo proporcionar esta funcionalidad, ya que la aplicación necesita una comprobación de error integrada para manejar flujos interrumpidos.
Sin embargo, en una nota al margen, algunos lenguajes de programación y herramientas que utilizan máquinas virtuales admiten explícitamente esta funcionalidad, tales como el Self programming language.
Las respuestas que mencionan ctrl-z
realmente están hablando de detener el proceso con una señal, en este caso SIGTSTP
. Puede emitir una señal de parada con kill
:
kill -STOP <pid>
que suspenderán la ejecución del proceso. No liberará inmediatamente la memoria utilizada, pero como la memoria es necesaria para otros procesos, la memoria utilizada por el proceso detenido se intercambiará gradualmente.
Cuando desee para activarlo de nuevo, utilizar
kill -CONT <pid>
Las soluciones más complicadas, como CryoPID, son realmente sólo es necesario si desea que el proceso se detuvo para ser capaz de sobrevivir a una parada normal del sistema/reinicio - no parece que necesites eso.
Extendí Cryopid produciendo un paquete llamado Cryopid2 disponible de SourceForge. Esto puede migrar un proceso así como hibernarlo (junto con los archivos y sockets abiertos: los datos en sockets/pipes se absorben en el proceso en hibernación y se vuelven a escupir en éstos cuando se reinicia el proceso ).
La razón por la que no ha estado activo en este proyecto es que no soy un desarrollador del kernel - tanto esto (y/o el cryopid originales) que conseguir a alguien a bordo que puede hacerlo funcionar con los núcleos últimas (ej. Linux 3.x).
El método Cryopid funciona, y es probablemente la mejor solución para el proceso de propósito general Hibernación/migración en Linux. Me he encontrado.
Linux Kernel ha implementado parcialmente los futuros de punto de control/reinicio: https://ckpt.wiki.kernel.org/, el estado es here.
Algunas informaciones útiles se encuentran en el lwn (neto semanal Linux): http://lwn.net/Articles/375855/http://lwn.net/Articles/412749/ ......
Así que la respuesta es "sí"
El programa de espacio de usuario se llama blcr. – Behrooz
me gustaría poner una actualización de estado aquí, desde 2014.
La respuesta aceptada sugiere CryoPID como una herramienta para realizar Checkpoint/Restore, pero encontré que el proyecto no se ha conservado y es imposible de compilar con kernels recientes. Ahora, encontré dos proyectos mantenidos activamente que proporcionan la función de punto de control de la aplicación.
La primera, la que yo sugiero porque tengo más suerte de ejecutarlo, es CRIU puesto de control que realiza/restaurar principalmente en el espacio de usuario, y requiere la opción del núcleo CONFIG_CHECKPOINT_RESTORE permitido trabajar.
Checkpoint/Restaurar En el espacio de usuario, 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 marcarla en un disco duro como una colección de archivos. A continuación, puede usar los archivos para restaurar y ejecutar la aplicación desde el punto en que se detuvo. La característica distintiva del proyecto CRIU es que se implementa principalmente en el espacio del usuario.
El último es DMTCP; citando desde su página principal:
DMTCP (Punto de control multipunto distribuido) es una herramienta para controlar de forma transparente el estado de varias aplicaciones simultáneas, incluidas las aplicaciones distribuidas y de subprocesos múltiples. Opera directamente en el ejecutable binario del usuario, sin ningún módulo de kernel de Linux u otras modificaciones del kernel.
También hay una buena página de Wikipedia sobre el argumento: Application_checkpointing
- 1. ¿Cómo iniciar un script de shell en un minuto más tarde en Linux?
- 2. Almacenando el directorio como una variable para su uso posterior en el script de linux
- 3. Emular un disco duro en Linux
- 4. ¿Cómo detener el proceso 'ininterrumpible' en Linux?
- 5. Cuánta memoria está bloqueada en un proceso
- 6. Limitar la memoria de proceso/uso de CPU en Linux
- 7. Mapa de memoria de proceso (Linux Windows)
- 8. Cómo iniciar un proceso detenido en Linux
- 9. ¿Ejecuta un proceso desde la memoria dentro de otro proceso?
- 10. Crear y transmitir un archivo grande sin almacenarlo en la memoria o en el disco
- 11. ¿Cómo puedo crear un archivo numpy .npy en el disco?
- 12. ¿Cuánta más velocidad tiene la memoria que el disco?
- 13. ¿Cómo ejecutar un programa y conocer su PID en Linux?
- 14. Gancho del teclado del sistema en Vista y más tarde
- 15. Espere el proceso arbitrario y obtenga su código de salida en Linux
- 16. Sistema de archivos Linux respaldado automáticamente por disco pero alojado por completo en la memoria?
- 17. Mata el proceso usando su nombre dentro de linux (Python)
- 18. ¿Cómo puede un proceso interceptar stdout y stderr de otro proceso en Linux?
- 19. ¿Cómo puedo reducir el consumo de memoria de un proceso Linux mínimo
- 20. Lectura de un inode en disco en la memoria
- 21. licencia GPL cambiar de BSD en el tiempo más tarde
- 22. ¿Cómo controlo la CPU, la memoria y el uso del disco de la computadora en Java?
- 23. ¿Por qué el tamaño del mapa de bits es más grande en la memoria que en el disco en Android?
- 24. ¿Cómo encontrar cuánta memoria se comparte entre el proceso bifurcado con copy-on-write en Linux?
- 25. ¿Cómo se determina el límite de la memoria del proceso en Linux?
- 26. ¿Escala ahora o más tarde?
- 27. Memoria asignada: algoritmos parcialmente basados en disco
- 28. Determinar el motivo de un proceso detenido en Linux
- 29. ¿Cómo registrar el consumo de memoria en Linux?
- 30. ¿Guarda la memoria de un proceso para usarla más adelante?
una pregunta interesante: D – dangerstat
Lo que usted describe es en realidad a menudo referido como 'puntos de control', es posible que tenga mejor suerte que busca con ese término. –
Debe ser. Buena característica. Hibernate vs cerca. –