Estoy descubriendo que en ocasiones mi caja de Linux se queda sin memoria y comienza a destruir procesos aleatorios para lidiar con ella.
Tengo curiosidad por saber qué hacen los administradores para evitar esto. ¿Es la única solución real para aumentar la cantidad de memoria (solo ayudará el intercambio?) ¿O hay mejores formas de configurar la caja con software para evitar esto? (es decir, cuotas o algo así?).
linux
low-memory
Eddie Parker
fuente
fuente
Respuestas:
Por defecto, Linux tiene un concepto de administración de memoria algo dañado por el cerebro: le permite asignar más memoria de la que tiene su sistema, luego dispara aleatoriamente un proceso en la cabeza cuando se mete en problemas. (La semántica real de lo que se mata es más compleja que eso: Google "Linux OOM Killer" para obtener muchos detalles y argumentos sobre si es algo bueno o malo).
Para restaurar un poco de cordura en la administración de su memoria:
vm.oom-kill = 0
en /etc/sysctl.conf)vm.overcommit_memory = 2
en /etc/sysctl.conf)Tenga en cuenta que este es un valor trinario: 0 = "estimar si tenemos suficiente RAM", 1 = "Siempre diga sí", 2 = "diga no si no tener la memoria ")
Esta configuración hará que Linux se comporte de la manera tradicional (si un proceso solicita más memoria de la que está disponible, malloc () fallará y se espera que el proceso que solicita la memoria haga frente a esa falla).
Reinicie su máquina para que se vuelva a cargar
/etc/sysctl.conf
, o use elproc
sistema de archivos para habilitarla de inmediato, sin reiniciar:fuente
/etc/sysctl.conf
probablemente solo tenga efecto en el próximo reinicio; si desea realizar cambios ahora , debe usar elsysctl
comando con permisos de root, por ejemplosudo sysctl vm.overcommit_memory=2
Puede deshabilitar el exceso de confirmación, consulte http://www.mjmwired.net/kernel/Documentation/sysctl/vm.txt#514
fuente
La respuesta corta, para un servidor, es comprar e instalar más RAM.
Un servidor que habitualmente experimentó errores OOM (sin memoria), luego, además de la opción sysctl de sobrecompromiso del administrador de VM (memoria virtual) en los núcleos de Linux, esto no es algo bueno.
Aumentar la cantidad de intercambio (memoria virtual que el administrador de memoria del núcleo ha paginado en el disco) ayudará si los valores actuales son bajos, y el uso implica muchas tareas, tales como grandes cantidades de memoria, en lugar de una o algunas procesa cada una solicitando una gran cantidad de memoria virtual total disponible (RAM + intercambio).
Para muchas aplicaciones que asignan más de dos veces (2 veces) la cantidad de RAM como intercambio proporciona un rendimiento decreciente en la mejora. En algunas simulaciones computacionales grandes, esto puede ser aceptable si la ralentización de la velocidad es soportable.
Con RAM (ECC o no) ser bastante asequible para cantidades modestas, por ejemplo, 4-16 GB, tengo que admitir que no he experimentado este problema en mucho tiempo.
Los conceptos básicos para ver el consumo de memoria incluyen el uso
free
ytop
, ordenados por uso de memoria, como las dos evaluaciones rápidas más comunes de los patrones de uso de memoria. Por lo tanto, asegúrese de comprender el significado de cada campo en la salida de esos comandos como mínimo.Sin datos específicos de las aplicaciones (por ejemplo, base de datos, servidor de servicio de red, procesamiento de video en tiempo real) y el uso del servidor (pocos usuarios avanzados, 100-1000s de conexiones de usuario / cliente), no puedo pensar en ninguna recomendación general con respecto a tratar El problema OOM.
fuente
El aumento de la cantidad de memoria física puede no ser una respuesta efectiva en todas las circunstancias.
Una forma de verificar esto es el comando 'encima'. Particularmente estas dos líneas.
Esto es fuera del servidor cuando estaba en buen estado:
Cuando funcionaba mal (y antes de ajustar overcommit_memory de 50 a 90, veíamos un comportamiento con vmcom que se ejecutaba por encima de 50G, procesos de explosión de Oom-killer cada pocos segundos, y la carga seguía rebotando radicalmente debido a que los procesos secundarios NFSd se volcaban arriba y recreado continuamente.
Recientemente hemos duplicado casos en los que los servidores de terminal de Linux multiusuario comprometen de forma masiva la asignación de memoria virtual, pero muy pocas de las páginas solicitadas se consumen realmente.
Si bien no se recomienda seguir esta ruta exacta, ajustamos el exceso de memoria de los valores predeterminados de 50 a 90, lo que alivió parte del problema. Terminamos teniendo que mover a todos los usuarios a otro servidor de terminal y reiniciar para ver el beneficio completo.
fuente
Puede usar ulimit para reducir la cantidad de memoria que un proceso puede reclamar antes de que se elimine. Es muy útil si su problema es uno o algunos procesos que se ejecutan y que bloquean su servidor.
Si su problema es que simplemente no tiene suficiente memoria para ejecutar los servicios que necesita, solo hay tres soluciones:
Reduzca la memoria utilizada por sus servicios limitando los cachés y similares
Crea un área de intercambio más grande. Te costará en rendimiento, pero puede comprarte algo de tiempo.
Compra más memoria
fuente
Tuve un problema similar relacionado con este error y la solución fue usar un kernel más antiguo / nuevo (fijo).
Sin embargo, en ese momento no pude reiniciar mi máquina, por lo que una especie de solución fea fue iniciar sesión como root y borrar cachés del sistema con este comando:
fuente
@ voretaq7 Linux no tiene un concepto de administración de memoria con daño cerebral, por defecto vm.overcommit_ratio es 0,
De esta manera, si tiene 4 GB de RAM e intenta asignar 4,2 GB con malloc de memoria virtual, su asignación fallará.
Con vm.overcommit_ratio = 1
Con vm.overcommit_ratio = 2
Entonces, por defecto, Linux no se compromete demasiado, si su aplicación tiene más memoria que la que tiene, tal vez su código tenga errores
fuente