¿Cómo activar una acción en condiciones de poca memoria en Linux?

¿Cómo activar una acción en condiciones de poca memoria en Linux?

Entonces, pensé que esto sería algo bastante simple de ubicar: un módulo de servicio/kernel que, cuando el kernel nota que la memoria del usuario se está agotando, desencadena alguna acción (por ejemplo, volcar una lista de procesos a un archivo, hacer ping a algún punto final de la red, lo que sea). ) dentro de un proceso que tiene su propia memoria dedicada (por lo que no dejará de bifurcarse() ni sufrirá ninguno de los otros problemas habituales de OOM).

Encontré elasesino, que entiendo que es útil, pero que realmente no hace lo que necesito hacer.

Idealmente, si me estoy quedando sin memoria, quiero saber por qué. Supongo que podría escribir mi propio programa que se ejecute al inicio y use una cantidad fija de memoria, luego solo haga cosas una vez que el kernel le informe que hay poca memoria, pero eso plantea su propia pregunta...

¿Existe siquiera una llamada al sistema para ser informado de algo así? ¿Una forma de decirle al kernel "oye, despiértame cuando solo nos queden 128 MB de memoria"?

Busqué en la web y aquí pero no encontré nada que se ajuste a esa descripción. Parece que la mayoría de las personas usan el sondeo con un retraso de tiempo, pero el problema obvio es que hace que sea mucho menos probable que puedas saber qué procesos causaron el problema.

Respuesta1

Sí, el kernel de Linux proporciona un mecanismo para esto:notificación de presión de memoria. Esto está documentado enhttps://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt, secciónPresión de la memoria.

En resumen, registra un descriptor de archivo eventfd en /sys/fs/cgroup/memory/memory.pressure_levelel que desea recibir notificaciones. Estas notificaciones pueden ser low, medium, o critical. Un caso de uso típico sería liberar algunos o todos los cachés internos de su proceso cuando recibe una notificación, para evitar una muerte inminente de OOM.

Respuesta2

Lo que estás pidiendo es, básicamente, una devolución de llamada basada en el kernel en una condición de poca memoria, ¿verdad? Si es así, creo firmemente que el núcleo nonoproporcionar tal mecanismo,Y por una buena razón:Al tener poca memoria, debería ejecutar inmediatamente lo único que puede liberar algo de memoria: el asesino OOM. Cualquier otro programa puede detener la máquina.

De todos modos, puede ejecutar una solución de monitoreo simple en el espacio de usuario. Tuve el mismo requisito de acción/depuración de poca memoria en el pasado y escribí un bash simple que hizo lo siguiente:

  • monitorear para unmarca de agua suave:si el uso de la memoria supera este umbral, recopile algunas estadísticas (procesos, memoria libre/usada, etc.) y envíe un correo electrónico de advertencia;

  • monitorear para unmarca de agua dura:Si el uso de la memoria está por encima de este umbral, recopile algunas estadísticas y elimine los procesos que consumen más memoria (o los menos importantes), luego envíe un correo electrónico de alerta.

Un script de este tipo sería muy liviano y puede sondear la máquina en intervalos pequeños (es decir, 15 segundos).

Respuesta3

La mejor respuesta actual es para cgroups-v1. Para cgroups-v2, se pueden escuchar eventos de modificación de archivos en el memory.eventsarchivo (documentacióndel contenido del archivo).

El comportamiento de este archivo se puede probar con algunos comandos de shell:

# Spawn a new slice with memory limits to avoid OOMing the entire system
systemd-run --pty --user -p MemoryMax=1050M -p MemoryHigh=1000M bash

# Watch memory.events for changes and read when changed
inotifywait -e modify -m /sys/fs/cgroup$(cut -d: -f3 /proc/self/cgroup)/memory.events \
  | while read l; do echo $l; cat ${l// *}; done &
# Consume memory
tail /dev/zero

Lamentablemente, esto parece funcionar sólo si en realidad hay un límite de memoria establecido para el cgroup. Como alternativa, se puedeescuchar la memoria presión, pero eso no está basado en cgroup (al menos para usuarios que no son root) y no reacciona tan rápidamente.

información relacionada