Me sucede a menudo cuando estoy compilando software en segundo plano y de repente todo comienza a disminuir y eventualmente se congela [si no hago nada], ya que me he quedado sin RAM y espacio de intercambio.
Esta pregunta supone que tengo suficiente tiempo y recursos para abrir Gnome Terminal, buscar en mi historial y ejecutar un sudo
comando.
¿Qué comando puede salvarme de tener que hacer un reinicio completo, o cualquier reinicio?
command-line
ram
freeze
swap
Akiva
fuente
fuente
make
, intente,-j4
por ejemplo, con 4 compilaciones paralelas a la vez.Respuestas:
En mi experiencia, Firefox y Chrome usan más RAM que mis primeras 7 computadoras combinadas. Probablemente más que eso, pero me estoy alejando de mi punto. Lo primero que debe hacer es cerrar su navegador . ¿Un comando?
He vinculado los navegadores más populares en un solo comando allí, pero obviamente si está ejecutando algo más (o sabe que no está usando uno de estos) simplemente modifique el comando. El
killall -9 ...
es el bit importante. La gente se pone insegura acerca deSIGKILL
(señal número 9) pero los navegadores son extremadamente resistentes. Más que eso, terminar lentamente a través deSIGTERM
significará que el navegador hace un montón de basura de limpieza, lo que requiere una explosión de RAM adicional, y eso es algo que no puede permitirse en esta situación.Si no puede obtener eso en un terminal que ya se está ejecutando o en un diálogo Alt+ F2, considere cambiar a un TTY. Control+ Alt+ lo F2llevará a TTY2, lo que debería permitirle iniciar sesión (aunque puede ser lento) e incluso debería permitirle usar algo como
htop
depurar el problema. No creo que me haya quedado sin RAM hasta el punto de no poderhtop
levantarme.La solución a largo plazo implica comprar más RAM, alquilarla a través de una computadora remota o no hacer lo que está haciendo actualmente. Te dejaré los intrincados argumentos económicos, pero en general, la RAM es barata de comprar, pero si solo necesitas una cantidad de ráfaga, un servidor VPS facturado por minuto u hora es una buena opción.
fuente
lazygit
comando que uso de vez en cuando, ¿tal vez algo así podría aplicarse aquí? Todo elkillall ...
guión podría reducirse a algo simpleemptyram
o algo asíemptyram
guión que simplemente pincharkillall -9 firefox
.En un sistema con la tecla de solicitud del sistema mágico habilitada, presionar Alt + System Request+ f(si no está marcado en su teclado, a System Requestmenudo está en la Print Screentecla) invocará manualmente el asesino sin memoria del núcleo (oomkiller), que intenta elegir el peor proceso ofensivo para uso de memoria y matarlo. Puede hacer esto si tiene quizás menos tiempo del que ha descrito y el sistema está a punto de comenzar (o tal vez ya ha comenzado) a sacudirse, en cuyo caso probablemente no le importe exactamente lo que se mata, solo que termine 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 elegir un mal proceso de lo que solía ser.
fuente
kernel.sysrq
a1
o un número que incluye el bit correcto en su/etc/sysctl.d/10-magic-sysrq.conf
.Al contrario de otras respuestas, sugiero que desactive el intercambio mientras lo hace. Si bien el intercambio mantiene su sistema funcionando de manera predecible, y a menudo se usa para aumentar el rendimiento de las aplicaciones que acceden al disco (al desalojar las páginas no utilizadas para dejar espacio para el caché del 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 intercambiar.
Recomendaría deshabilitar el intercambio por completo mientras realiza esta tarea, para que el asesino sin memoria actúe tan pronto como la RAM se llene.
Soluciones alternativas:
zswap
en el núcleo. Esto comprime las páginas antes de enviarlas al intercambio, lo que puede proporcionar suficiente margen de maniobra para acelerar su máquina. Por otro lado, podría terminar siendo un obstáculo con la compresión / descompresión adicional que hace.tcc
. Ej. ), A expensas de un ligero impacto en el rendimiento del producto compilado. (Esto generalmente es aceptable si lo hace con fines de desarrollo / depuración).fuente
sudo swapoff -a
puede ahorrarle cuando ya está en un aprieto: inmediatamente detendrá cualquier uso adicional de espacio de intercambio, es decir, se debe invocar el asesino OOM en el siguiente instante y poner la máquina en funcionamiento.sudo swapoff -a
También es una excelente medida de precaución al depurar fugas de memoria o compilar, por ejemplo, Firefox. Normalmente, el intercambio es un poco útil (por ejemplo, para la hibernación o el intercambio de cosas realmente innecesarias), pero cuando realmente está utilizando la memoria, las congelaciones son peores.Puede usar el siguiente comando (repetidamente si es necesario) para eliminar el proceso utilizando la mayor cantidad de RAM en su sistema:
Con:
ps -eo pid --no-headers --sort=-%mem
: muestra los identificadores de proceso de todos los procesos en ejecución, ordenados por uso de memoriahead -1
: solo mantenga la primera línea (proceso que utiliza la mayor cantidad de memoria)xargs kill -9
: matar el procesoEdite después del comentario exacto de Dmitry:
Esta es una solución rápida y sucia que debe ejecutarse cuando no hay tareas sensibles en ejecución (tareas que no desea
kill -9
).fuente
Antes de ejecutar sus comandos que consumen recursos, también puede usar la llamada al sistema setrlimit (2) , probablemente con la
ulimit
construcción de su shell bash (o lalimit
construcción en zsh) notablemente con-v
forRLIMIT_AS
. Entonces demasiado grande virtual consumo de espacio de direcciones (por ejemplo, con mmap (2) o sbrk (2) utilizado por malloc (3) ) fallará (con errno (3) siendoENOMEM
).Luego, (es decir, los procesos hambrientos en su shell, después de escribir
ulimit
) se terminarían antes de congelar su sistema.Lea también Linux Ate My RAM y considere deshabilitar el sobrecompromiso de memoria (ejecutando el comando
echo 0 > /proc/sys/vm/overcommit_memory
como root, consulte proc (5) ...).fuente
En ese caso, algo así como "killall -9 make" (o lo que sea que esté utilizando para administrar su compilación, si no make). Esto detendrá la compilación y continuará, SIGHUP todos los procesos del compilador iniciados desde allí (con suerte haciendo que se detengan también) y, como beneficio adicional, no necesita sudo asumiendo que está compilando como el mismo usuario con el que inició sesión en como. Y dado que mata la causa real de su problema en lugar de su navegador web, sesión X o algún proceso al azar, no interferirá con cualquier otra cosa que estaba haciendo en el sistema en ese momento.
fuente
Crea un intercambio más para ti.
Lo siguiente agregará 8G de intercambio:
Seguirá siendo lento (está intercambiando) pero en realidad no debería quedarse sin nada. Las versiones modernas de Linux pueden cambiarse a archivos. El único uso para una partición de intercambio en estos días es para hibernar su computadora portátil.
fuente
fallocate -l 8G /root/moreswap
lugar dedd
evitar tener que hacer 8GB de E / S mientras el sistema se agita. Sin embargo, esto no funciona con ningún otro sistema de archivos. Definitivamente no XFS, donde swapon ve extensiones no escritas como agujeros. (Supongo que esta discusión de la lista de correo xfs no funcionó). Vea tambiénswapd
, un demonio que crea / elimina archivos de intercambio sobre la marcha para ahorrar espacio en disco. También askubuntu.com/questions/905668/…xul.dll
) tiene alrededor de 50 MB, por lo que es aproximadamente 10 veces más pesado que el kernel de Linux.Una forma de obtener una porción de RAM libre en un corto plazo 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 normal, y las tasas de compresión son bastante altas con muchos dispositivos RAM modernos como los navegadores web.
Suponiendo que tiene zram instalado y configurado, todo lo que tiene que hacer es ejecutar
fuente
sudo swapoff -a
desactivará el intercambio, haciendo que el kernel elimine automáticamente el proceso con la puntuación más alta si el sistema se queda sin memoria. Lo uso si sé que estaré ejecutando algo pesado en RAM que preferiría matar si se sale de control antes que dejar que se intercambie y se quede atascado para siempre. Usesudo 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 su intercambio está en el mismo disco que la partición raíz, lo que ralentizaría su sistema cuando presiona el intercambio, así que evítelo si puede. Además, en mi opinión, los sistemas modernos a menudo se configuran con demasiado intercambio. 32GiB RAM generalmente significa que el intercambio de 32GiB se asigna de manera predeterminada, como si realmente quisiera poner 32GiB en su espacio de intercambio.
fuente
Otra cosa que se podría hacer es liberar la memoria caché de la página a través de este comando:
De la documentación de kernel.org (énfasis agregado):
fuente
/proc/sys/vm/swappiness
. Con swappiness establecido en 0, tienes razón. Con la configuración predeterminada de 60, estás cerca. Sin embargo, si se establece en 200, serán las páginas menos utilizadas recientemente de los procesos en ejecución las que se descartan primero ... en ese caso particular, este comando puede ser útil. Sin embargo, establecer un intercambio a 0 (o algún valor bajo, tal vez 20 o 30) sería un mejor enfoque general.kswapd
error (algunas personas incluso crearon cronjobs con él). Pero tienes razón, dudo que ayude con esta pregunta.Dijiste "compilando en el fondo". ¿Qué haces en primer plano? Si está desarrollando con Eclipse u otro IDE pesado de recursos, verifique si todo está correctamente terminado en la consola.
Los entornos de desarrollo a menudo permiten iniciar múltiples procesos en desarrollo, estos pueden permanecer bloqueados también después de que ya no esté interesado en ellos (en el depurador, o simplemente no se haya terminado correctamente). Si el desarrollador no presta atención, se pueden acumular decenas de procesos olvidados durante el día, utilizando múltiples gigabytes juntos.
Verifique si todo lo que debería terminarse en IDE está terminado.
fuente