GNU/Linux >> Tutoriales Linux >  >> Linux

Asesino de falta de memoria de Linux

Cada distribución de Linux® tiene incluido el proceso Out-of-Memory (OOM), pero ¿qué es? En pocas palabras, este es el proceso de autoconservación del servidor. Para entender completamente lo que eso significa, considere cómo Linux asigna la memoria.

Asignación de memoria de Linux

El kernel de Linux asigna memoria según demanda para todas las aplicaciones que se ejecutan actualmente en el servidor. Debido a que esto generalmente sucede por adelantado, las aplicaciones generalmente no usan toda la memoria asignada. Esto permite que el kernel sobre-compromete memoria, haciendo que la memoria sea más eficiente. Este compromiso excesivo permite que el kernel comprometa más memoria de la que realmente está físicamente disponible. Por lo general, esto no es un problema. El problema ocurre cuando demasiadas aplicaciones comienzan a usar la memoria que se les ha asignado a la vez. El servidor corre el riesgo de bloquearse porque se quedó sin memoria. Para evitar que el servidor alcance ese estado crítico, el kernel también contiene un proceso conocido como OOM Killer. . El kernel usa este proceso para comenzar a eliminar procesos no esenciales para que el servidor pueda permanecer operativo.

Si bien puede pensar que esto no debería ser un problema, los procesos de OOM Killerkills que el servidor ha considerado no esenciales, no el usuario. Por ejemplo, las dos aplicaciones que OOM Killer suele eliminar primero son Apache® y MySQL® porque utilizan una gran cantidad de memoria. Cualquiera que tenga un sitio web inmediatamente sabe que es un gran problema. Si OOM Killer mata a cualquiera de ellos, un sitio web a menudo se bloquea de inmediato.

¿Por qué se eliminó un proceso específico?

Al tratar de averiguar por qué el asesino OOM eliminó una aplicación o proceso, puede buscar algunas cosas que pueden ayudar a revelar cómo y por qué se eliminó el proceso. El primer lugar para buscar es en el syslog ejecutando el siguiente comando:

$ grep -i kill /var/log/messages*
host kernel: Out of Memory: Killed process 5123 (exampleprocess)

Debería obtener un resultado similar al del ejemplo anterior. La K mayúscula en muerto te dice que el proceso fue cancelado con un -9 señal, y esto normalmente es un buen indicador de que el OOM Killer tiene la culpa.

Además, puede ejecutar el siguiente comando para verificar las estadísticas de memoria alta y baja del servidor:

$ free -lh

El -l interruptor muestra estadísticas de memoria alta y baja, y el -h El interruptor pone la salida en gigabytes para facilitar la lectura humana. Puede cambiar esto a -m cambia si prefieres la salida en megabytes. Un beneficio adicional de este comando es que también le brinda información sobre el uso de la memoria de intercambio. Una advertencia es que free El comando proporciona solo una instantánea de este momento, por lo que debe verificarlo varias veces para tener una idea de lo que está sucediendo.

Afortunadamente, el vmstat El comando obtiene la salida de la memoria durante un período de tiempo, e incluso tiene una opción para una tabla fácil de leer:

$ vmstat -SM 10 20

El comando anterior genera información de la memoria del sistema veinte veces en intervalos de 10 segundos. Eso es lo que significan el 10 y el 20 en el ejemplo anterior. Puede cambiar ambos números para que se ajusten a una frecuencia y un total que se adapte mejor a sus necesidades. El -S switch muestra la salida en un formato de tabla, y el -M El interruptor muestra la salida en megabytes. Use este comando para mostrar lo que está sucediendo activamente a lo largo de los parámetros de tiempo que especifique.

Otra buena herramienta para usar es, por supuesto, el top dominio. top ordena la salida por la variable CPU de forma predeterminada, pero si hace clic en shift + M después de ejecutar top comando, puede obtener actualizaciones en tiempo real para el uso de la memoria en lugar del uso de la CPU.

Configurar el OOM Killer

Debido a que OOM Killer es un proceso, puede configurarlo para que se adapte mejor a sus necesidades. De hecho, OOM Killer ya tiene varias opciones de configuración incorporadas que permiten a los administradores y desarrolladores del servidor elegir cómo quieren que se comporte el proceso de OOM Killer cuando se enfrentan a un problema. situación en la que la memoria se está volviendo peligrosamente baja. Tenga en cuenta que estas opciones pueden variar según factores como el entorno y las aplicaciones en ejecución.

Al igual que con cualquier cosa que implique cambios de configuración, siempre es mejor probar los cambios propuestos en un entorno de desarrollo o ensayo antes de realizar esos cambios en un entorno de producción en vivo. De esta manera, sabrá cómo reacciona el sistema a esos cambios. Finalmente, incluso si está seguro de su plan, siempre haga una copia de seguridad antes de realizar cualquier cambio. Para las siguientes opciones de configuración, debe ser el root usuario.

Opción 1:Reiniciar

La primera opción consiste en editar el sysctl configuración(/etc/sysctl.conf ), que permite que sus cambios persistan entre reinicios:

sysctl vm.panic_on_oom=1
sysctl kernel.panic=X
echo “vm.panic_on_oom=1” >> /etc/sysctl.conf
echo “kernel.panic=X” >> /etc/sysctl.conf

El X en el comando anterior es la cantidad de segundos que desea que el sistema espere antes de que se reinicie.

En la mayoría de las situaciones, no es factible reiniciar cada vez que el sistema tiene poca memoria. Si bien este enfoque puede ser necesario para algunas situaciones, la mayoría no necesita ni garantiza un reinicio completo del sistema para solucionar el problema.

Opción 2:Proteger o sacrificar procesos

Esta opción en particular requiere un enfoque más refinado. Puede (a) proteger ciertos procesos haciéndolos menos propensos a ser eliminados por OOM Killer o (b) configurar ciertos procesos para que sean más propensos a ser eliminados. Puede lograr esto con los siguientes comandos:

echo -15 > /proc/(PID)/oom_adj			(less likely)
echo 10 > /proc/(PID)/oom_adj			(more likely)

Reemplace el (PID) marcador de posición en el comando de muestra con el ID del proceso particular (o PID) que le interesa. Para proteger o sacrificar un proceso, necesita encontrar el proceso padre (el original). Use el siguiente comando para ubicar el PPID (o ID del proceso principal), donde reemplaza el proceso con su proceso (como Apache, MySQL, etc.):

pstree -p | grep "process" | head -1

Puede ver que esta opción es un poco mejor que la opción nuclear de reiniciar todo el sistema. Sin embargo, ¿qué sucede si tiene un proceso que es crucial y no se puede eliminar?

Opción 3:Eximir un proceso

Esta opción viene con una nota de advertencia. Los procesos exentos pueden, en algunas circunstancias, provocar cambios de comportamiento no deseados, que dependen en gran medida de las configuraciones del sistema y de los recursos. Si el núcleo no puede eliminar un proceso que utiliza una gran cantidad de memoria, comenzará a eliminar otros procesos disponibles. Esto puede incluir procesos que también pueden ser procesos importantes del sistema operativo. Como resultado, el sistema podría dejar de funcionar por completo. Baste decir que use esta opción con extrema precaución.

Porque el rango válido para los ajustes de OOM Killer está entre -16 y +15 , una configuración de -17 exime un proceso por completo porque cae fuera del alcance de los números enteros aceptables para la escala de ajuste de OOM Killer. La regla general es:cuanto mayor sea el valor numérico, más probable es que se elija un proceso para ser eliminado. Por lo tanto, el comando para eximir completamente un proceso es:

echo -17 > /proc/(PID)/oom_adj

Opción 4:La opción arriesgada

Advertencia :Rackspace no recomienda esto para entornos de producción.

Si los reinicios y los procesos de protección, sacrificio o exención no son lo suficientemente buenos, existe la opción final y arriesgada:deshabilitar OOM Killer por completo opción.

Esta opción puede causar cualquiera de los siguientes resultados:

  • un grave pánico en el núcleo
  • un bloqueo del sistema
  • un bloqueo total del sistema

¿Por qué? Evita que el servidor se quede sin recursos. Si deshabilita el OOM Killer por completo, entonces nada protege al servidor de quedarse sin memoria. Tenga extrema moderación y precaución al considerar esta opción.

Para ejercer esta opción, ejecute el siguiente comando:

sysctl vm.overcommit_memory=2
echo “vm.overcommit_memory=2” >> /etc/sysctl.conf

Ahora que ha aprendido acerca de OOM Killer, sabe cómo adaptar el proceso a su entorno individual y las necesidades del sistema. Como regla general, tenga cuidado siempre que edite los procesos del kernel. El OOM Killer no es una excepción a esa regla.


Linux
  1. Cómo borrar la caché de memoria en Linux

  2. Linux:¿cómo decide The Oom Killer qué proceso eliminar primero?

  3. ¿Recibir señal antes de que Oom Killer/Cgroups elimine el proceso?

  4. Malloc en Linux sin compromisos excesivos

  5. ¿Por qué Linux Out-of-memory (OOM) Killer no se ejecuta automáticamente, sino que funciona con sysrq-key?

Cómo borrar la memoria de intercambio en Linux

¿Linux Oom aleatoriamente cuando todavía hay memoria libre?

Ejemplos de comandos gratuitos en Linux

Segmentación de memoria de Linux

Evite el desmontaje de aplicaciones sin memoria de Linux

Asesino OOM matando cosas con un montón (?) de RAM libre