Noticia Apache Benchmark + GNUPlot: Medir y graficar el rendimiento de tu servidor web

Da igual si se usa Nginx, Apache, Lighttpd u otro, cualquier administrador de red que tenga un servidor web deseará en algún punto saber qué tan rápido responde el servidor web a un número determinado de consultas.



Apache Benchmark + GNUPlot


En esta ocasión usaremos una herramienta llamada Apache Benchmark, que aunque tiene ‘apache’ en su nombre, NO sirve solo para medir el rendimiento de Apache, sino también se puede usar para Nginx y otros. En realidad, yo lo usaré para medir el rendimiento de Nginx.

Usaremos además GNUPlot, que nos servirá para hacer gráficas como estas con unas pocas líneas:



Instalando Apache Benchmark y GNUPlot


Apache Benchmark es una herramienta que podremos usar después de instalar el paquete de Apache, GNUPlot estará disponible luego de instalar el paquete de igual nombre. Por lo que entonces…

En distros como Debian, Ubuntu o similares:

sudo apt-get install apache2 gnuplot

En distros como ArchLinux o derivadas:

sudo pacman -S apache gnuplot

Solo necesitamos instalar el paquete de Apache, no necesitamos iniciarlo ni configurar algo más, con instalarlo bastará.
Usando Apache Benchmark


Lo que haremos será enviar un número determinado de peticiones (100) en grupos de varias (de 20 en 20) a un sitio determinado. El resultado lo guardaremos en un archivo .csv (resultado.csv) para luego procesarlo con GNUPloit, la línea sería:

ab -g resultados.csv -n 100 -c 20 http://nuestro-sitio-web.com/

Es muy importante poner el / final en la URL del sitio a medir.

Este es el output o log que me muestra cuando hago la prueba a un sitio en mi red:

This is ApacheBench, Version 2.3 <$Revision: 1638069 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking gutl.jovenclub.cu (be patient).....done

Server Software: nginx
Server Hostname: gutl.jovenclub.cu
Server Port: 80

Document Path: /

Document Length: 206 bytes

Concurrency Level: 20
Time taken for tests: 0.101 seconds
Complete requests: 100
Failed requests: 27
(Connect: 0, Receive: 0, Length: 27, Exceptions: 0)
Non-2xx responses: 73
Total transferred: 1310933 bytes
HTML transferred: 1288952 bytes
Requests per second: 993.24 [#/sec] (mean)
Time per request: 20.136 [ms] (mean)
Time per request: 1.007 [ms] (mean, across all concurrent requests)
Transfer rate: 12715.49 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 0.2 1 1
Processing: 1 17 24.8 4 86
Waiting: 1 15 21.5 4 76
Total: 1 18 24.8 5 87

Percentage of the requests served within a certain time (ms)
50% 5
66% 6
75% 22
80% 41
90% 62
95% 80
98% 87
99% 87
100% 87 (longest request)

Les he marcado en rojo lo que considero yo, es lo más importante, que viene siendo más o menos:

  1. Datos del servidor que estamos probando, así como la URL en cuestión.
  2. Cantidad de peticiones por segundo.
  3. Cuantos milisegundos demoró el servidor en atender la petición que más demoró, o sea, la que más tardó en ser atendida.

Con esta información pueden tener una idea de cuánto demorará el servidor en atender esa cantidad de solicitudes, pueden luego agregar un mejor sistema de caché, desactivar módulos que no usen, etc etc, volver a ejecutar la prueba y ver si el rendimiento mejoró o no.

Les recomiendo correr la prueba 2 o 3 veces, para que creen algo así como un margen, pues rara vez los resultados de dos pruebas seguidas son idénticos.
Mostrar en un gráfico el resultado:


Para poner en una imagen este output, o sea, en un medio más visual y que muchas veces, es todo lo que los directivos logran entender … para ello usaremos como ya dije antes, GNUPlot

En la misma carpeta donde tenemos el archivo resultados.csv (que recuerdan, acabamos de generar con el comando anterior) vamos a crear un archivo llamado gnuplot.p:

nano plot.p

En él pondremos lo siguiente:

set terminal png size 600
set output "resultados.png"
set title "100 peticiones, 20 peticiones concurrentes"
set size ratio 0.6
set grid y
set xlabel "peticiones"
set ylabel "tiempo de respuesta (ms)"
plot "resultados.csv" using 9 smooth sbezier with lines title "gutl.jovenclub.cu"

Les he señalado en rojo lo que deberían revisar siempre. O sea y de arriba hacia abajo:

  1. Nombre del archivo de imagen que se generará
  2. Cantidad de peticiones totales y concurrentes.
  3. Nombre del archivo que recién acabamos de generar.
  4. Dominio sobre el que trabajamos.

Una vez ponemos eso, guardamos y salimos (Ctrl + O y luego Ctrl + X), ejecutaremos lo siguiente:

gnuplot plot.p

Y listo, eso nos generará el gráfico con el nombre deseado, el mío es:

Fin!


Apache Benchmark tiene un montón más de opciones, por ejemplo -C para usar una cookie, -f para que en vez de probar solo el index del sitio, pruebe varias URLs que tengamos en un archivo de texto plano, son muchas combinaciones también que podemos usar para que nuestra prueba de rendimiento sea aún más completa.

Pero bueno, esto ha sido lo básico ;)

Enjoy!


N-eURI5jGFE


Continúar leyendo...