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 ulimit
antes 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
SIGSTOP
ped, 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?
ulimit
.Respuestas:
niceload --noswap yourprg está hecho exactamente para esa situación: analiza la actividad de intercambio:
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 yourprg
funciona 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.fuente
Si. Se hace bastante fácilmente con prácticamente cualquier caparazón moderno.
Puede usar la
-l
opción para límites de memoria bloqueados. Su proceso será señalado si se excede el límite.fuente
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.
fuente