Apache tiene una herramienta muy útil, Apache Benchmarking (ab), que nos va a servir para conocer un poco mejor como funciona nuestro servidor y que nos va a indicar parámetros tan interesantes como el nivel de carga que puede soportar, el número de usuarios concurrentes (Concurrency Level), el tiempo de respuesta, etc.
- Te puede interesar: Cómo montar un servidor Linux en Linode Akamai.
¿Cómo puedes ejecutar Apache Benchmarking (ab) en servidores con Rocky Linux o Alma Linux?
Tienes que comprobar que tienes instalado el paquete httpd-tools, y si no lo tienes, lo instalas con este comando en tu Rocky Linux:
sudo dnf install httpd-tools
Y el comando para ejecutar ab es el siguiente:
ab -n 100 -c 5 https://ejemplo.com/
Donde estamos indicando que haga el test con 100 conexiones (-n), limitándolo a 5 conexiones concurrentes (-c) en google.com. Es importante que no se os olvide terminar el comando con /
- -n (número): número de solicitudes que ab debe enviar a apache
- -t (tiempo de espera): para especificar (en segundos) cuánto tiempo ab debe continuar enviando solicitudes
- -c (concurrente): para especificar el número de solicitudes simultáneas que ab debe hacer
Resultado que obtenemos al ejecutar Apache Benchmarking (ab)
ab -n 100 -c 5 https://ejemplo.com/
This is ApacheBench, Version 2.3
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking ejemplo.com (be patient).....done
Server Software: gws
Server Hostname: ejemplo.com
Server Port: 443
Document Path: /
Document Length: 219 bytes
Concurrency Level: 5
Time taken for tests: 1.601 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Non-2xx responses: 100
Total transferred: 54000 bytes
HTML transferred: 21900 bytes
Requests per second: 62.46 [#/sec] (mean)
Time per request: 80.046 [ms] (mean)
Time per request: 16.009 [ms] (mean, across all concurrent requests)
Transfer rate: 32.94 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 38 39 0.4 38 39
Processing: 40 41 0.8 41 47
Waiting: 40 41 0.8 41 47
Total: 78 80 1.0 80 85
ERROR: The median and mean for the initial connection time are more than twice the standard
deviation apart. These results are NOT reliable.
Percentage of the requests served within a certain time (ms)
50% 80
66% 80
75% 80
80% 80
90% 81
95% 81
98% 82
99% 85
100% 85 (longest request)
Ten en cuenta, que si estás probando este comando con servidores que no son tuyos y te pasas poniendo conexiones concurrentes, lo más probable es que su firewall lo considere un ataque DDOS y te bloquee la IP. Así que no está recomendado usar esta herramienta con servidores ajenos. Usa esta herramienta en tu red local, en host que tú controles solamente.
¿Cómo interpretamos el test?
- Document Path: Indica el camino del documento que se ha probado. En este caso,
/
representa la raíz del sitio web. - Document Length: El tamaño del documento solicitado, en bytes. Aquí es 219 bytes.
- Concurrency Level: El número de solicitudes concurrentes que se realizaron durante la prueba. En este caso, fueron 5.
- Time taken for tests: El tiempo total que duró la prueba, en segundos. Aquí es 1.601 segundos.
- Complete requests: El número total de solicitudes completadas con éxito. En este caso, 100.
- Failed requests: El número de solicitudes que fallaron. 0, lo que indica que todas las solicitudes se completaron con éxito.
- Write errors: Errores al escribir datos. 0.
- Non-2xx responses: El número de respuestas que no fueron códigos de estado HTTP 2xx (éxito). Aquí, todas las respuestas fueron 100% no 2xx, lo que indica que no todas las respuestas fueron exitosas.
- Total transferred: La cantidad total de datos transferidos en la prueba, en bytes. Aquí, son 54,000 bytes.
- HTML transferred: La cantidad de datos HTML transferidos, en bytes. Es 21,900 bytes.
- Requests per second: La tasa de solicitudes por segundo, en promedio. Es 62.46 solicitudes por segundo.
- Time per request: El tiempo promedio por solicitud. Hay dos valores:
- mean: El promedio de tiempo por solicitud, que es 80.046 ms.
- mean, across all concurrent requests: El promedio de tiempo por solicitud considerando todas las solicitudes concurrentes, que es 16.009 ms.
- Transfer rate: La tasa de transferencia de datos, en kilobytes por segundo. Aquí, es 32.94 KB/sec.
- Connection Times (ms): El desglose de tiempos de conexión en milisegundos:
- Connect: Tiempo para establecer la conexión.
- Processing: Tiempo para procesar la solicitud.
- Waiting: Tiempo de espera hasta recibir la respuesta.
- Total: Tiempo total para completar la solicitud.
Los valores min, mean (promedio), median (mediana), y max (máximo) son proporcionados junto con la desviación estándar.
- ERROR: Este mensaje de error indica que hay una gran variabilidad en los tiempos de conexión inicial. La diferencia entre la mediana y la media para el tiempo de conexión inicial es más del doble de la desviación estándar, lo que sugiere que los resultados podrían no ser fiables debido a la alta variabilidad.
- Percentage of the requests: La mayoría de las solicitudes (más del 80%) se completan en 80 ms, lo que indica que el servidor está respondiendo rápidamente y de manera consistente.
¿Un ejemplo que puedes usar para simular una situación más o menos real de mucha carga en tu servidor (muchas visitas)? Pues por ejemplo:
ab -n 1000 -c 10 -k -H "Accept-Encoding: gzip, deflate" https://ejemplo.com/
Con lo que estamos simulando 10 visitantes al mismo tiempo visitando unas 100 páginas en el periodo del test.
Conclusión
ab de apache es una herramienta muy sencilla que puedes usar para ver si estás optimizando bien apache, MySQL y más programas de tu servidor web. Te recomiendo que actives HTTP/2 en tu servidor y que conectes tus dominios a un CDN como Cloudflare para repartir la carga.
¿Más cosas que puedes instalar en tu servidor? Te recomiendo que uses logwatch para controlar tus logs, instalar RKhunter para comprobar Rootkits, Maldet y ClamAV para malware y virus (para servidores de correo), instalar un Firewall como CSF, un HIDS como OSSEC o mejorar la seguridad de SSH, Apache o MariaDB o los parámetros del Kernel.