process - Configuración de los límites de consumo de memoria con Upstart
limit memory-consumption (2)
Anexar esto al final de myapp-web-*.conf
provocará que cualquier llamada de asignación que intente asignar más de 150mb
de memoria devuelva ENOMEM
:
limit rss 157286400 157286400
El proceso puede fallar en este punto o no. Eso depende del proceso!
Recientemente me he vuelto bastante aficionado a Upstart. Anteriormente he estado usando God, Monit y Bluepill, pero realmente no me gustan estas soluciones, así que estoy probando con Upstart.
He estado usando la gema Foreman para generar algunos archivos de configuración de Upstart básicos para mis procesos en /etc/init
. Sin embargo, estos archivos generados solo manejan el reaparecimiento de un proceso bloqueado. Me preguntaba si es posible decirle a Upstart que reinicie un proceso que consume, por ejemplo, > 150mb
de memoria, como haría con Monit, God o Bluepill.
Leí los documentos de Upstart y this parece ser lo que estoy buscando. Aunque no tengo ni idea de cómo configurar algo como esto.
Lo que básicamente quiero es bastante simple. Quiero reiniciar mi proceso web
si el uso de memoria es > 150mb
ram. Estos son los archivos que tengo:
|-- myapp-web-1.conf
|-- myapp-web-2.conf
|-- myapp-web-3.conf
|-- myapp-web.conf
|-- myapp.conf
Y sus contenidos son:
myapp.conf
pre-start script
bash << "EOF"
mkdir -p /var/log/myapp
chown -R deployer /var/log/myapp
EOF
end script
myapp-web.conf
start on starting myapp
stop on stopping myapp
myapp-web-1.conf / myapp-web-2.conf / myapp-web-3.conf
start on starting myapp-web
stop on stopping myapp-web
respawn
exec su - deployer -c ''cd /var/applications/releases/20110607140607; cd myapp && bundle exec unicorn -p $PORT >> /var/log/myapp/web-1.log 2>&1''
Cualquier ayuda muy apreciada!
Desde los documentos de Upstart, los límites provienen de las opciones de llamada del sistema rlimit
. ( http://upstart.ubuntu.com/cookbook/#limit )
Dado que la configuración de Linux 2.4+ rss (Resident Set Size) no tiene ningún efecto.
Una alternativa ya sugerida en otras respuestas es la que establece los límites de tamaño del espacio de direcciones de la memoria virtual. Esto tendrá un efecto muy diferente de establecer límites de memoria "reales".
limit as <soft limit> <hard limit>
Extracto de las páginas del manual para setrlimit:
RLIMIT_AS El tamaño máximo de la memoria virtual del proceso (espacio de direcciones) en bytes. Este límite afecta a las llamadas a brk (2), mmap (2) y mremap (2), que fallan con el error ENOMEM al exceder este límite. También la expansión automática de la pila fallará (y generará un SIGSEGV que mata el proceso si no se ha hecho disponible una pila alternativa a través de sigaltstack (2)). Dado que el valor es largo, en máquinas con un largo de 32 bits, este límite es a lo sumo 2 GiB, o este recurso es ilimitado.