¿Conoce el tiempo medio de respuesta de su sitio web? ¿Sabe cuántos usuarios simultáneos puede manejar su sitio?
Las pruebas de carga son esenciales para que las aplicaciones web conozcan la capacidad del sitio web. Si va a elegir el servidor web, una de las primeras cosas que debe hacer es realizar las pruebas de carga y ver cuál le funciona bien.
La evaluación comparativa puede ayudarle a decidir;
- Qué servidor web funciona mejor
- Número de servidores que necesita para servir x número de peticiones
- Qué configuración le ofrece los mejores resultados
- Qué pilas tecnológicas rinden mejor
- Cuándo su sitio funcionará más lento o se estropeará
Existen varias herramientas en línea para realizar una prueba de estrés; sin embargo, si busca una solución interna o desea evaluar únicamente el rendimiento del servidor web, puede utilizar ApacheBench y, alternativamente, alguna de las herramientas que se enumeran a continuación.
He utilizado un servidor web Apache y Nginx alojado en DigitalOcean para realizar la prueba.
ApacheBench
ApacheBench (ab) es un programa de línea de comandos de código abierto que funciona con cualquier servidor web. En este post, explicaré cómo instalar este pequeño programa y realizar la prueba de carga para comparar los resultados.
Apache
Vamos a instalar ApacheBench mediante el comando yum.
yum install httpd-tools
Si ya tiene httpd-tools, puede ignorar esto.
Ahora, veamos cómo se comporta para 5000 peticiones con una concurrencia de 500.
[root@lab ~]# ab -n 5000 -c 500 http://localhost:80/
Esto es ApacheBench, Versión 2.3 <$Revisión: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Con licencia de The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (sea paciente)
Completadas 500 peticiones
Completadas 1000 peticiones
Completadas 1500 peticiones
Completadas 2000 peticiones
Completadas 2500 solicitudes
Acceder a 3000 solicitudes
Completadas 3500 solicitudes
Completadas 4000 solicitudes
Completadas 4500 solicitudes
Completadas 5000 solicitudes
Finalizadas 5000 solicitudes
Software del servidor: Apache/2.2.15
Nombre del servidor: localhost
Puerto del servidor: 80
Ruta del documento: /
Longitud del documento: 4961 bytes
Nivel de concurrencia: 500
Tiempo empleado en las pruebas 13.389 segundos
Peticiones completas: 5000
Peticiones fallidas: 0
Errores de escritura: 0
Respuestas no-2xx 5058
Total transferido 26094222 bytes
HTML transferido: 25092738 bytes
Peticiones por segundo: 373,45 [#/seg] (media)
Tiempo por solicitud: 1338,866 [ <x><x><x>ms</x></x></x> ] (media)
Tiempo por solicitud: 2,678 [ <x><x><x>ms</x></x></x> ] (media, en todas las solicitudes simultáneas)
Velocidad de transferencia: 1903.30 [Kbytes/seg] recibidos
Tiempos de conexión (ms)
min media[ /-sd] mediana max
Conexión 0 42 20.8 41 1000
Procesando 0 428 2116.5 65 13310
Esperando: 0 416 2117.7 55 13303
Total: 51 470 2121,0 102 13378
Porcentaje de solicitudes atendidas en un tiempo determinado (ms)
50% 102
66% 117
75% 130
80% 132
90% 149
95% 255
98% 13377
99% 13378
100% 13378 (solicitud más larga)
[root@lab ~]#
Como puede ver, Apache ha gestionado 373 peticiones por segundo, y ha tardado un total de 13,389 segundos en servir el total de peticiones.
Ahora ya sabe que la configuración por defecto puede servir tantas peticiones, así que cuando haga algún cambio en la configuración puede volver a hacer la prueba para comparar los resultados y elegir el mejor.
Nginx
Hagamos la prueba que hicimos para Apache para que pueda comparar cual rinde mejor.
[root@lab ~]# ab -n 5000 -c 500 http://localhost:80/
Esto es ApacheBench, Versión 2.3 <$Revisión: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Con licencia de The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (sea paciente)
Completadas 500 peticiones
Completadas 1000 peticiones
Completadas 1500 peticiones
Completadas 2000 peticiones
Completadas 2500 solicitudes
Acceder a 3000 solicitudes
Completadas 3500 solicitudes
Completadas 4000 solicitudes
Completadas 4500 solicitudes
Completadas 5000 solicitudes
Finalizado 5000 peticiones
Software del servidor: nginx/1.10.1
Nombre de host del servidor: localhost
Puerto del servidor: 80
Ruta del documento: /
Longitud del documento: 3698 bytes
Nivel de concurrencia: 500
Tiempo empleado en las pruebas 0.758 segundos
Peticiones completas: 5000
Peticiones fallidas: 0
Errores de escritura: 0
Total transferido 19660000 bytes
HTML transferido: 18490000 bytes
Peticiones por segundo: 6593,48 [#/seg] (media)
Tiempo por solicitud: 75,832 [ <x><x><x>ms</x></x></x> ] (media)
Tiempo por solicitud: 0,152 [ <x><x><x>ms</x></x></x> ] (media, en todas las solicitudes simultáneas)
Velocidad de transferencia: 25317,93 [Kbytes/seg] recibidos
Tiempos de conexión (ms)
min media[ /-sd] mediana max
Conexión 0 6 11.0 2 53
Procesando 5 19 8.2 17 53
Esperando 0 18 8.2 16 47
Total: 10 25 17,4 18 79
Porcentaje de solicitudes atendidas en un tiempo determinado (ms)
50% 18
66% 21
75% 21
80% 22
90% 69
95% 73
98% 75
99% 76
00% 79 (solicitud más larga)
[root@lab ~]#
¡WOW!
¿Lo ha visto?
¡Nginx manejó 6593 peticiones por segundo! Un ganador.
Así que ya ve sólo comparando con dos servidores web se hará una idea de cuál elegir para su aplicación web.
La prueba anterior es en CentOS 6.8, 64 bits. Puede probar varias combinaciones de SO y versión de servidor web para obtener resultados óptimos.
¿No le gusta ApacheBench por la razón que sea? No se preocupe, hay muchos otros que puede utilizar para realizar la carga HTTP.
SIEGE
SIEGE es una utilidad de pruebas de carga HTTP compatible con UNIX. Puede poner varias URL en un archivo de texto para realizar pruebas de carga contra ellas. Puede instalar siege usando yum.
# yum install siege
Vamos a ejecutar la prueba con 500 peticiones concurrentes durante 5 segundos.
[root@lab ~]# siege -q -t 5S -c 500 http://localhost/ Levantando el siege del servidor... hecho. Transacciones: 4323 accesos Disponibilidad: 100,00 Tiempo transcurrido 4.60 segundos Datos transferidos: 15.25 MB Tiempo de respuesta: 0,04 s Velocidad de transacción: 939.78 trans/seg Rendimiento: 3,31 MB/seg Concurrencia: 37,97 Transacciones realizadas con éxito: 4323 Transacciones fallidas: 0 Transacción más larga: 1.04 Transacción más corta: 0.00 [root@lab ~]#
Para desglosar los parámetros
-q – para ejecutarlo silenciosamente (sin mostrar los detalles de la solicitud)
-t – ejecutarlo durante 5 segundos
-c – 500 peticiones concurrentes
Como puede ver, la disponibilidad es del 100% y el tiempo de respuesta es de 0,04 segundos. Puede ajustar el parámetro de la prueba de carga en función de su objetivo.
Ali
Ali es una herramienta de pruebas de carga relativamente nueva para realizar análisis en tiempo real. Admite múltiples plataformas para su instalación, incluida Docker.
Una vez instalado, ejecute ali
para ver los detalles de uso.
root@lab:~# ali
no target given
Uso:
ali [flags] <destino URL>
Banderas:
-b, --body cadena El cuerpo de la petición que se enviará.
-B, --body-file cadena La ruta al archivo cuyo contenido se establecerá como cuerpo de la petición http.
--debug Ejecutar en modo depuración.
-d, --duration duration La cantidad de tiempo para emitir peticiones a los objetivos. Dé 0s para un ataque infinito. (por defecto 10s)
-H, --header strings Una cabecera de solicitud a enviar. Puede utilizarse varias veces para enviar varias cabeceras.
-k, --keepalive Utilice conexiones persistentes. (por defecto true)
-M, --max-body int Máx. bytes a capturar de los cuerpos de respuesta. Dé -1 para no tener límite. (por defecto -1)
-m, --method string Un método de petición HTTP para cada petición. (por defecto "GET")
-r, --rate int La tasa de peticiones por segundo a emitir contra los objetivos. Si da 0, enviará las peticiones lo más rápido posible. (por defecto 50)
-t, --timeout duration El tiempo de espera para cada petición. 0s significa desactivar los tiempos de espera. (por defecto 30s)
-v, --version Imprime la versión actual.
Ejemplos:
ali --duration=10m --rate=100 http://host.xz
Autor:
Ryo Nakao <ryo@nakao.dev>
root@lab:~#
Como puede ver arriba, tiene la opción de enviar cabeceras HTTP, duración de la prueba, límite de velocidad, tiempo de espera y más. Hice una prueba rápida en Geekflare Tools y aquí está la salida se parece.
El informe es interactivo y ofrece información detallada sobre la latencia.
Gobench
Gobench está escrito en lenguaje Go y es una sencilla utilidad de pruebas de carga para evaluar el rendimiento del servidor web. Soporta más de 20.000 usuarios concurrentes, cosa que ApacheBench no hace.
Apache JMeter
JMeter es una de las herramientas de código abierto más populares para medir el rendimiento de las aplicaciones web. JMeter es una aplicación basada en java y no sólo un servidor web, pero se puede utilizar contra PHP, Java. ASP.net, SOAP, REST, etc.
JMeter tiene una GUI amigable y decente, y la última versión 3.0 requiere Java 7 o superior para lanzar la aplicación. Debe darle una oportunidad a JMeter si su objetivo es optimizar el rendimiento de la aplicación web.
wrk
wrk es otra herramienta moderna de medición del rendimiento para poner una carga en su servidor web y darle detalles de latencia, petición por segundo, transferencia por segundo, etc.
Con wrk, puede especificar que se ejecute una prueba de carga con un número de hilos.
Tomemos como ejemplo la ejecución de una prueba durante 5 minutos con 500 usuarios concurrentes con 8 hilos.
wrk -t8 -c500 -d300s http://localhost
Cañón automático
Inspirado en el trabajo, autocannon está escrito en Node.js. Puede utilizarlo mediante programación, a través de la API o de una utilidad independiente. Todo lo que necesita es NodeJS instalado como requisito previo.
Puede controlar el número de conexiones, las peticiones, la duración, los trabajadores, el tiempo de espera, la tasa de conexión y ofrece toneladas de opciones para evaluar sus aplicaciones web.
Cargador de curl
curl-loader está escrito en C para simular la carga de aplicaciones y es compatible con SSL/TLS. Junto con la prueba de páginas web, también puede utilizar esta herramienta de código abierto para realizar la carga en servidores FTP.
Puede crear un plan de pruebas con una mezcla de HTTP, HTTPS, FTP y FTPS en una única configuración por lotes.
httperf
Httperf es una herramienta de alto rendimiento que se centra en pruebas comparativas a nivel micro y macro. Es compatible con los protocolos HTTP/1.1 y SSL.
Si tiene el número esperado de usuarios concurrentes y desea comprobar si su servidor web puede servir un número de una solicitud, puede utilizar el siguiente comando.
httperf --servidor localhost --port 80 --num-conns 1000 --rate 100
El comando anterior probará con 100 peticiones por segundo para 1000 peticiones HTTP.
Tsung
Tsung es una herramienta de pruebas de estrés distribuida multiprotocolo para estresar servidores HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL. Soporta HTTP/1.0, HTTP/1.1, y las cookies se manejan automáticamente.
Generar un informe es factible con Tsung.
Conclusión
Espero que las herramientas de evaluación comparativa anteriores le den una idea sobre el rendimiento de su servidor web y decida cuál es la mejor para su proyecto.
A continuación, no olvide supervisar el rendimiento de su sitio web.