¿Cómo realizar la evaluación comparativa de rendimiento del servidor web?

¿Conoces el tiempo medio de respuesta de tu 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 la prueba de carga y ver cuál funciona bien para usted.

La evaluación comparativa puede ayudarlo a decidir;

  • ¿Qué servidor web funciona mejor?
  • Número de servidores que necesita para atender x número de solicitudes
  • Qué configuración te da los mejores resultados
  • Qué pilas tecnológicas funcionan mejor
  • Cuándo su sitio funcionará más lento o colapsará

Existen varias herramientas en línea para realizar una prueba de estrés; sin embargo, si está buscando una solución interna o desea comparar solo el rendimiento del servidor web, puede usar ApacheBench y, alternativamente, algunas de las herramientas enumeradas a continuación.

He usado el servidor web Apache y Nginx alojado en océano digital para probarlo

ApacheBanco

ApacheBanco (ab) es un programa de línea de comandos de código abierto que funciona con cualquier servidor web. En esta publicación, explicaré cómo instalar este pequeño programa y realizar la prueba de carga para comparar los resultados.

apache

Instalemos ApacheBench usando un comando yum.

yum install httpd-tools

Si ya tiene herramientas httpd, puede ignorar esto.

Ahora, veamos cómo funciona para 5000 solicitudes con una simultaneidad de 500.

[[email protected] ~]# ab -n 5000 -c 500 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software:        Apache/2.2.15
Server Hostname:        localhost
Server Port:            80
Document Path:          /
Document Length:        4961 bytes
Concurrency Level:      500
Time taken for tests:   13.389 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Non-2xx responses:      5058
Total transferred:      26094222 bytes
HTML transferred:       25092738 bytes
Requests per second:    373.45 [#/sec] (mean)
Time per request:       1338.866 [ms] (mean)
Time per request:       2.678 [ms] (mean, across all concurrent requests)
Transfer rate:          1903.30 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0   42  20.8     41    1000
Processing:     0  428 2116.5     65   13310
Waiting:        0  416 2117.7     55   13303
Total:         51  470 2121.0    102   13378
Percentage of the requests served within a certain time (ms)
50%    102
66%    117
75%    130
80%    132
90%    149
95%    255
98%  13377
99%  13378
100%  13378 (longest request)
[[email protected] ~]#

Entonces, como puede ver, Apache ha manejado 373 solicitudes por segundo y tomó un total de 13.389 segundos para atender el total de solicitudes.

Ahora que sabe que la configuración predeterminada puede atender muchas de estas solicitudes, de modo que cuando realice cambios en la configuración, puede volver a realizar la prueba para comparar los resultados y elegir la mejor.

Nginx

Hagamos la prueba de lo que hicimos para Apache para que pueda comparar cuál funciona mejor.

[[email protected] ~]# ab -n 5000 -c 500 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software:        nginx/1.10.1
Server Hostname:        localhost
Server Port:            80
Document Path:          /
Document Length:        3698 bytes
Concurrency Level:      500
Time taken for tests:   0.758 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      19660000 bytes
HTML transferred:       18490000 bytes
Requests per second:    6593.48 [#/sec] (mean)
Time per request:       75.832 [ms] (mean)
Time per request:       0.152 [ms] (mean, across all concurrent requests)
Transfer rate:          25317.93 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    6  11.0      2      53
Processing:     5   19   8.2     17      53
Waiting:        0   18   8.2     16      47
Total:         10   25  17.4     18      79
Percentage of the requests served within a certain time (ms)
50%     18
66%     21
75%     21
80%     22
90%     69
95%     73
98%     75
99%     76
00%     79 (longest request)
[[email protected] ~]#

¡GUAU!

¿Viste eso?

¡Nginx manejó 6593 solicitudes por segundo! Un ganador.

Entonces, solo comparando con dos servidores web, tendrá una idea de cuál elegir para su aplicación web.

La prueba anterior es en CentOS 6.8, 64 bit. Puede probar varias combinaciones de versiones del sistema operativo y del servidor web para obtener resultados óptimos.

¿No te gusta ApacheBench por alguna razón? No se preocupe, hay muchos otros que puede usar para realizar la carga HTTP.

CERCO

CERCO es una utilidad de prueba de carga HTTP compatible con UNIX. Puede poner varias URL en un archivo de texto para cargar pruebas. Puedes instalar asedio usando yum.

# yum install siege

Ejecutemos la prueba con 500 solicitudes simultáneas durante 5 segundos.

[[email protected] ~]# siege -q -t 5S -c 500 http://localhost/
Lifting the server siege...      done.
Transactions:                       4323 hits
Availability:               100.00 %
Elapsed time:                       4.60 secs
Data transferred:        15.25 MB
Response time:                    0.04 secs
Transaction rate:       939.78 trans/sec
Throughput:                         3.31 MB/sec
Concurrency:                      37.97
Successful transactions:        4323
Failed transactions:                0
Longest transaction:            1.04
Shortest transaction:            0.00
[[email protected] ~]#

Para desglosar los parámetros.

-q: para ejecutarlo en silencio (sin mostrar los detalles de la solicitud)

-t – ejecutar durante 5 segundos

-c – 500 solicitudes simultáneas

Entonces, como puede ver, la disponibilidad es del 100% y el tiempo de respuesta es de 0,04 segundos. Puede modificar el parámetro de prueba de carga según su objetivo.

Ali

Ali es una herramienta de prueba de carga relativamente nueva para realizar análisis en tiempo real. Admite múltiples plataformas para instalar, incluido Docker.

Una vez instalado, ejecute ali para ver los detalles de uso.

[email protected]:~# ali
no target given
Usage:
  ali [flags] <target URL>

Flags:
  -b, --body string         A request body to be sent.
  -B, --body-file string    The path to file whose content will be set as the http request body.
      --debug               Run in debug mode.
  -d, --duration duration   The amount of time to issue requests to the targets. Give 0s for an infinite attack. (default 10s)
  -H, --header strings      A request header to be sent. Can be used multiple times to send multiple headers.
  -k, --keepalive           Use persistent connections. (default true)
  -M, --max-body int        Max bytes to capture from response bodies. Give -1 for no limit. (default -1)
  -m, --method string       An HTTP request method for each request. (default "GET")
  -r, --rate int            The request rate per second to issue against the targets. Give 0 then it will send requests as fast as possible. (default 50)
  -t, --timeout duration    The timeout for each request. 0s means to disable timeouts. (default 30s)
  -v, --version             Print the current version.

Examples:
  ali --duration=10m --rate=100 http://host.xz

Author:
  Ryo Nakao <[email protected]>
[email protected]:~#

Como puede ver arriba, tiene la opción de enviar encabezados HTTP, duración de la prueba, límite de velocidad, tiempo de espera y más. Hice una prueba rápida en las herramientas kirukiru.es y aquí está el resultado.

El informe es interactivo y brinda información detallada sobre la latencia.

Gobanco

Gobanco está escrito en lenguaje Go y una utilidad de prueba de carga simple para comparar el rendimiento del servidor web. Admite más de 20,000 usuarios simultáneos que ApacheBench no admite.

Apache JMeter

Jmetro 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 solo un servidor web, sino que también puede usarlo contra PHP, Java. ASP.net, SOAP, RESTO, etc.

JMeter obtuvo una GUI amigable decente, y la última versión 3.0 requiere Java 7 o superior para iniciar la aplicación. Debe probar JMeter si su objetivo es optimizar el rendimiento de la aplicación web.

trabajar

trabajar es otra herramienta moderna de medición del rendimiento para cargar su servidor web y brindarle detalles de latencia, solicitud por segundo, transferencia por segundo, etc.

Con wrk, puede especificar ejecutar una prueba de carga con varios subprocesos.

Tomemos un ejemplo de ejecutar una prueba durante 5 minutos con 500 usuarios simultáneos con 8 subprocesos.

wrk –t8 –c500 -d300s http://localhost

Cañón automático

Inspirado por el trabajo, cañón automático está escrito en Node.js. Puede usarlo mediante programación, a través de API o una utilidad independiente. Todo lo que necesita es NodeJS instalado como requisito previo.

Puede controlar una cantidad de conexiones, solicitudes, duración, trabajadores, tiempo de espera, tasa de conexión y ofrecer toneladas de opciones para comparar sus aplicaciones web.

cargador de rizos

cargador de rizos está escrito en C para simular la carga de la aplicación y es compatible con SSL/TLS. Junto con la prueba de la página web, también puede usar esta herramienta de código abierto para realizar cargas en servidores FTP.

Puede crear un plan de prueba con una combinación de HTTP, HTTPS, FTP y FTPS en una configuración de lote único.

httperf

los httperf es una herramienta de alto rendimiento que se enfoca en puntos de referencia de nivel micro y macro. Es compatible con los protocolos HTTP/1.1 y SSL.

Si tiene la cantidad esperada de usuarios simultáneos y busca probar si su servidor web puede atender una cantidad de solicitudes, puede usar el siguiente comando.

httperf --server localhost --port 80 --num-conns 1000 --rate 100

El comando anterior probará con 100 solicitudes por segundo para 1000 solicitudes HTTP.

Tsung

Tsung es una herramienta de prueba de estrés distribuida multiprotocolo para estresar servidores HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL. Es compatible con HTTP/1.0, HTTP/1.1 y las cookies se gestionan 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 decidan qué funciona mejor para su proyecto.

A continuación, no olvide controlar el rendimiento de su sitio web.