Sí, el kernel de Linux proporciona un mecanismo para esto:notificación de presión de memoria . Esto está documentado en https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt, sección Memory Pressure .
En resumen, registra un descriptor de archivo eventfd en /sys/fs/cgroup/memory/memory.pressure_level
sobre el 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 en su proceso cuando recibe una notificación, para evitar una eliminación inminente de OOM.
Lo que está preguntando 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 no proporcionar 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 depuración/acción de poca memoria en el pasado, y escribí un bash simple que hizo lo siguiente:
-
monitor de una marca de agua blanda: si el uso de la memoria está por encima de este umbral, recopile algunas estadísticas (procesos, memoria libre/utilizada, etc.) y envíe un correo electrónico de advertencia;
-
monitor de una marca 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 menos importantes), luego envíe un correo electrónico de alerta.
Tal secuencia de comandos sería muy liviana y puede sondear la máquina en intervalos pequeños (es decir, 15 segundos)