Evite que Ubuntu se congele, incluso si la memoria del sistema es baja

24

A veces trabajo con grandes descargas de datos que quiero guardar en la memoria para su procesamiento. A veces calculo mal la cantidad de memoria que producirá mi programa, o un depurador multiplica el uso de memoria por un factor que excede mi memoria disponible.

Cada vez que comienzo un proceso que requiere mucha memoria, esto es lo que esperaría de un sistema operativo sano: intente consumir toda la memoria libre, luego pida a otros procesos no esenciales que renuncien a la memoria que no necesitan, y luego escribe para intercambiar.

Esto es lo que Ubuntu hace por mí: comer toda la memoria libre, luego pedirle al sistema operativo que intercambie todos los servicios esenciales (sesión de gnome, terminal, teclado), luego congelar y esperar a que desconecte el cable de alimentación.

Dos preguntas:

  1. ¿Cómo puede suponer un sistema operativo que cualquier cosa puede ser tan importante que está bien dejar de escuchar la entrada del usuario?
  2. ¿Cómo puedo decirle a Ubuntu que nunca intercambie servicios esenciales y que siempre reaccione a la entrada del usuario, incluso si algún proceso estúpido intenta consumir más recursos de los que proporciona el sistema?
Klamann
fuente
¿Cuánta RAM tienes instalada? ¿De qué tamaño es su intercambio (en la terminal, escriba swaponpara averiguarlo)? Saludos, Al
heynnema
3
16 gb de ram y 16 gb de intercambio. Pero ese no es el punto aquí, este problema no se puede resolver agregando más memoria.
Klamann
1
Prueba una de dos cosas. 1) cambie la swappinessconfiguración a 10, es decir: vm.swappiness = 10en /etc/sysctl.conf. Busque aquí el intercambio para obtener más información al respecto. 2) Si el intercambio no ayuda ... Aunque es posible que no desee ... aumentar el tamaño de su archivo de intercambio a 1.5x16G y ver si eso ayuda. Mantenme informado. Saludos, Al
heynnema
1
@Klamann Estoy de acuerdo en que agregar más swap no solucionará el problema. Una vez que tiene un programa roto que consume todo RAM + SWAP, agregar SWAP adicional solo retrasa lo inevitable.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix, como dije, vm.swappiness=10necesita AGREGARSE a sysctl.conf. Una persona experimentada podría incluso usar el comando sysctl sobre la marcha, para configurar vm.swappiness = 10, sin editar el archivo sysctl.conf. Saludos, Al ps: esperando que el OP responda.
heynnema

Respuestas:

5

Todavía no tengo una solución para el problema, pero puedo ofrecer dos soluciones que pueden ser de interés para otros:

1) temprano

Es un servicio que vigila el uso de memoria y mata el proceso que consume la mayor cantidad de memoria cuando se alcanza un cierto umbral (vea también esta y esta pregunta sobre el asesino OOM en el kernel de Linux)

Lo probé con un proceso de demostración que solicita memoria de forma indefinida en pequeños fragmentos. Aquí está mi primera impresión: cuando comienzo el proceso malicioso, rápidamente se come toda mi RAM. Luego comienza el intercambio, el sistema se vuelve receptivo. Unos segundos después, el sistema vuelve a estar en línea. El registro de earlyoom muestra que mató el proceso de comer memoria después de que tanto la memoria como el uso de intercambio alcanzaron el 90%.

Todavía hay un retraso molesto cuando comienza el intercambio y después de que se cancela el proceso, algunas partes de otros procesos generalmente permanecen en el intercambio hasta que se solicitan, pero es un comienzo.

2) solo deshabilita el intercambio

Sé que este es un tema controvertido , pero para el propósito de los sistemas de escritorio y especialmente las máquinas de desarrollo donde puede ocurrir de vez en cuando que un proceso intente consumir toda su memoria, tiene sentido: sin intercambio, el asesino OOM simplemente funciona Como era la intención. Cuando te quedas sin memoria, encuentra el mejor proceso para matar y se deshace de él. Sin retraso, sin demora.

Puede deshabilitar el intercambio para la sesión actual con sudo swapoff -ao hacer que el cambio sea permanente .


La solución adecuada para el problema sería, por supuesto, que el sistema permanece receptivo cuando la memoria principal se agota y comienza a intercambiar memoria como si no hubiera un mañana, pero eso no parece suceder pronto.

Klamann
fuente
1
He desactivado el intercambio y mi sistema pasa directamente de poca memoria (<100 MB) a congelamiento. ¿Cómo puedo saber si el asesino OOM está habilitado?
Michael
0

Pruebe una de dos cosas:

1) cambie la configuración de intercambio de su configuración predeterminada de 60 a 10, es decir: agregue vm.swappiness = 10 a /etc/sysctl.conf (en terminal, escriba sudo gedit /etc/sysctl.conf), luego reinicie el sistema. Busque aquí el intercambio para obtener más información al respecto.

2) Si el intercambio no ayuda ... a pesar de que es posible que no desee ... aumentar el tamaño de su archivo de intercambio a 1.5x16G y ver si eso ayuda.

Mantenme informado. Saludos, Al

heynnema
fuente
He configurado una máquina virtual para ejecutar algunas pruebas, porque reiniciar mi sistema operativo cada pocos segundos es realmente molesto. Ubuntu 16.04, 2 gb de ram, intercambio de 3 gb, disco de 20 gb. Luego ejecuté un script que consume mucha memoria: con el intercambio predeterminado (60), el sistema se congela y después de unos minutos, lo apagué porque el tiempo de recuperación era inaceptable. Con swappiness 10, el sistema se congela durante unos segundos, luego acepta entradas pero no puede iniciar ningún proceso (por ejemplo, topmatar el cerdo de la memoria). Después de un minuto más o menos, el proceso se mata. No es perfecto, pero nos estamos acercando.
Klamann
Que nos mantengais. La VM no emulará realmente su sistema operativo en la vida real, pero le permitirá jugar con la configuración. Tendré curiosidad si el intercambio ayuda con su problema. Saludos, Al
heynnema
Ah bueno. ¡Progreso! Lea un poco sobre el intercambio. Puedes jugar un poco con el valor. Saludos, Al
heynnema
¿Cuánto intercambio se estaba utilizando cuando el sistema se congeló? Saludos, Al
heynnema
2
¿Por qué, cuál es el punto en eso? más memoria no evitará que el sistema se atasque si también absorbo esa memoria.
Klamann
0

Resolví un problema similar. No sé si mi experiencia puede ser adecuada para ti ...

Recientemente he publicado una guía sobre cómo instalar Linux en dispositivos LVM loopback que se inician desde USB (por lo que sin tener que instalar grub en el disco interno, dejándolo como original). Aquí está la guía: https://github.com/DareDevil73/linux-on-loopback-usb .

Luego caí en el problema de congelación en la carga de memoria alta y observé un uso anormal del espacio de intercambio (toda la RAM consumida, y el uso de intercambio cerca de cero). Obviamente, la partición de intercambio LVM estaba montada y funcionaba correctamente, pero no sé por qué el núcleo no la usó como se esperaba.

Intenté una solución alternativa. He creado un archivo de bucle invertido de intercambio (no LVM) y la congelación se ha ido. ¡Ahora el archivo de intercambio se usa como debería ser, y el sistema operativo nunca se congela!

Mire https://github.com/DareDevil73/linux-on-loopback-usb#known-issues para obtener más información.

Antonio Petricca
fuente
Por favor expanda los enlaces en respuestas.
Konrad Gajewski