Tester votre serveur web avec Apache Benchmark

Il est souvent intéressant de savoir comment un serveur web se comporte face à un nombre important de connexion afin d'être sûr que votre serveur ne rendra pas l'âme si vous faites soudain face à un afflux de visiteurs.

Pour ce faire, il existe énormément d'outils différents pour faire des benchmarks de serveurs web. Certains sont très complexes et permettent de gérer différents scénarios avec une liste de requêtes à faire avec des paramètres. Ces outils tels JMeter, bien que très puissant ont l'inconvénient d'être long à configuré ce qui n'est pas toujours utile quand on veux juste tester la puissance brut d'une page (notamment si la page est censée faire un traitement lourd, il y aura alors moyen de rechercher des pistes d'améliorations).

Présentation de Apache Benchmark

C'est ici qu'Apache Benchmark entre en scène. Un programme simple, qui fait des choses simples et qui le fait bien. Il permet tout simplement de bombardé une URL de requête HTTP avec différents paramètres choisient par l'utilisateur et d'avoir un retour avec notamment des stats sur :

  • Le nombre de requêtes exécutés à la seconde
  • Le temps médian de réponse à une requête
  • Le temps maximum de réponse à la requête

Les informations concernant le nombre de requêtes exécuté à la seconde ainsi que le temps médian de réponse est important puisqu'on considère généralement une application comme "performante" tant qu'elle réponds à 10 requêtes par seconde, mais cela dépends bien entendu du nombre de requêtes exécutés en parallèle (qui est aussi définissable dans Apache Benchmark clin.png ).

Comme son nom l'indique, Apache Benchmark est développé par la fondation Apache et fait partie des apaches-utils, il était à la base développé pour tester les performances du serveur HTTP Apache, mais il est compatible avec la totalité des serveurs web HTTP et peut donc fonctionner sans problème avec nginx ou lighttpd smile.png.

Installation d'Apache Benchmark

L'installation d'Apache Benchmark se fait via les dépôts sur la plupart des distributions linux. Voilà la commande pour quelques systèmes différents :

Debian/Ubuntu
apt-get install apache2-utils 

 

Fedora/Redhat
yum install httpd-tools

 Sous Mac OS X, Apache Benchmark est installé par défaut et est accessible de base via le terminal.

Utilisation d'Apache Benchmark

L'utilisation d'Apache Benchmark se fait entièrement via la ligne de commande avec l'utilitaire ab. Le seul paramètre obligatoire est l'URL de la page à tester. Par exemple pour tester http://www.monsite.com, on utilisera la commande suivante :

ab http://www.monsite.com/

Avec cette commande, Apache Benchmark simulera une seule requête sur l'adresse passée en paramètre et retournera un certain nombre d'information :

Server Software:        nginx/1.2.1
Server Hostname:        www.monsite.com
Server Port:            80

Document Path:          /
Document Length:        13781 bytes

Concurrency Level:      1
Time taken for tests:   0.153 seconds
Complete requests:      1
Failed requests:        0
Total transferred:      14171 bytes
HTML transferred:       13781 bytes
Requests per second:    6.54 [#/sec] (mean)
Time per request:       152.984 [ms] (mean)
Time per request:       152.984 [ms] (mean, across all concurrent requests)
Transfer rate:          90.46 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       21   21   0.0     21      21
Processing:   132  132   0.0    132     132
Waiting:      131  131   0.0    131     131
Total:        153  153   0.0    153     153

On voit ici qu'on a fait une requête sur un serveur nginx qui a mis 152ms pour répondre, ce qui fait environ 6,5 requêtes par seconde.

Plusieurs requêtes

Le problème de ces résultats c'est que l'échantillon de test est trop petit (comme pour les statistiques). Pour avoir une moyenne acceptable, il va falloir augmenter le nombre de requête. On peut commencer par en faire 100 par exemple. Pour cela, on ajoute un argument -n à la commande suivi du nombre de requête désiré :

ab -n 100 http://www.monsite.com/

On obtient alors des indicateurs beaucoup plus fiable puisqu'en général une moyenne ou une médiane de la totalité des tests. Les résultats sont donc plus fiables à mesure que le nombre de connexion total augmente et donc la taille de l'échantillon de test.

Connexion simultanée

Mais la mesure la plus intéressante est celle du nombre de connexion simultannée: A partir de combien de connexion parallèle, le site internet devient tellement lent que le plaisir de surf est fortement réduit. Il est possible de simuler les connexions parallèles avec Apache Benchmark et son option -c. Par exemple, pour simuler 25 connexions simultannées, il faudra utiliser la commande suivante :

ab -n 1000 -c 25 http://www.monsite.com/

Vous remarquerez que j'ai augmenté le nombre de requête total afin de garder des chiffres fiables malgré l'augmentation des connexions simultanées. En général il faut garder une certaine proportionnalité entre le nombre de requêtes simultanées et le nombre total.

Simuler une authentification ou un Cookie

Certaines pages ne sont parfois accessibles que via une authentification que ce soit via une session (en php ou Java par exemple) ou via une authentification HTTP. Il est bien sûr possible de simuler ces deux cas avec Apache Benchmark puisqu'il est possible d'ajouter des en-têtes HTTP et des cookies à la requête qui sera exécutée.

Si vous utilisez votre propre système d'authentification généralement via une session, il faut transmettre votre cookie PHPSESSID à la page. Pour récupérer votre PHPSESSID, vous pouvez passer via les outils développeur de votre navigateur. Par exemple sous Firefox, vous pouvez passer par l'outil réseau dans Outils > Développement Web > Réseau. Vous pouvez alors récupérer la valeur de votre PHPSESSID via l'onglet cookies d'une requête.

Pour envoyer votre cookie avec la requête, il faut utiliser la commande -C :

ab -n 100 -C "PHPSESSID=g54h93sg35ejlnfzeam2874kn2" http://www.monsite.com/

Dans le cadre d'une authentification HTTP, il faut utiliser l'en tête Authorization qui est généralement sous la forme suivante :

Authorization: Basic BASE_64_DE_CONNEXION

La chaine BASE_64_DE_CONNEXION est l'encode base 64 de la chaine du type: username:password. Pour s'authentifier avec le nom d'utilisateur et le mot de passe moi, on utilisera donc la commande suivante :

ab -n 10000 -c 200 -H "Authorization: Basic bW9pOm1vaQ==" http://www.monsite.com/

L'instruction -H permet d'ajouter des en-têtes HTTP, il est bien sûr possible de définir d'autre en tête que Authorization clin.png.

L'auteur

Toshy

Passionné par l'informatique depuis mon plus jeune age, j'anime un blog sur le développement web et les différents domaines qui s'y attachent : administration système, bonne pratique de développement, framework web.
Je suis développeur web de profession, diplômé d'un DUT d'informatique, je travaille actuellement au sein du service informatique d'une université.