GNU/Linux >> Tutoriales Linux >  >> Linux

¿Botón "matar el proceso más grande"?

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 memoria RAM es un poco corta 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 que se congela lo suficientemente rápido? O, debido a que es una computadora, una heurística para cuando comienza a congelarse y dispara el proceso más grande también estaría bien.

Respuesta aceptada:

Según su comentario, parece que el sistema simplemente está cambiando.

Linux tiene un asesino OOM, que se invoca cuando el sistema ha sobrecomprometido su memoria y ahora se ha agotado.
Linux por defecto realiza sobrecompromiso de memoria, lo que básicamente significa que le da a los programas más memoria de la que realmente tiene el sistema. Lo hace asumiendo que los programas no usarán toda la memoria que solicitan. Sin embargo, cuando el sistema se queda sin memoria, ya les dijo a los diversos procesos en ejecución que tenían la memoria, por lo que ya no puede negarlo. En cambio, lo que hace es invocar al asesino OOM. El asesino de OOM básicamente encuentra un proceso que el kernel cree que aliviará la condición de falta de memoria. Por lo general, este es solo el proceso que usa la mayor cantidad de memoria, pero el algoritmo en realidad es mucho más complejo que eso.

Dado que tiene overcommit_memory establecer en (modo automático), el núcleo está realizando una sobreasignación de memoria. Entonces, según su comportamiento explicado, parece que el sistema está cambiando 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 introducir cosas en el intercambio. Si su sistema se queda sin intercambio, invoca al asesino OOM. Sin embargo, dado que le queda espacio de intercambio libre, esto no sucede.

Tu idea original, matar manualmente un proceso.

Puede eliminar manualmente un proceso cuando cree que el sistema se está intercambiando demasiado y algo debe morir. Esto se puede hacer a través de los disparadores SysRq del kernel.

El núcleo tiene lo que llama "SysRq mágico". Esta es una pequeña funcionalidad que le dice al kernel 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.

Relacionado:¿Cómo hacer cálculos de números enteros y flotantes, en bash u otros lenguajes/marcos?

Si su kernel tiene Magic SysRq habilitado (opción de kernel CONFIG_MAGIC_SYSRQ ), puede hacerlo 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 mediante programación.

También puede deshabilitar el intercambio por completo, y esto es lo que hago en la mayoría de mis sistemas, y por esta misma razón. El intercambio es beneficioso en el sentido de que el kernel intercambiará de forma preventiva los datos que no se están utilizando, lo que permitirá que se utilice más RAM para el almacenamiento en caché. Pero conduce a este problema de intercambio forzado que está viendo.

Personalmente, creo que la mejor solución es algún tipo de opción de kernel para invocar OOM killer 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 OOM killer.
Desafortunadamente, este es solo mi deseo personal. No hace esto.


Linux
  1. ¿Por qué el kernel soltaría paquetes?

  2. Linux:¿participa en la lista de correo del kernel?

  3. Las mejores preguntas de la entrevista de Linux:intercambio

  4. Ejecutar una función de espacio de usuario desde el espacio del kernel

  5. ¿Cómo monta un kernel la partición raíz?

Cómo el kernel de Linux maneja las interrupciones

Cómo verificar la versión del kernel en Linux

Personalización de Grub de forma sencilla:Grub-customizer

Gestión de intercambio en el sistema Linux moderno

¿Cómo verificar HZ en la terminal?

¿Adónde va la memoria restante de vm.overcommit_ratio?