Suspender / reanudar proceso único a / desde disco

22

En ocasiones, nos gustaría suspender los procesos de uso intensivo de memoria en nuestros servidores Ubuntu y OS X para liberar temporalmente algo de RAM para otros trabajos. Si todo lo que nos preocupara fuera el uso de la CPU, un simple Ctrl-Zfuncionaría. Sin embargo, necesitamos poder liberar la RAM (escribiéndola en el disco) y luego reiniciar el proceso (disco -> RAM) o, en otras palabras, "hibernar" un solo proceso. ¿Alguna pista sobre cómo hacer esto? (Preferiblemente de CLI.) Gracias.

Mike Covington
fuente
77
Supongo que cuando un proceso está en estado suspendido, su memoria utilizada es candidata para ser intercambiada a disco, si es necesario, y esto debe hacerse automáticamente desde el núcleo.
enzotib
1
@enzotib: no tengo idea de si esto ocurre y, en teoría, esto suena bien. Sin embargo, acabo de hacer una prueba aproximada y en la práctica no funciona. Cualquier proceso nuevo generado mientras los 'comedores de RAM' están suspendidos es extremadamente lento y no detecto ninguna actividad de disco que se esperaría si la RAM se intercambiara en el disco.
Mike Covington
1
@frozenwithjoy Puedo confirmar que esto ocurre. Las únicas razones por las que puedo pensar que un proceso suspendido no se cambiaría gradualmente es si se solicita memoria no intercambiable (bastante rara y (en su mayoría) reservada para root), o si la memoria que está asignando se comparte con otro proceso activo .
Gilles 'SO- deja de ser malvado'
1
Un término que podría ser útil aquí es "checkpointing" (sí, una forma verbal fea). Este es generalmente un problema difícil porque el programa puede estar usando algunos recursos que podrían cambiar de estado mientras el programa está inactivo. Manejar ese problema solía ser una de las distinciones entre Big Iron y las pequeñas y complicadas computadoras.
dmckee

Respuestas:

8

No existe una instalación general para hibernar un solo proceso, solo todo el sistema.

Sin embargo, si no le importa que la imagen del proceso no sobreviva al reinicio, hay una función incorporada para guardar la imagen del proceso en el disco: intercambio. Asegúrese de tener suficiente espacio de intercambio, y si hay presión de memoria y el proceso no está activo (por ejemplo, porque está suspendido), su memoria se intercambiará.

Si sabe que es probable que el proceso permanezca inactivo durante mucho tiempo y que necesitará un tiempo de respuesta rápido en algún momento, puede forzar la liberación de una gran cantidad de RAM asignando mucha RAM en un proceso de corta duración, p. ej.

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

No obtienes ningún control sobre lo que se intercambia, por lo que otros procesos pueden intercambiarse. En Linux, puede volver a intercambiar un proceso accediendo por la fuerza a las páginas que asigna. El script en esta respuesta hará eso: cargar en la memoria todas las páginas mapeadas por un proceso (tenga en cuenta que esto incluye archivos abiertos; puede atravesar regiones selectivamente en función de la información del mapa para evitar el intercambio de datos que sabe que no necesitará) , vea esta respuesta para más información).

Gilles 'SO- deja de ser malvado'
fuente
5

Asegúrese de tener mucho espacio de intercambio. Asegúrese de que su sistema esté configurado para preferir intercambiar páginas inactivas ( vm.swappiness = 100 ). Entonces debería ser suficiente suspender el proceso. El núcleo preferirá intercambiar las páginas inactivas.

David Schwartz
fuente
-1

En Mac OS X, puede intentar usar el purgecomando (proporcionado con Xcode) para liberar algo de RAM (inactiva).

vm_stat
purge
vm_stat
jefz
fuente
2
purgeNo ayudaría aquí. Elimina la memoria caché del disco, pero eso no hará que se intercambie la memoria de un proceso, y no hará que sea más rápido para que otro proceso obtenga RAM.
Gilles 'SO- deja de ser malvado'