Todos lo hemos experimentado: se le pide a algún programa que haga algo que requiera una gran cantidad de memoria. Intenta de forma diligente asignar toda esta memoria, y el sistema comienza a sacudirse de inmediato, intercambiando interminablemente y volviéndose lento o no responde.
Recientemente experimenté esto en mi computadora portátil Ubuntu debido a un script de Matlab que intentaba asignar una matriz ridículamente enorme. Después de ~ 5 + minutos de paliza, pude Ctrl-F1 a una consola y maté a Matlab. Preferiría tener algunas teclas de acceso rápido que me hubieran dado el control del sistema inmediatamente y me hubieran permitido matar el proceso ofensivo; o, tal vez, simplemente rechazar silenciosamente asignar un búfer tan grande.
¿Cuál es la forma más rápida de recuperar el control de un sistema Linux que ha dejado de responder o extremadamente lento debido al intercambio excesivo?
¿Existe una forma efectiva de evitar que ocurra tal intercambio en primer lugar, por ejemplo, limitando la cantidad de memoria que un proceso puede intentar asignar?
Ya respondí anteriormente con Alt-SysRq-F
Estoy respondiendo esta segunda parte. Sí,
ulimit
aún funciona lo suficientemente bien como para limitar un solo proceso. Usted puede:Además, como se menciona brevemente:
De hecho, los cgroups ofrecen un control más avanzado, pero actualmente son más complicados de configurar en mi opinión.
Ulimit de la vieja escuela
Una vez fuera
Aquí hay un ejemplo simple:
Eso:
r2(){ r2 $@$@;};r2 r2
que masticará exponencialmente la CPU y la RAM al duplicarse infinitamente mientras solicita memoria de pila.Como puede ver, se detuvo al intentar solicitar más de 1 GB.
Tenga en cuenta que
-v
funciona con asignación de memoria virtual (total, es decir, físico + intercambio).Protección permanente
Para limitar la asignación de memoria virtual,
as
es el equivalente de-v
paralimits.conf
.Hago lo siguiente para protegerme contra cualquier proceso de mala conducta:
address space limit = <physical memory> - 256MB
.Un trazador de líneas:
Para validar, esto da como resultado lo siguiente (por ejemplo, en un sistema de 16 GB):
Notas:
rss
opción en limits.conf. No es respetado por los núcleos más nuevos.Grupos CG más nuevos
Ofrece más control, pero actualmente es más complejo de usar:
memory.max_usage_in_bytes
puede contabilizar y limitar la memoria física por separado.ulimit -m
y / orss
en ellimits.conf
que estaba destinado a ofrecer una funcionalidad similar, pero que no funciona desde el núcleo de Linux 2.4.30!cgroup_enable=memory swapaccount=1
.cgm
ahora parece ser la herramienta de espacio de usuario oficialmente compatible.Por ejemplo, para verificar la configuración actual:
Por ejemplo, para limitar la memoria de un solo proceso:
Para verlo en acción masticando RAM como un proceso en segundo plano y luego asesinado:
Tenga en cuenta el crecimiento exponencial (potencia de 2) en las solicitudes de memoria.
En el futuro, esperemos ver "distro / vendors" preconfigurar las prioridades y límites de cgroup (a través de unidades systemd) para cosas importantes como SSH y la pila gráfica, de modo que nunca pierdan memoria.
fuente
Puede presionar Ctrl- zpara suspender el programa. Luego puede hacer
kill %1
(o lo que sea el número de trabajo o puede usar el PID).Puede usar el
ulimit
comando para intentar limitar la cantidad de memoria disponible para un proceso.fuente
kill -STOP <pid>
que hará lo mismo que Ctrl-Z.Puede usar CGroups para limitar el uso de recursos y prevenir tales problemas: https://en.wikipedia.org/wiki/Cgroups
fuente
Siempre existe el
xkill
comando clásico (de xorg-x11-apps-7.4-14.fc14.src.rpm en mi sistema). Supongo que no debería ser demasiado difícil hacer un clon que envíe SIGSTOP en lugar de matar la ventana de destino.fuente