¿Enviar el SIGKILL a un proceso intercambiado lo anula antes de matarlo?

¿Enviar el SIGKILL a un proceso intercambiado lo anula antes de matarlo?

Supongamos que quiero finalizar un proceso en una máquina Linux con swap (que en realidad es un zram). El intercambio es la mitad del tamaño de la RAM. Sólo hay un 10% de espacio libre en la RAM y el intercambio también está casi lleno.

El proceso utiliza sólo el 2% de la RAM pero aproximadamente el 90% del intercambio.

Hacer un cierre suave (SIGTERM) y permitir que el proceso capte la señal y se cierre por sí solo provocaría que se anule el intercambio de todas las asignaciones intercambiadas, pero no hay suficiente RAM libre para adaptarse a todo el proceso.

Por eso, puede ser mejor finalizar el proceso con SIGKILL, pero todavía tengo miedo de que OOM-killer elimine otros procesos o incluso toda la sesión X o el inicio debido a que se quedará sin memoria.

Entonces, ¿enviar una señal de interrupción hace que el kernel mueva partes intercambiadas del proceso a la memoria física?(¿Qué debo esperar? ¿Depende de la versión del kernel?)

Si es así, ¿qué hacer en tal caso? El objetivo es finalizar el proceso sin tocar el resto (hay otros procesos importantes en ejecución).

Además, ¿cómo eliminarlo correctamente cuando no se trata de un proceso sino de un árbol de procesos y no puedo permitir que la aplicación finalice por sí sola?

Respuesta1

En términos generales, las páginas no se vuelven a intercambiar en la RAM a menos que sean necesarias. Es decir, la página solo se volvería a cargar en la RAM si algo realmente accede a ella (lo que causaría una excepción de falla de página en la MMU que el sistema operativo manejaría cargando la página nuevamente en la RAM antes de permitir que el hilo de acceso continúe). La eliminación total del proceso (con SIGKILL) no ejecuta ninguno de los subprocesos del proceso, por lo que el proceso eliminado no puede intentar acceder a ninguna de sus páginas, y esas páginas no deberían cargarse en la RAM.

De hecho, incluso si no finaliza el proceso y continúa ejecutándose, seguirá intercambiando (a la RAM) solo las páginas a las que realmente accede. Además, si toda la RAM está llena y necesita acceder a otra página que no está en la RAM, el sistema operativo seleccionará otra página de RAM para intercambiarla (al disco) para dejar espacio en la RAM para la página a la que su programa necesita acceder. Mientras haya algo de espacio en la partición de intercambio del disco, este intercambio de páginas puede continuar indefinidamente, manteniendo todo vivo, sin activar el asesino OOM. Por supuesto, si esto sucede con frecuencia, realmente puede ralentizar su máquina porque pasa la mayor parte del tiempo moviendo memoria entre la RAM y el disco en lugar de ejecutar instrucciones del programa. A esto se le llama "golpear".

Respuesta2

Con respecto a eliminar todo el árbol de procesos, puedes intentar esto:

# in pid is saved pid of the parent process
CPIDS=`pgrep -P $pid` # gets pids of child processes
for cpid in $CPIDS ; do kill -9 $cpid ; done # first kill children
kill -9 $pid # then the parent (yeah, that sound kinda bad)

información relacionada