¿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 da 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 realizar una evaluación comparativa sólo del rendimiento del servidor web, puede utilizar ApacheBench y, alternativamente, algunas 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, entonces 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 peticiones
Completadas 3000 peticiones
Completadas 3500 peticiones
Completadas 4000 peticiones
Completadas 4500 peticiones
Completadas 5000 peticiones
Completadas 5000 peticiones
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 completadas: 5000
Peticiones fallidas: 0
Errores de escritura: 0
Respuestas no-2xx: 5058
Total transferido 26094222 bytes
HTML transferido: 25092738 bytes
Solicitudes 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, entre todas las solicitudes simultáneas)
Velocidad de transferencia: 1903.30 [Kbytes/seg] recibidos
Tiempos de conexión (ms)
mín media[ /-sd] mediana máx
Conectar: 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 las peticiones servidas en un tiempo determinado (ms)
50% 102
66% 117
75% 130
80% 132
90% 149
95% 255
98% 13377
99% 13378
100% 13378 (petición 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 igual que hicimos con Apache para que pueda comparar cuál 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 peticiones
Completadas 3000 peticiones
Completadas 3500 peticiones
Completadas 4000 peticiones
Completadas 4500 peticiones
Completadas 5000 peticiones
Completadas 5000 peticiones
Software del servidor: nginx/1.10.1
Nombre del 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 completadas: 5000
Peticiones fallidas: 0
Errores de escritura: 0
Total transferido: 19660000 bytes
HTML transferido: 18490000 bytes
Solicitudes 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, entre todas las solicitudes simultáneas)
Velocidad de transferencia: 25317,93 [Kbytes/seg] recibidos
Tiempos de conexión (ms)
min media[ /-sd] mediana máx
Conectar: 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 las solicitudes servidas 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 solo comparando con dos servidores web se hará una idea de cual 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 prueba 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 Tasa de transacciones: 939.78 trans/seg Rendimiento: 3,31 MB/seg Capacidad de concurrencia: 37,97 Transacciones 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 – ejecutar 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 instalada, ejecute ali
para ver los detalles de uso
root@lab:~# ali
no target given
Uso:
ali [flags] <target URL>
Flags:
-b, --body string El cuerpo de la petición que se enviará.
-B, --body-file string La ruta al archivo cuyo contenido se establecerá como cuerpo de la petición http.
--debug Ejecutar en modo de 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 petición 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 este es el aspecto de la salida
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, peticiones por segundo, transferencia por segundo, etc
Con wrk, puede especificar ejecutar 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 la aplicación 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 usted tiene el número esperado de usuarios concurrentes y busca probar 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.