Easypromos: Trucos para mejorar la escalabilidad de tus servidores LAMP

Posted in: Aplicaciones para FacebookÚltima actualización: 13/04/17

Easypromos es una aplicación de Facebook con más de 500.000 usuarios activos al mes, y por tanto debe conseguir un alto grado de escalabilidad para poder servir una cantidad ingente de peticiones de múltiples promociones simultáneamente.

Como existe una gran cantidad de promociones muy activas en el sistema con tiempo limitado, hay la posibilidad que el servidor se sobrecargue si este no está dimensionado y preparado para escalar.

Lo más importante para conseguir una buena escalabilidad es optimizar la aplicación. Debes encontrar los cuellos de botella rápidamente y tomar decisiones ágiles sobre como cachear recursos utilizados habitualmente. Es muy importante optimizar las URLs más utilizadas, incluso generando ficheros estáticos cuando sea necesario.

Otro punto de vista importante es el del software de base. Nosotros usamos un stack LAMP, con algunas particularidades para asegurar un buen tiempo de respuesta.

Basic software stack:
– Apache
– PHP
– MySQL

Particular stack:
– Memcache
– Lighttpd
– Eaccelerator
– Monit

El basic software stack es obvio y fácil de instalar y configurar.

Nota: Es importante dimensionar el límite de procesos de Apache que tu servidor puede soportar como máximo antes de entrar en thrashing; por ejemplo, hemos comprobado empíricamente que un servidor típico dual core con 4Gbs de RAM, y todo el stack tecnológico (Apache+PHP+MySQL) instalado en una sola instancia, puede asumir un máximo de 600 procesos de Apache concurrentes (MaxClients 600) antes de empezar a colapsarse. Esto quiere decir que si estás llegando a este límite, y encolando peticiones, debes darte prisa en repartir servicios entre varios servidores y preparar un load balancer para servir peticiones desde más de un servidor a la vez. Evidentemente cada apliación es distinta y tu limite puede estar por encima o por debajo de este número.

Nuestro stack particular no es muy complejo, pero te puede dar algunas guías para incrementar tu escalabilidad, velocidad y capacidad de monitorización si añades algunas piezas a la configuración estándard.

Memcache:
http://memcached.org/

Memcache es una caché de memoria muy simple pero potente. Puedes guardar y recuperar objetos con una API muy simple, y reservar una cantidad de memoria fija del servidor para mantener los objetos según un LRU.

Dependiendo del framework de PHP que estés usando o si usas algún O/R Mapping, o incluso si estás haciendo llamadas standard a MySQL en PHP simple, puedes utilizar esta herramienta de una manera más o menos automática.

Lighttpd:
http://www.lighttpd.net/

Lighttpd es un servidor web rápido y escalable y es conocido por su simplicidad y su bajo consumo de recursos. Usamos lighttp para servir contenido estático desde diferentes
subdominios para incrementar la velocidad de descarga de la página en general. Esta técnica se llama habitualmente “Client optimization” o “Browser optimization”. Usamos 10 subdominios
(por ejemplo: i0.easypromosapp.com, i1.easypromosapp.com, …, i9.easypromosapp.com), servidos todos ellos por la misma instancia de lighttpd. Puedes crear una función de hashing para servir cada fichero estático desde uno de estos subdominios. Un buen ejemplo es el último dígito de la longitud de la URL del fichero: esta se mapea siempre únicamente contra el mismo subdominio.

Por ejemplo:
/css/all.css –> longitud=12 –> i2.easypromosapp.com
/js/jquery.min.js –> longitud=17 –> i7.easypromosapp.com

Esto es muy útil por una razón muy conocida: los browsers modernos lanzan 5 peticiones http concurrentes por cada dominio diferente encontrado en la página (incluyendo subdominios).
Esto significa que la página puede empezar a cargar imágenes, CSS, JavaScripts, etc, concurrentemente y desde diferentes web servers (incluso podrían ser servidos desde diferentes servidores reales si es necesario).

Eaccelerator:
http://eaccelerator.net/

Eaccelerator es un sistema de cache potente que pre-compila el código PHP y guarda una copia en memoria de este código compilado para evitar la tarea repetitiva de recompilarlo cada vez para cada request. Es muy rápido e incluso con los parámetros por defecto puedes ver un incremento de la velocidad de carga de la página a simple vista. Lo mejor de todo es que es transparente para el programador y funciona con la mayoría de frameworks standard.

Simplemente instala la extensión de PHP y verás los cambios tú mismo.

Monit:
http://mmonit.com/monit/

Monit es una herramienta de monitorización sencilla que te permite establecer unas reglas muy simples y enviarte avisos vía email cuando se sobrepasa algún limite de recursos.
Es incluso más potente ya que te permite reiniciar servicios que fallen y ofrece un montón de opciones más, de todas formas nosotros lo usamos simplemente como herramienta de monitorización y alerta.

Con estas herramientas podemos mejorar la escalabilitad y la monitorización de nuestro site con un coste y un esfuerzo mínimos.

 

Enlaces relacionados:

apons

CTO and co-founder of omatech.com and easypromos.com previous work on La Vanguardia Digital and Consultant at Oracle

Fecha de publicación: 08/04/2011