Ubuntu se está quedando rápidamente sin RAM, y mi computadora está empezando a congelarse. ¿Qué comando resolverá esto?

72

Me sucede muy a menudo cuando estoy compilando software en segundo plano y de repente todo comienza a disminuir y finalmente se congela [si no hago nada], ya que me he quedado sin memoria RAM y espacio de intercambio.

Esta pregunta supone que tengo suficiente tiempo y recursos para abrir el terminal Gnome, buscar en mi historial y ejecutar un comando sudo .

¿Qué comando puede salvarme de tener que hacer un reinicio difícil, o cualquier reinicio?

    
pregunta Akiva 03.07.2017 - 09:15

11 respuestas

84

Según mi experiencia, Firefox y Chrome usan más memoria RAM que mis primeras 7 computadoras combinadas. Probablemente más que eso, pero me estoy alejando de mi punto. Lo primero que debes hacer es cerrar el navegador . ¿Un comando?

killall -9 firefox google-chrome google-chrome-stable chromium-browser

He vinculado los navegadores más populares en un solo comando, pero obviamente si está ejecutando algo más (o sabe que no está utilizando uno de estos) simplemente modifique el comando. El killall -9 ... es el bit importante. La gente tiene dudas acerca de SIGKILL (señal número 9) pero los navegadores son extremadamente elásticos. Más que eso, terminar lentamente a través de SIGTERM significará que el navegador realiza una carga de basura de limpieza -que requiere una ráfaga de RAM adicional- y eso es algo que no puede permitirse en esta situación.

Si no puede obtenerlo en un terminal que ya se está ejecutando o en un diálogo Alt + F2 , considere cambiar a un TTY. Control + Alt + F2 lo llevará a TTY2, que debería permitirle iniciar sesión (aunque podría ser lento) e incluso debería permitirle usar algo así como htop para depurar el problema. No creo que me haya quedado sin memoria RAM hasta el punto en que no pude obtener htop up.

La solución a largo plazo implica comprar más memoria RAM, alquilarla a través de una computadora remota o no hacer lo que está haciendo actualmente. Dejaré los intrincados argumentos económicos a su consideración, pero en términos generales, la RAM es barata de comprar, pero si solo necesita una cantidad en ráfaga, un servidor VPS facturado por minuto o por hora es una buena opción.

    
respondido por el Oli 03.07.2017 - 09:30
66

En un sistema con la clave de solicitud del sistema mágico habilitada, presionando Alt + Solicitud del sistema + f (si no está marcado en su teclado, Solicitud del sistema a menudo se encuentra en la tecla de pantalla de impresión invocará manualmente el asesino sin memoria del kernel (oomkiller), que trata de elegir el peor proceso para el uso de memoria y matar eso. Puede hacer esto si tiene quizás menos tiempo de lo que ha descrito y el sistema está a punto de comenzar (o tal vez ya ha empezado) paliza, en cuyo caso probablemente no le importe exactamente lo que se mata, solo que termina con un sistema utilizable. A veces, esto puede terminar matando a X, pero la mayoría de las veces en estos días es mucho mejor para elegir un mal proceso de lo que solía ser.

    
respondido por el Muzer 03.07.2017 - 10:44
20

Contrariamente a otras respuestas, sugiero que deshabilite el intercambio mientras lo hace. Mientras swap mantiene su sistema funcionando de manera predecible, y se usa a menudo para aumentar el rendimiento de las aplicaciones que acceden al disco (expulsando páginas no utilizadas para dejar espacio para el caché de disco), en este caso parece que su sistema se está ralentizando a niveles inutilizables porque se está desalojando por la fuerza demasiada memoria utilizada activamente para intercambiarla.

Recomendaría deshabilitar el intercambio por completo mientras realizaba esta tarea, de modo que el asesino sin memoria se active tan pronto como se llene la memoria RAM.

Soluciones alternativas:

  • Aumente la velocidad de lectura del intercambio colocando su partición de intercambio en RAID1
    • O RAID0 si te sientes arriesgado, pero eso reducirá una gran cantidad de programas en ejecución si alguno de tus discos no funciona bien.
  • Disminuya el número de trabajos de compilación concurrentes ("más núcleos = más velocidad", todos decimos, olvidando que se necesita un número de peaje lineal en la RAM)
  • Esto podría ir en ambas direcciones, pero intenta habilitar zswap en el kernel. Esto comprime las páginas antes de que se envíen al intercambio, lo que puede proporcionar suficiente espacio de maniobra para acelerar su máquina. Por otro lado, podría terminar siendo un obstáculo con la compresión / descompresión extra que hace.
  • Baje las optimizaciones o use un compilador diferente. La optimización del código a veces puede ocupar varios gigabytes de memoria. Si tiene LTO encendido, también va a usar mucha RAM en la etapa de enlace. Si todo lo demás falla, puede intentar compilar su proyecto con un compilador de peso ligero (por ejemplo, tcc ), a expensas de un ligero golpe de rendimiento en tiempo de ejecución para el producto compilado. (Esto generalmente es aceptable si lo hace para fines de desarrollo / depuración).
respondido por el Score_Under 03.07.2017 - 17:47
14

Puede utilizar el siguiente comando (repetidamente si es necesario) para eliminar el proceso que utiliza la mayor cantidad de RAM en su sistema:

ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9

Con:

  • ps -eo pid --no-headers --sort=-%mem : muestra los identificadores de proceso de todos los procesos en ejecución, ordenados por uso de memoria
  • head -1 : solo mantenga la primera línea (proceso que usa la mayor cantidad de memoria)
  • xargs kill -9 : matar el proceso

Editar después del comentario preciso de Dmitry:

Esta es una solución rápida y sucia que debe ejecutarse cuando no hay tareas confidenciales en ejecución (tareas que no desea kill -9 ).

    
respondido por el Gohu 03.07.2017 - 15:12
11

Antes de ejecutar los comandos que consumen recursos, también puede usar el setrlimit (2) llamada al sistema, probablemente con el ulimit incorporado de tu shell bash ( o el limit integrado en zsh) notablemente con -v para RLIMIT_AS . Entonces el consumo de espacio de direcciones virtuales es demasiado grande (por ejemplo, con mmap (2) o sbrk (2) utilizado por malloc (3) ) fallará (con errno (3) siendo ENOMEM ).

Entonces ellos (es decir, los procesos hambrientos en tu shell, después de que hayas escrito ulimit ) terminarían antes de congelar tu sistema.

Lea también Linux Ate My RAM y considere deshabilitar overcommitment de memoria (ejecutando el comando echo 0 > /proc/sys/vm/overcommit_memory como root, consulte proc (5) ...).

    
respondido por el Basile Starynkevitch 04.07.2017 - 05:42
11
  

esto me pasa muy a menudo cuando estoy compilando software en el   fondo

En ese caso, algo así como "killall -9 make" (o lo que sea que esté usando para administrar su compilación, si no es así). Esto detendrá el proceso de compilación aún más, ALIMENTARÁ todos los procesos de compilación iniciados desde allí (con suerte también los detendrá) y, como bonificación, no necesita sudo asumiendo que está compilando como el mismo usuario que está conectado en como. Y dado que mata la causa real de su problema en lugar de su navegador web, sesión de X o algún proceso al azar, no interferirá con cualquier otra cosa que estuviera haciendo en el sistema en ese momento.

    
respondido por el fluffysheap 05.07.2017 - 07:34
9

Crea más swap para ti.

Lo siguiente agregará 8G de swap:

dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap

Todavía será lento (está intercambiando) pero no debería agotarse. Las versiones modernas de Linux pueden intercambiar archivos. El único uso para una partición de intercambio en estos días es para hibernar su computadora portátil.

    
respondido por el William Hay 03.07.2017 - 14:35
4

Una forma de obtener un trozo de RAM libre en poco tiempo es usar zram , que crea un disco RAM comprimido y se intercambia allí. Con cualquier CPU medio decente, esto es mucho más rápido que el intercambio regular, y las tasas de compresión son bastante altas con muchos tipos modernos de RAM como navegadores web.

Suponiendo que tiene instalado y configurado zram, todo lo que tiene que hacer es ejecutar

sudo service zramswap start
    
respondido por el Dmitry Grigoryev 04.07.2017 - 13:01
3

Otra cosa que se podría hacer es liberar el caché de la página de memoria a través de este comando:

echo 3 | sudo tee /proc/sys/vm/drop_caches

De la kernel.org documentación (énfasis agregado):

  

drop_caches

     

Escribir esto hará que el kernel elimine los cachés limpios, así como   objetos recuperables de losa como dentries e inodos. Una vez descartado,   su memoria se vuelve libre .

     

Para liberar pagecache: echo 1 & gt; / proc / sys / vm / drop_caches Para liberar   objetos recuperables de losa (incluye dentries e inodos): echo 2 & gt;   / proc / sys / vm / drop_caches Para liberar objetos de losa y pagecache: echo 3 & gt;   / proc / sys / vm / drop_caches

     

Esta es una operación no destructiva y no liberará ningún objeto sucio   objetos. Para aumentar la cantidad de objetos liberados por esta operación,   el usuario puede ejecutar 'sync' antes de escribir en / proc / sys / vm / drop_caches.   Esto minimizará la cantidad de objetos sucios en el sistema y   crear más candidatos para ser eliminados.

    
respondido por el Sergiy Kolodyazhnyy 03.07.2017 - 15:13
2

sudo swapoff -a deshabilitará el intercambio, haciendo que el kernel elimine automáticamente el proceso con puntaje más alto si el sistema se queda sin memoria. Utilizo esto si sé que voy a ejecutar algo pesado en RAM que preferiría matar si se sale de control antes de dejarlo entrar en intercambio y quedar atrapado para siempre. Use sudo swapon -a para volver a habilitarlo después.

Más tarde, es posible que desee echar un vistazo a su configuración de intercambio. Parece que tu intercambio está en el mismo disco que la partición raíz, lo que ralentizaría tu sistema cuando toques el intercambio, así que evita eso si puedes. Además, en mi opinión, los sistemas modernos a menudo se configuran con demasiados cambios. 32GiB RAM generalmente significa que el intercambio de 32GiB está asignado por defecto, como si realmente quisiera poner 32GiB en su espacio de intercambio.

    
respondido por el sudo 07.07.2017 - 17:02
1

Dijiste "compilar en segundo plano". ¿Qué estás haciendo en primer plano? Si está desarrollando con Eclipse u otro IDE pesado de recursos, verifique si todo está terminado correctamente en la consola.

Los entornos de desarrollo a menudo permiten iniciar varios procesos en desarrollo, estos pueden permanecer bloqueados incluso después de que ya no estén interesados ​​en ellos (en el depurador, o simplemente no terminados correctamente). Si el desarrollador no presta atención, decenas de procesos olvidados pueden acumularse durante el día, utilizando múltiples gigabytes juntos.

Verifique si se termina todo lo que debe terminar en IDE.

    
respondido por el h22 08.07.2017 - 08:00

Lea otras preguntas en las etiquetas