Evitar agotar la memoria de un Servidor Privado Virtual

Ayer sufrí un efecto meneame bastante considerable con el post sobre el uso de condones, recibí en apenas 5 horas 8000 visitas y unas 31000 páginas servidas, cifras que seguramente para muchos no sean espectaculares, pero que aguantarlas sobre un servidor privado virtual que corre otros servicios, especialmente de correo, y con solo 256 Mb de RAM supuso para mí un reto importante, y parece que lo conseguí aunque con algunas chapuzas.
El problema
El problema principal al alojar un blog sobre un VPS no reside en el consumo de CPU como en Dreamhost (de hecho la CPU estaba muy ociosa), sino en el consumo de memoria, principalmente porque imposibilitan el uso de swap con lo que el servidor cuenta únicamente con la memoria física para todos los procesos.
Cuando el servidor consume toda la memoria el kernel empieza a matar procesos para liberar memoria y puede dejar incomunicado el servidor. Por tanto hay que intentar evitar que se consuma toda la memoria RAM a toda costa.
La solución
Para ello deberemos optimizar el apache para que libere los recursos más rápidamente y optimizar el uso de memoria del apache evitando cargar los módulos innecesarios.
Además en mi caso tuve que limitar un poco el número máximo de procesos de apache jugando un poco con el parámetro MaxClients para evitar que se lanzasen más procesos de los que el servidor podía aguantar. También bajé los parámetros MaxSpareServers y MinSpareServers para intentar liberar antes la memoria pero me temo que en estos casos esto ayuda poco y lo he cambiado varias veces por lo que no puedo asegurar nada.
Con todo esto conseguí algo de mejora, pero el Apache, MySQL y para colmo Wordpress, pese a tener wp-cache instalado, tragan memoria como monstruos por lo que continuamente me quedaba sin memoria disponible, así que probe a recargar el Apache y ví que se cerraban muchísimos procesos, liberando memoria, y aún así la web era accesible.
Hice un cutre-scriptTM que recargase el Apache cuando se superase un límite mínimo de RAM.
#!/bin/bash
minram=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
sleep 10
done
Puse a correr el script que comprueba cada 10 segundos la RAM disponible, de modo que cuando quedasen libres menos de 50Mb de RAM recargase el Apache liberando así un montón de memoria.
La solución es cutre y solo puede aplicarse en momentos concretos como este, poco ortodoxa y seguro que muchos pensais que soy un chapuzas, pero parece que ha funcionado bien y no se ha interrumpido el servicio mientras ha estado funcionando.
Conclusión
Un VPS es muy cómodo por la flexibilidad que te permite pero tiene el gran problema de la memoria limitada sin swap.


