Como bien sabéis estoy teniendo problemas con el servidor y Apache. En ocasiones sin saber muy bien por qué apache crea tantos hijos que sobrecarga el servidor hasta consumir toda la RAM disponible. Cuando llega a ese punto Linux se encarga de matar los procesos menos prioritarios para liberar recursos. En este caso cuando llega ese punto mata todos los procesos apache y el servidor web se cae.
Para tratar de evitar este problema y consultando con google he preparado este script basándome en un artículo que he encontrado en chuano.net.:
#!/bin/bash minram=200 extraminram=50 while true; do memusage=$(free -m | head -2 | tail -1 | awk {'print $4'}) if [ "$memusage" -lt "$minram" ]; then /etc/init.d/apache reload fi if [ "$memusage" -lt "$extraminram" ]; then /etc/init.d/apache restart fi sleep 1 done |
Este script lo he llamado control_apache.sh y tras darle los permisos de ejecución oportunos lo ejecuto de la siguiente forma:
# nice -n -19 nohup ./control_apache.sh &
De este modo el script se ejecuta con máxima prioridad y cuando el servidor se queda con menos de 200MB libres de RAM, recarga apache. Si por el contrario la RAM libre desciende a 50MB reinicia apache, matando así todos los hijos y liberando la RAM.
Esto es un puto hack de la peor calaña 😀
Un saludo,
Pedro
De momento es lo único que me sirve…porque el MaxServers, y el limitar los threads de apache…se los salta y crea hijos hasta que lo tumba…
En que ruta pongo ese archivo?
Se ejecuta sólo o tengo que estarlo ejecutando manualmente?
Gracias!
Samuel,
El script lo puedes poner en la ruta que quieras. No importa para nada. Luego lo puedes ejecutar manualmente y el script se queda corriendo en background y reiniciando el apache si cumple las condiciones preestablecidas.
tengo problemas con mi server que crea y crea y crea procesos y siempre acumula y nunca los finaliza…
probare que tal me va con este script. gracias por la información.
Una consulta extra, en mi caso, lo coloque en /etc/control_apache.sh
pero me da el siguiente error:
nohup: ignoring input and appending output to `nohup.out’
nohup: cannot run command `/etc/control_apache.sh’: Permission denied
[1]+ Exit 126 nice -n -19 nohup /etc/control_apache.sh
puede ser porque modifique el archivo? en mi caso apache es apache2 y reemplace la ruta por /etc/init.d/apache por etc/init.d/apache2
sera por eso? es que yo no tengo «apache» tengo «apache2»
y una ultima consulta… si quisiera agregar una tercer linea que diga que cuando falten 5 megas de memoria se reinicie… eso seria posible?
gracias y mil disculpas por las molestias
Hola como estas
Mira he subido el script al servidor y no logro ejecutarlo.
Si me puedes orientar.
Gracias
Pablo
Hola,
¿Tienes permisos de ejecución? ¿Lo estás ejecutando en la misma ruta en que está el script o te falta corregir la ruta si has hecho un copy&paste?
Un saludo
Estos problemas suelen pasar en Fast-cgi, por lo que es mejor limitar el tiempo de ejecución de estos procesos para que no consuman memoria.
en /etc/httpd/conf.d/fcgid.conf añadir las siguiente líneas:
DefaultMinClassProcessCount 0
DefaultMaxClassProcessCount 8
DefaultMaxClassProcessCount 70
IdleTimeout 60
ProcessLifeTime 120
IdleScanInterval 30