Avez-vous une idée du temps de réponse moyen de votre site internet ? Savez-vous combien d’utilisateurs simultanés votre plateforme peut accueillir ?
Les tests de charge sont cruciaux pour évaluer la capacité d’une application web. Avant de choisir un serveur web, il est impératif de réaliser un test de charge afin de déterminer lequel convient le mieux à vos besoins.
Une analyse comparative vous aidera à prendre une décision éclairée concernant :
- Le serveur web le plus performant
- Le nombre de serveurs nécessaires pour gérer un volume donné de requêtes
- La configuration qui offre les meilleurs résultats
- Les technologies qui fonctionnent le mieux ensemble
- Le moment où votre site risque de ralentir ou de tomber en panne
De nombreux outils en ligne permettent d’effectuer des tests de charge. Toutefois, si vous recherchez une solution interne ou si vous souhaitez évaluer les performances de votre serveur web, vous pouvez utiliser ApacheBench ou l’un des outils que je vais présenter.
Pour les besoins de ce test, j’ai utilisé un serveur web Apache et Nginx hébergé sur DigitalOcean.
ApacheBench
ApacheBench (ab) est un programme en ligne de commande open source compatible avec tous les serveurs web. Dans cet article, je vais vous montrer comment installer cet outil et réaliser un test de charge afin de comparer les résultats.
Installation d’ApacheBench
Nous allons installer ApacheBench à l’aide de la commande yum.
yum install httpd-tools
Si vous avez déjà installé httpd-tools, vous pouvez ignorer cette étape.
Voyons maintenant comment il se comporte pour 5000 requêtes avec une simultanéité 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] ~]#
Comme vous pouvez le constater, Apache a traité 373 requêtes par seconde et il a fallu 13,389 secondes pour traiter l’ensemble des requêtes.
Vous savez maintenant que la configuration par défaut peut répondre à cette charge. Lors de modifications de configuration, vous pouvez refaire le test pour comparer les résultats et choisir la meilleure option.
Test de Nginx
Réalisons le même test que nous avons fait pour Apache afin de comparer les performances.
[[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] ~]#
Incroyable !
Avez-vous vu ça ?
Nginx a traité 6593 requêtes par seconde ! C’est le grand gagnant.
Ce test comparatif avec deux serveurs web vous donne une idée du serveur le plus adapté à votre application web.
Ce test a été réalisé sur un environnement CentOS 6.8 64 bits. N’hésitez pas à essayer plusieurs combinaisons de systèmes d’exploitation et de serveurs web pour des résultats optimaux.
ApacheBench ne vous convient pas ? Pas de problème, il existe de nombreux autres outils pour effectuer des tests de charge HTTP.
SIEGE
SIEGE est un outil de test de charge HTTP disponible sur UNIX. Il permet de spécifier plusieurs URL dans un fichier texte pour réaliser des tests de charge. L’installation de Siege se fait avec la commande yum.
# yum install siege
Réalisons un test avec 500 requêtes simultanées pendant 5 secondes.
[[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] ~]#
Voici une explication des paramètres :
-q – exécute le test en mode silencieux (sans afficher les détails de la requête)
-t – exécute le test pendant 5 secondes
-c – 500 requêtes simultanées
Comme vous pouvez le voir, la disponibilité est de 100 % et le temps de réponse est de 0,04 seconde. Vous pouvez ajuster les paramètres de test en fonction de vos objectifs.
Ali
Ali est un outil de test de charge relativement récent qui permet une analyse en temps réel. Il est compatible avec de nombreuses plateformes, y compris Docker.
Une fois installé, exécutez ali pour consulter les détails d’utilisation.
[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]:~#
Comme vous pouvez le voir, vous pouvez envoyer des en-têtes HTTP, définir la durée du test, la limite de débit, le délai d’expiration, etc. J’ai effectué un test rapide sur toptips.fr Tools et voici le résultat.
Le rapport est interactif et fournit des informations détaillées sur la latence.
Gobench
Gobench est un outil de test de charge simple écrit en Go, conçu pour évaluer les performances d’un serveur web. Contrairement à ApacheBench, il peut gérer plus de 20 000 utilisateurs simultanés.
Apache JMeter
JMeter est l’un des outils open source les plus populaires pour mesurer les performances des applications web. Il s’agit d’une application basée sur Java qui peut être utilisée non seulement pour les serveurs web, mais aussi pour PHP, Java, ASP.net, SOAP, REST, etc.
JMeter dispose d’une interface graphique conviviale. La version 3.0 et les versions suivantes nécessitent Java 7 ou une version ultérieure pour lancer l’application. Si vous souhaitez optimiser les performances de votre application web, vous devriez essayer JMeter.
wrk
wrk est un autre outil moderne de mesure de performance qui permet de mettre à l’épreuve votre serveur web et d’obtenir des détails sur la latence, le nombre de requêtes par seconde, le débit, etc.
Avec wrk, vous pouvez spécifier le nombre de threads pour exécuter un test de charge.
Prenons l’exemple d’un test effectué pendant 5 minutes avec 500 utilisateurs simultanés et 8 threads.
wrk –t8 –c500 -d300s http://localhost
Autocannon
Inspiré par wrk, autocannon est écrit en Node.js. Vous pouvez l’utiliser de manière programmatique, via une API, ou comme un utilitaire autonome. Le seul prérequis est NodeJS.
Vous pouvez contrôler un grand nombre de paramètres tels que le nombre de connexions, le nombre de requêtes, la durée, le nombre de workers, le délai d’expiration, le taux de connexion. Il offre de nombreuses options pour comparer vos applications web.
Curl-loader
Curl-loader, écrit en C, permet de simuler la charge d’une application. Il prend en charge SSL/TLS et peut être utilisé pour effectuer des tests de charge sur les serveurs FTP en plus des pages web.
Vous pouvez créer un plan de test combinant HTTP, HTTPS, FTP et FTPS dans une seule configuration.
httperf
httperf est un outil performant qui permet d’effectuer des benchmarks aux niveaux micro et macro. Il prend en charge les protocoles HTTP/1.1 et SSL.
Si vous avez une idée du nombre d’utilisateurs simultanés attendus et que vous souhaitez tester la capacité de votre serveur à gérer un certain volume de requêtes, vous pouvez utiliser la commande suivante :
httperf --server localhost --port 80 --num-conns 1000 --rate 100
La commande ci-dessus effectuera un test de 1 000 requêtes HTTP à une fréquence de 100 requêtes par seconde.
Tsung
Tsung est un outil de test de charge multi-protocoles distribué qui permet de mettre à l’épreuve les serveurs HTTP, SOAP, PostgreSQL, LDAP, XAMP, MySQL. Il prend en charge HTTP/1.0, HTTP/1.1 et gère automatiquement les cookies.
Tsung permet également de générer des rapports.
Conclusion
J’espère que les outils de test comparatif présentés ci-dessus vous donneront une idée des performances de votre serveur web et vous aideront à choisir la solution la plus adaptée à votre projet.
N’oubliez pas de surveiller les performances de votre site web après le déploiement.