Evitar agotar la memoria de un Servidor Privado Virtual

Atención, post rollazo, solo para interesados.


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.

Si hay algún experto en la sala que pueda sugerir algo se lo agradeceré con mucho gusto.

Publicado el Tuesday 04 de September de 2007 por chuano
Guardado en Documentos , Recetas
Compártelo Trackback

9 comentarios a “Evitar agotar la memoria de un Servidor Privado Virtual” »»

  1. Comment de RuFo publicado el 04/09/07 a las 9:14
    Gravatar RuFo

    Me has dejado a cuadros… eso sí, casi 200 lectores en Feedburner, y un puesto 44 en Blogalaxia… ¡anda que no! ;-)

  2. Comment de Javi J. publicado el 04/09/07 a las 12:28
    Gravatar Javi J.

    chuano no si porque te admiro mas, si por tener tantas visitas o por hacer todo lo que pone en el post

  3. Comment de chuano publicado el 04/09/07 a las 14:32
    Gravatar chuano

    RuFo, a cuadros ¿por qué?

    Lo del feedburner y el ranking, las visitas y tal se relajan rápido, amñana no queda ni rastro, pero bueno, siempre se quedará alguno :)

    Javi J, no creo que tengas que admirarme por nada… Lo del post no es nada especial, y als visitas han sido por meneame no por mi :P

    Al final la cosa ayer quedó en 9766 visitas y 39554 páginas servidas, no está mal, hoy aún hay residuos :)

    Saludos!

  4. Comment de RuFo publicado el 04/09/07 a las 16:15
    Gravatar RuFo

    A cuadros porque no he entendido ni papa… imagina que no he conseguido aún hacer funcionar el wifi WPA en Ubuntu y quieres que entienda esto… :shock:

  5. Comment de santi_monse publicado el 04/09/07 a las 23:30
    Gravatar santi_monse

    Te felicito por la ola de visitas :o)

    ¡Saludos!

  6. Comment de chuano publicado el 05/09/07 a las 8:46
    Gravatar chuano

    Jaja RuFo, ya he dicho que era un post rollo, solo para interesados :P

    Gracias santi_monse, pero no son reales, ya han desaparecido :)

    Saludos!

  7. Comment de Rafa publicado el 24/12/07 a las 4:54
    Gravatar Rafa

    Hola.
    Perdón por hacerte una pregunta que no tiene nada que ver (o casi nada) con el tema.
    Resulta que necesito hacer un script que compruebe cada 10 segundos un proceso de mi conexión a internet, y si este no está activo que ejecute el comando para conectar nuevamente.
    No es que te esté pidiendo que me lo hagas, sino que como veo que sabes del tema, me indiques si es posible donde y como puedo buscar información para aprender acerca de esto. Tengo poca idea de programación, estoy buscando algo más bien básico.
    Muchas gracias.

  8. Comment de chuano publicado el 26/12/07 a las 10:20
    Gravatar chuano

    Rafa, si usas PPP normalmente en la configuración del wvdial o pppd se puede marcar que reconecte cuando esté caida.

    De todas formas siempre puedes hacer un script que haga un ping a una IP que sepas está activa, y compruebe si hay respuesta cada 10 segundos.

    Por ejemplo algo así:

    while true; do
    	ping -c1 google.es > /dev/null
    	if [ $? -ne 0 ]; then #comprobamos el resultado del ping
    		script-conexion.sh
    	fi
    	sleep 10
    done
    

Trackbacks/Pingbacks

  1. [...] Esto de la web y los blogs está repleto de efectos, el conocido efecto slashdot, su hermano pequeño (y desfasado ya) efecto barrapunto, el nuevo efecto meneame… [...]


Deja un Comentario

[x] Cerrar
E-mail
Subir