En mis charlas sobre Erlang/OTP siempre hablo de lo bien que se comporta Yaws frente a otros servidores web en lo referente a carga. La cantidad de llamadas entrantes soportadas frente a otros sistemas, pero nunca me había animado a repetir el experimento de Joe Armstrong, ¿probamos un poco?
En principio vamos a necesitar algunas máquinas. No voy a complicarme mucho y voy a usar máquinas de pago por uso de DigitalOcean, si no tienes cuenta puedes crearte una y por $5 al mes puedes tener máquinas simples para lo que necesites. Con este enlace embajador de DigitalOcean puedes acceder y conseguir además un bono de $10 para comenzar.
Para la prueba he creado una máquina para el servidor web de 512MB simple. La instalación que haré será la básica de Debian 8.8 para Nginx, Apache y Yaws. La página que emplearé para descarga la página principal de mi blog (2.0MB aproximadamente).
Para el cliente no me he querido complicar mucho y voy a obtener los datos desde loader.io, así los resultados serán más imparciales y obtendremos mucha más información sobre las pruebas.
Tal y como he dicho antes, he utilizado un droplet de DigitalOcean con las siguientes características:
Gracias a su disco duro en SSD y la virtualización KVM el tiempo de respuesta es muy bueno.
Además instalé collectd para obtener información del uso de la memoria y de la CPU durante el minuto de prueba. No obstante, la memoria no pude obtener datos exactos debida a la corta duración de las pruebas.
La página que ha servidor para realizar las pruebas ha sido este mismo blog. Página HTML estática, ficheros CSS, imágenes PNG Y JPG y ficheros JavaScript.
El sistema de test que elegí permite realizar de forma gratuita tests hacia una misma URL con hasta 10 mil usuarios. Repetí el mismo test 3 veces, una vez por servidor web:
Perfecto, ya lo tenemos todo... vamos con las pruebas.
He utilizado una distribución Debian 8 Jessie actualizada. Instalado Apache 2.4.10 por defecto sin cambiar nada de la configuración.
El resultado se puede ver en la página de loader.io, lo resumo por aquí:
Apache nos deja con la posibilidad de obtener una página del 83.5% en momentos de carga con posibilidad de esperas de hasta 17 segundos.
Al igual que antes, instalé Nginx sin modificaciones en su configuración y me aseguré de tener acceso a la misma página con el mismo contenido. La versión es Nginx 1.6.2.
El resultado de las pruebas las puedes ver en la página de loader.io, lo resumo igualmente:
Nginx tiene incluso más errores en ese minuto que Apache teniendo la probabilidad de obtener una página del 83.1% en momentos de carga con esperas de hasta 33 segundos y una carga superior de la CPU.
Ahora sí, comienza el juego de verdad. Instalo Yaws al igual que los anteriores de paquetería con Erlang 17.3 y Yaws 1.98. En esta ocasión al ejecutar las primeras pruebas me encontré la desagradable experiencia de que la instalación por defecto era muy deficiente así que tuve que hacer un par de ajustes principalmente en la carga de la máquina virtual de Erlang.
El resultado de las pruebas las puedes ver en la página de loader.io, aquí los detalles:
Yaws no tiene ni un solo error, la probabilidad de obtener una respuesta correcta en momentos de carga es del 100% con esperas de hasta 8 segundos y una carga muy pequeña en la CPU.
Me he quedado bastante satisfecho con las pruebas. Demostraban un hecho defendido desde hace años con Erlang, la garantía de obtener respuestas correctas tal y como se espera de sistemas reactivos.
Las pruebas nos dejan con la conclusión de si vas a emplear páginas estáticas o generadas con sistemas como Jekyll, Octopress o Lambdapad y quieres tener tu sistema reactivo dando respuestas correctas Yaws es una opción ineludible.
Obviamente si necesitas de la generación de páginas con otro lenguaje de programación puedes emplear yaws como sistema de entrada. Puedes también emplear Phoenix Framework o esperar por futuras noticias sobre nuestra versión de PHP sobre Erlang que usa precisamente Yaws como servidor web.
¿Qué te ha parecido? ¿Crees que podríamos mejorar las métricas y soporte de Nginx o Apache para ese mismo hardware? ¿Quieres saber más sobre Yaws? ¿Necesitas ayuda con una instalación escalable? ¡Déjanos un comentario!