¿Puede establecer un tamaño mínimo de búfer de disco de Linux?

8

Tengo una máquina Linux bastante antigua con 2 GB de RAM, sin intercambio, y está funcionando muy bien, con el sistema utilizando cada pieza de memoria no utilizada para el almacenamiento en caché con gran efecto.

Sin embargo, cuando estoy a punto de estresar la memoria (p. Ej.,> 1950 MB asignados), se ralentiza; Sospecho que es porque no quedan buffers de disco. Sé que el asesino OOM pronto entraría en vigencia, pero generalmente no llega allí: se está volviendo tan lento que carga los brotes a 30-40, ningún proceso avanza (por lo tanto, no asigna más memoria) y Tengo que reiniciarlo.

Cuando trato de matar un solo proceso para que la máquina responda, por ejemplo, yendo a la consola (a través de Alt-F1, iniciando sesión y simplemente haciendo un "proceso incorrecto de Killall"), generalmente funciona, excepto que tengo que esperar ~ 10 minutos entre usuario / contraseña y obtener un mensaje, todo mientras haya actividad en el disco.

Una vez más, no hay intercambio, por lo que no se está intercambiando, solo se está agitando porque no le quedan buffers.

Tendría mucho más de 100 MB dedicados exclusivamente a los búferes de disco, lo que desencadenaría el asesino OOM antes (menos memoria para los programas, después de todo), pero por otro lado dejaría la máquina receptiva en todo momento.

¿Hay una manera de hacerlo? No he podido encontrar una entrada / proc / kernel o / sys / vm que haga este tipo de cosas.

HopelessN00b
fuente
También tengo el mismo problema, y ​​desafortunadamente ninguna de las respuestas a esta fecha ayuda en este asunto.
Krišjānis Nesenbergs

Respuestas:

1

Echa un vistazo a / proc / sys / vm / min_free_kbytes . Es el límite de kbytes libres lo que desencadena al asesino. También sería bueno comprobar en los registros para la palabra clave oom-asesino con el fin de saber lo que se maten {además probablemente usted no desea matar a ssh , que es mejor renice it}

Nikolaidis Fotis
fuente
Gracias. Lo amplié, pero eso no parece resolver el problema: una vez que la memoria física estuvo cerca del agotamiento, no quedó memoria de búfer y la máquina disminuyó la velocidad.
Tampoco ayuda aquí, el sistema todavía no responde por completo.
Tronic
Esto realmente me ayudó, también tengo 2 GB de RAM y configuré esto a casi 500 MB, por ahora no hay
retrasos
Actualmente estoy probando esta configuración en mi estación de trabajo. Tengo 8 GB de RAM y la mayoría de las veces no uso más de 5 ... excepto cuando por alguna razón tengo que encender una VM de Windows que requiere aproximadamente 4 GB de RAM. Tengo ZRAM configurado en mi sistema operativo host porque mi disco duro es mecánico, pero todavía se vuelve bastante lento con la RAM casi llena debido precisamente al bajo espacio de RAM para los búferes y cachés del sistema de archivos. Acabo de usar vm.min_free_kbytes para asegurarme de que siempre tenga al menos 2 GB libres y que el resto esté paginado en RAM comprimida (que es mucho más rápido que el espacio de intercambio normal). Publicaremos más tarde con resultados.
RAKK
1

Esperar a que el oom-killer libere memoria es un poco como esperar a que el motor se detenga en su automóvil para decirle cuándo es el momento de llenar su tanque de gasolina. El asesino de Oom es una herramienta de mano dura de último recurso y desesperación por una máquina que carece de recursos. Mata el siguiente programa que toca sin tener en cuenta cómo afectará esto a su aplicación, accesibilidad, confiabilidad, etc. Cuando se invoca el oom-killer, su servidor está sin aliento y en estado crítico.

En cambio, es mucho mejor adoptar un enfoque activo para administrar el uso de memoria dentro del entorno de su aplicación. Puede monitorear / proc / meminfo en busca de problemas y tomar las medidas adecuadas y acelerar su carga de trabajo antes de que una situación grave se ponga fea.

tylerl
fuente
La situación que descubrí es exactamente el momento en que mi servidor está sin aliento y en estado crítico. Una máquina totalmente receptiva tarda menos de 20 segundos en tomar 1 minuto para responder a Ctrl-Alt-F1 (cambiar de X a consola). Y el inicio de sesión es imposible porque agota el tiempo de espera después de 1 minuto sin siquiera pedir una contraseña. Esta es una máquina que tiene muchos procesos en ejecución; cada uno es independientemente NO es el problema. Además, esto es estrictamente un problema de memoria: la CPU está bien y el disco está bien siempre que queden unos 50 MB de búferes de disco.
¿Qué pasa si usa ulimit y si una aplicación usa más de un umbral para tomar una acción?
Nikolaidis Fotis
El problema es la suma de todas las aplicaciones; Se están ejecutando aproximadamente 20, cada uno con 20-100 MB asignados. Funciona bien durante semanas, incluso meses, pero cuando todos quieren tener ~ 100 MB asignados al mismo tiempo, todo se bloquea y se quema; Prefiero que oom_killer mate a uno de ellos que tener que reiniciar la máquina. De todos modos, he activado el intercambio por ahora: la mayoría de las aplicaciones no usan toda su memoria todo el tiempo, por lo que la máquina permanece estable incluso cuando está estresada hasta el final de la memoria física; sin embargo, preferiría no tener ningún intercambio para esta máquina, si puedo.
1
No resuelve el problema real, que es una combinación de no establecer límites de uso de memoria adecuados (los límites no son muy útiles), las aplicaciones fácilmente causan estragos en las asignaciones de memoria, el asesino OOM no se dispara lo suficientemente temprano y la destrucción masiva de discos y la falta de respuesta causado por todo eso. Acabo de perder 30 minutos del tiempo de mi empleador porque la máquina de desarrollo destrozaría el disco durante media hora mientras compilaba mi código, en lugar de simplemente matar los procesos de Chromium que necesitaba matar (o la compilación misma) en menos de un segundo y luego terminar con eso.
Tronic
Si configura oom_adjcorrectamente, puede hacer que su sistema de escritorio funcione un poco como Android, donde el sistema prácticamente siempre se ejecuta contra el asesino OOM (técnicamente hay un "asesino de poca memoria" y se ajusta a través de /sys/module/lowmemorykiller). La lógica es marcar continuamente los procesos de fondo no críticos como víctimas potenciales para el asesino OOM y buscar procesos muertos y reiniciar lentamente los programas muertos necesarios para evitar sobrecargar el sistema. Solo asegúrese de que el proceso que sigue reiniciando otros procesos esté marcado fuera de los límites para OOM killer.
Mikko Rantalainen