Nuestros servidores en producción a veces bajo carga se encuentran con el siguiente problema (Linux 4.10):
- La aplicación que maneja la carga (servidor web) se está ejecutando con una carga alta.
- Se inicia un nuevo trabajo (por ejemplo, cron). Esto requiere una llamada al sistema clone(), que no logra asignar memoria.
- Kernel OOM Killer se inicia y finaliza uno de los procesos de la aplicación del servidor web, para que pueda comenzar el nuevo trabajo.
- "free -m" muestra que la memoria libre es críticamente baja, alrededor de 1 a 3 GB de los 64 GB del servidor. Sin embargo, la mayor parte de la memoria está en la caché de páginas.
- El sistema no tiene ninguna configuración de archivo/partición de intercambio y vm.swappiness está configurado en su valor predeterminado de 60.
En cambio, si hubiéramos ejecutado "echo 3 > /proc/sys/vm/drop_caches" antes de que comience la carga, OOM no termina matando nuestra aplicación de servidor web y todo funciona bien.
Bajo las condiciones anteriores, ¿el kernel no libera la memoria caché de la página antes de intentar finalizar un proceso para liberar algo de memoria?