¿Es posible imponer algún tipo de límite flexible en el consumo de memoria de los procesos?


10

Creo que no es un problema tan infrecuente: un proceso asigna cantidades masivas de memoria (ya sea debido a un error de pérdida de memoria, porque intentas procesar un archivo de entrada demasiado grande, o lo que sea). La RAM se llena, y en algún momento Linux tiene que cambiar para intercambiar. Bueno, a veces este es solo el último recurso: si tengo un cálculo costoso, no quiero perder datos si al final me quedo sin RAM.

Sin embargo, más a menudo (en mi experiencia), el consumo de memoria no tiene límites, debido a un proceso deshonesto, quizás con errores. Es decir, no solo termino con algunos datos menos urgentes que se necesitan mover para intercambiar, sino que el sistema operativo se ve obligado a intercambiar cargas de datos de forma pánico. Y eso desafortunadamente no solo rompe en gran medida el proceso ofensivo, sino que puede detener casi todo el sistema (ya no es tan malo en máquinas con SSD, pero OTOH me preocupa si escribir gigabytes y gigabytes de datos basura puede A largo plazo dañar las células flash).
Hasta que note el problema y elimine manualmente el proceso (¡una vez que en realidad me tomó minutos hasta que incluso logré iniciar sesión en un terminal virtual!), La mitad de mi sesión de ejecución está en intercambio, y necesito esperar un buen rato hasta que el sistema funcione sin problemas otra vez.

Hay una solución draconica al problema: imponer un límite de memoria rígida. Pero hacer esto en todo el sistema a veces mataría procesos que aún necesito, y si tengo que hacerlo manualmente ulimitantes de comenzar un proceso ofensivo ... bueno, a menudo lo olvidaré hasta que sea demasiado tarde.

Posibles tipos de solución con los que estaría más feliz:

  • Si algún proceso excede cierto uso de memoria, se reduce artificialmente para que el resto del sistema responda.
  • Si algún proceso excede un cierto uso de memoria, es SIGSTOPped, así que tengo tiempo para averiguar qué hacer a continuación.
  • Si un proceso se acerca al límite de RAM, recibo una advertencia, antes de que comience el gran intercambio.

¿Hay alguna forma de obtener tal comportamiento o similar?


2
Puede limitar la cantidad de RAM utilizada por un proceso o grupo de procesos, utilizando cgroups. stackoverflow.com/questions/3043709/…
Mark Plotnick

2
Esto es literalmente para lo que es exactamente el tipo de cosas ulimit.
DopeGhoti

1
Ulimit -m sería lo que se usaría, excepto que no ha funcionado en Linux desde 2.4.30, y solo funcionó en ciertas situaciones antes de eso. unix.stackexchange.com/questions/129587/…
Mark Plotnick

niceload --noswap yourprg
Ole Tange

Respuestas:


6

niceload --noswap yourprg está hecho exactamente para esa situación: analiza la actividad de intercambio:

  • Si se cambia: deje que el proceso se ejecute
  • Si se intercambia: deje que se ejecute el proceso
  • Si el intercambio entra y sale: suspenda el proceso hasta que el intercambio se detenga y reanude el proceso cuando el intercambio se detenga

No suspende el proceso antes de que comience el intercambio, pero permite que el intercambio se ejecute durante 1 segundo antes de actuar.

niceload --mem 1G yourprgfunciona de manera similar: si menos de 1 GB está libre, youprg está suspendido. Cuando más de 1 GB está libre, se reanuda su prg.


0

Si. Se hace bastante fácilmente con prácticamente cualquier caparazón moderno.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

Puede usar la -lopción para límites de memoria bloqueados. Su proceso será señalado si se excede el límite.


-1

Cronjob para borrar la memoria caché: cómo borrar la memoria caché en Linux

En realidad tengo problemas similares. Tengo un grupo de usuarios que ejecutan sus propios scripts personalizados y de vez en cuando sus scripts consumen toda la memoria disponible y hacen caer el servidor redhat. La razón del consumo masivo de RAM fue que sus scripts pueden ejecutarse durante días solo esperando un evento, lo que acapara recursos cuando en realidad no está utilizando ninguno. Entonces, lo que hice fue simplemente forzar el borrado de la memoria caché con un cronjob y no he tenido ningún problema desde entonces.

Simple y vago.


Hm. Sugerencia interesante, aunque me temo que no hace nada para la mayoría de los problemas que estoy experimentando. Mi principal problema es con procesos únicos (aplicaciones científicas) que pueden asignar rápidamente muchos gigabytes de memoria.
Leftaroundabout

Borrar cachés generalmente presenta problemas de rendimiento. Muy ocasionalmente resuelven problemas de rendimiento. Pero no harán que la memoria esté disponible cuando no esté allí.
Gilles 'SO- deja de ser malvado'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.