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.
El Servidor
Tal y como he dicho antes, he utilizado un droplet de DigitalOcean con las siguientes características:
- Intel Xeon CPU E5-2630L v2 @ 2.40GHz (1 CPU/Core)
- 1GB RAM
- 30GB SSD Disk
- Localizado en Amsterdam
- Precio $10/mes
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 web
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.
Loader.io
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:
- Tipo de test: Mantener carga de clientes
- Clientes desde 1.000 a 10.000
- Duración 1 minuto (limitada por la cuenta gratuita)
- Umbral de errores a 90% (si pasa este umbral la prueba se detiene)
- Consideramos timeout con 10 segundos
Perfecto, ya lo tenemos todo... vamos con las pruebas.
Apache
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í:
- Uso de CPU (según collectd): 1.9
- Tiempo medio de respuesta: 1897ms
- Tiempo máximo de respuesta: 17s
- Tiempo mínimo de respuesta: 157ms
- Porcentaje de errores: 16.5%
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.
Nginx
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:
- Uso de CPU (según collectd): 2.5
- Tiempo medio de respuesta: 1093ms
- Tiempo máximo de respuesta: 33s
- Tiempo mínimo de respuesta: 79ms
- Porcentaje de errores: 16.9%
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.
Yaws
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:
- Uso de CPU (según collectd): 0.7
- Tiempo medio de respuesta: 4247ms
- Tiempo máximo de respuesta: 8239ms
- Tiempo mínimo de respuesta: 238ms
- Porcentaje de errores: 0%
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.
Conclusiones
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!