Botón "Matar al proceso más grande"

14

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.

Reactormonk
fuente
¿Te refieres al comando "matar el proceso más grande"?
Ramesh
Linux tiene esto. Se llama el asesino OOM. Pero debe habilitar el sobrecompromiso de memoria (y está activado de forma predeterminada en la mayoría de las distribuciones).
Patrick
@Patrick overcommit_memoryes 0, overcommit_ratioes 50.
Reactormonk

Respuestas:

12

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_memoryconfigurado en 0(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.

  1. Alt+ SysRq+ f
    Simplemente presione estas 3 teclas en el teclado.
  2. 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.

Patricio
fuente
No sabía sobre OOM Killer. Estaba pensando en un script que monitorea continuamente el uso de la memoria usando topo pscomando y si excede cierto límite umbral, matando ese proceso usando el killcomando.
Ramesh
No uso ningún intercambio.
Reactormonk
para ver qué proceso fue matado por el asesino OOM:grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
Lesmana
@Tass Oh, miré por completo el comentario "Decidí omitir el intercambio", lo siento :-(. Aunque la información de "matar manualmente un proceso" sigue en pie. Sin embargo, no deberías experimentar lentitud cuando te quedas sin memoria. debe experimentar el kernel que acaba de matar cosas.
Patrick
@Patrick eso sucede, pero después de ~ 30 minutos.
Reactormonk