Avertissement : Utilisez apachebench uniquement dans un but de benchmark sur des environnements de test prévu pour cela. Ne vous amusez pas à utiliser apachebench sur des serveurs qui ne sont pas les vôtres ou sur vos propres serveurs de productions
Apachebench est un outil permettant de benchmarker son serveur http en simulant du trafic par un nombre important de requêtes http.
J'utilise souvent apachebench pour effectuer des simulations de charge sur mon serveur de test dans le but de tester des outils php ou encore pour vérifier que les modifications du code de mon cms améliorent réellement les performances et non l'inverse.
Installation d'apachebench (aka ab) sur les distributions basées sur debian (Ubuntu ...) :
pcr@home:$ sudo aptitude install apache2-utils
Simulation de requêtes http sans compression gzip :
root@home:~# ab -n 10000 -c 30 http://monserveurdetest/mapagedetest.php
Simulation de requêtes http avec compression gzip :
root@home:~# ab -n 1000 -c 30 -H "Accept-Encoding: gzip" http://monserveurdetest/mapagedetest.php
A noter que l'utilisation de apachebench est souvent limitées aux utilisateurs du groupe admin (ou root) afin d'interdire à l'utilisateur lambda de surcharger les serveurs.
Explications des options de ab :
-n Nombre total de requêtes envoyées
-c Nombre de requêtes envoyées en parallèle
-H permet de modifier les entêtes http ce qui permet par exemple d'indiquer au serveur http que apachebench supporte la compression gz.
J'utilise pour des tests rapides les paramètres suivant :
-n 1000 -c 20
Pour des tests lourds :
-n 5000 -c 50
Enfin pour avoir des tests vraiment significatifs :
-n 50000 -c 30
En augmentant massivement le nombre de requêtes on obtient une moyenne du nombre de requêtes par seconde beaucoup plus significative.
A noter qu'utiliser une concurrence trop grande (personellement je trouve que 50 c'est déjà énorme) peut rendre votre test invalide car le serveur http peut passer en mode too many connections at this time.
Sortie de la commande :
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 monserveurdetest (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: lighttpd
Server Hostname: monserveurdetest
Server Port: 80
Document Path: /mapagedetest.php
Document Length: 9693 bytes
Concurrency Level: 30
Time taken for tests: 0.603 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 9963000 bytes
HTML transferred: 9693000 bytes
Requests per second: 1658.19 [#/sec] (mean)
Time per request: 18.092 [ms] (mean)
Time per request: 0.603 [ms] (mean, across all concurrent requests)
Transfer rate: 16133.33 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 3.8 0 17
Processing: 1 16 5.2 17 51
Waiting: 0 15 5.6 16 51
Total: 2 18 4.6 18 51
Percentage of the requests served within a certain time (ms)
50% 18
66% 19
75% 19
80% 20
90% 22
95% 25
98% 30
99% 35
100% 51 (longest request)
Les données qui me semble importantes à vérifier sont :
Complete requests qui indique le nombre de requêtes effectuées.
Failed requests qui doit être égale à 0 si ce n'est pas le cas essayer de baisser le nombre de requêtes parallèles (-c de la ligne de commande).
HTML transferred pour vérifier que la compression gz marche bien, ce nombre doit être plus petit quand la compression gz est active.
Requests per second qui est la moyenne du nombre de requêtes par seconde que votre serveur peut balancer dans les conditions du test.
Transfer rate indique le débit du réseau en ko par seconde.
Pour effectuer des tests de performances j'utilise souvent apachebench en local (cad que je lance la commande ab sur la même machine que le serveur http) pour éviter les latences dues au trafic réseau. Donc non je n'ai pas un réseau qui supporte un trafic de 15Mo/seconde c'est juste le débit de mon disque dur ;).
Image : jpctalbot