Esta computadora portátil tiene un SSD y, por lo tanto, decidí omitir el intercambio. Esto funciona bien en la mayoría de los casos, pero a veces la RAM se acorta un poco y la computadora se vuelve muy lenta y tiende a congelarse. ¿Hay alguna manera de implementar un botón de "matar el proceso más grande" que vaya directamente al kernel en caso de que note la congelación lo suficientemente rápido? O, debido a que es una computadora, una heurística para cuando comienza a congelarse y disparar el proceso más grande también estaría bien.
14
overcommit_memory
es0
,overcommit_ratio
es50
.Respuestas:
Según su comentario, parece que el sistema solo se está intercambiando.
Linux tiene un asesino OOM, que se invoca cuando el sistema ha comprometido en exceso su memoria y ahora se ha agotado.
Linux por defecto realiza un exceso de memoria, lo que básicamente significa que le da a los programas más memoria de la que realmente tiene el sistema. Hace esto asumiendo que los programas no usarán toda la memoria que solicitan. Sin embargo, cuando el sistema se queda sin memoria, ya le dijo a los diversos procesos en ejecución que tienen memoria, por lo que no puede negarlo más. En cambio, lo que hace es invocar al asesino OOM. El asesino OOM básicamente encuentra un proceso que el núcleo cree que aliviará la condición de falta de memoria. Por lo general, este es solo el proceso que utiliza la mayor cantidad de memoria, pero el algoritmo es en realidad mucho más complejo que eso.
Como se ha
overcommit_memory
configurado en0
(modo automático), el kernel está realizando un exceso de memoria. Entonces, según su comportamiento explicado, parece que el sistema está intercambiando mucho.A partir de aquí hay 2 opciones.
Reducir intercambio
Su sistema se está quedando sin RAM, por lo que el núcleo comienza a cambiar las cosas. Si su sistema se queda sin intercambio, entonces invoca al asesino OOM. Sin embargo, dado que le queda espacio de intercambio libre, esto no sucede.
Su idea original, matar manualmente un proceso.
Puede matar manualmente un proceso cuando cree que el sistema está intercambiando demasiado y algo necesita morir. Esto se puede hacer a través de los activadores SysRq del núcleo.
El núcleo tiene lo que llama "magic SysRq". Esta es una pequeña funcionalidad que le dice al núcleo que realice algún tipo de operación de emergencia. Esto puede ser cosas como "volver a montar todos los volúmenes de solo lectura", "sincronizar todos los sistemas de archivos" o "reiniciar ahora". Una de estas opciones es también invocar al asesino OOM.
Si su kernel tiene SysRq mágico habilitado (opción de kernel
CONFIG_MAGIC_SYSRQ
), puede hacer esto de 2 maneras.Simplemente presione estas 3 teclas en el teclado.
echo f > /proc/sysrq-trigger
Esto realizará exactamente la misma tarea que el método del teclado, pero lo hace programáticamente.
También puede deshabilitar el intercambio por completo, y esto es lo que hago en la mayoría de mis sistemas, y por esta razón exacta. El intercambio es beneficioso porque el núcleo intercambiará de manera preventiva datos que no se están utilizando, permitiendo que se use más ram para el almacenamiento en caché. Pero conduce a este problema de intercambio forzado que estás viendo.
Personalmente, creo que la mejor solución es algún tipo de opción de kernel para invocar al asesino OOM en el intercambio forzado. Básicamente, deje que el intercambio preventivo funcione, pero si el núcleo se ve obligado a mover algo al intercambio porque no tiene RAM, invoque el asesino OOM.
Lamentablemente, este es solo mi deseo personal. No hace esto.
fuente
top
ops
comando y si excede cierto límite umbral, matando ese proceso usando elkill
comando.grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1