J'ai commencé à écrire des tests de base dans JMeter et j'ai été surpris de constater que les mesures sont si différentes de celles d'Apache ab.
J'ai un réseau local gigabit connectant un serveur Intel i7 sous Nginx et une machine de test i5 sous JMeter ou ab. Dans un premier temps, je teste simplement le taux de réponse de la page d’accueil Nginx prêt à l’emploi.
ab -c 1 -n 100 http://testserver.local/
donne
Document Path: /
Document Length: 151 bytes
Concurrency Level: 1
Time taken for tests: 0.078 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 38400 bytes
HTML transferred: 15100 bytes
Requests per second: 1280.77 [#/sec] (mean)
Time per request: 0.781 [ms] (mean)
Time per request: 0.781 [ms] (mean, across all concurrent requests)
Transfer rate: 480.29 [Kbytes/sec] received
Ce résultat est toujours reproductible, +/- quelques pour cent.
Dans JMeter, j'ai un groupe de threads sur 100 boucles contenant 1 utilisateur:
Avec seulement 100 échantillons, cela donne des résultats extrêmement incohérents à chaque fois que je l'exécute. Mais le fait le plus surprenant est que le débit est signalé à 40 demandes par seconde (et non à 1280). Le taux le plus élevé enregistré était de 1030, et cela n’a été atteint que lorsque je suis passé à 10 000 échantillons.
Ai-je raison de penser que JMeter est le mauvais outil pour les tests de charge simples car ses frais généraux sont trop élevés pour permettre des mesures précises?
Jmeter vous dit combien de temps chaque demande en fait a pris. AB ne fait que quelques calculs élémentaires pour obtenir la moyenne générale. Donc, la réponse directe à votre question est que jmeter a raison et que ab fait une approximation approximative en vous donnant la moyenne pour tout.
Mais, bien sûr, si vous mettez les deux outils côte à côte et que vous les évaluez pour la vitesse, il est clair que b va exécuter jmeter. Jmeter en fait simplement plus, il enregistre plus de données et traite plus de logique; il faut donc plus de temps pour traiter une seule demande. Le simple fait est que Jmeter est un outil de test de charge complet, AB non.
Le but d'un outil {load testing} _ n'est pas d'être l'enfant le plus rapide du bloc, mais bien de pouvoir créer une représentation réaliste du type de charge avec laquelle votre application pourrait être touchée. quand ça va vivre. À cet égard, jmeter gagne haut la main, cela dépend donc vraiment de vos besoins. Si vous voulez simplement générer autant de requêtes que possible en utilisant le moins de matériel possible, alors ab est un choix judicieux, mais si vous voulez créer un test représentatif, avec des parcours transactionnels, une logique conditionnelle et toutes sortes d'autres choses utiles, alors jmeter est le chemin à parcourir. Pensez-y comme ceci: il s’agit de projets Apache mais AB a été conçu pour tester le serveur Web Apache. JMeter a toutefois été conçu pour tester Tomcat.
Maintenant, je suppose que jmeter produisait des résultats incohérents car il atteignait une limite sur la machine sur laquelle il tournait. Je parie que vous étiez en mode graphique et que vous aviez au moins un auditeur actif. De cette manière, vous demandez à l'outil de faire beaucoup de choses. Si vous avez besoin d'un nombre élevé de demandes, Jmeter dispose d'un mode maigre et moyen. Généralement, pour les gros volumes, la meilleure pratique consiste à exécuter des tests en ligne de commande avec très peu d'auditeurs. Il y a beaucoup d'informations à ce sujet sur le site Apache jmeter.
Si vous vous lancez réellement dans les tests de charge, vous devez également prendre en compte le fait que pour pouvoir réellement tirer parti de ce type de processus, vous devez d’abord décider du type de charge que votre site doit prendre en charge, puis vous devez concevoir: un test qui représente cela. Ceci est réalisé en utilisant des temps d'attente de stimulation et simulés. Le problème de dire à un fil qu'il devrait simplement disparaître et courir aussi vite que possible, c'est qu'il va itérer aussi vite que ses conditions locales le permettent, mais il y aura toujours quelque chose qui mettra le les pauses, même ab est limité; peu importe la légèreté d'un outil, il l'est toujours quelque chose. Mais si vous cadrez vos demandes, vous supprimez ce problème et vous obtenez un bonus supplémentaire plutôt utile: vous obtenez une cohérence entre les exécutions et les versions du code, même si votre serveur accélère ou ralentit (avec des modifications de la base de code). votre test fera toujours le même taux de demandes - ce qui est très utile pour l'analyse comparative.
Si vous voulez aller plus loin avec JMeter, jetez un coup d'œil au temporisateur de débit constant, puis utilisez plusieurs threads pour créer le niveau de trafic que vous devez représenter.
Dans votre configuration, JMeter se sature lui-même plus rapidement qu'il ne peut saturer votre serveur Web.
Vous exécutez un serveur Web C très optimisé sur un matériel supérieur et le comparez à une application Java relativement lourde sur un matériel moins important. Le code machine C optimisé sera (probablement) toujours plus rapide que le bytecode Java. JMeter n'est pas capable de suivre Nginx et vous donne donc des résultats étranges car il rencontre des limitations matérielles. Java fait beaucoup de choses intéressantes en arrière-plan qui gèrent les ressources matérielles, mais créent également un comportement imprévisible en cas d'utilisation extrême des ressources. ApacheBench, d’autre part, est un programme C assez léger pour saturer le serveur et produire des résultats cohérents, car sa capacité est excessive après saturation de votre serveur Web.
JMeter est idéal pour évaluer les applications plus lourdes et dynamiques nécessitant un peu de temps pour traiter les demandes. Toutes les données supplémentaires fournies contribuent à ce type d’applications Web. Lorsque vous gérez le service de fichiers statiques (à peu près tout ce qu'un serveur Web peut faire rapidement) sur des serveurs Web hautement optimisés, vous avez besoin d'un outil suffisamment rapide pour suivre le rythme.
Comme il a déjà été mentionné dans la première réponse, le mot clé "conditions requises". JMeter est le meilleur choix pour tester le serveur servant des pages Web. Par exemple, il peut envoyer une séquence de requêtes, générer une requête différente pour chaque séquence, analyser les réponses HTML et charger le contenu d'images et de scripts à partir du HTML. AB est le meilleur choix pour le test de l’API REST. Le serveur répondra aussi vite que possible et servira le plus de demandes possible. Il n’ya pas de connexion entre la demande à deux étapes et etc . Ainsi, AB est en effet capable de générer plus de requêtes que JMeter par rapport au même serveur depuis le même ordinateur client.