Qui obtient les bonnes mesures, JMeter ou Apache ab?
J'ai commencé à écrire quelques tests de base dans JMeter et j'ai été surpris que les mesures soient si différentes de celles d'Apache ab.
J'ai un LAN gigabit connectant un serveur Intel i7 exécutant Nginx et une machine de test i5 exécutant JMeter ou ab. Au départ, je teste simplement le taux de réponse de la page d'accueil NGINX prête à 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 1-user groupe de threads 100-loop contenant:
- un paramètre de gestionnaire D'en-tête HTTP Accept-Encoding: gzip
- Un HTTP Get / sampler
- un écouteur de rapport sommaire
Avec seulement 100 échantillons, cela donne des résultats extrêmement incohérents chaque fois que je l'exécute. Mais le plus étonnant, c'est que le débit est rapporté que 40 demandes par seconde (pas 1280). Le taux le plus élevé enregistré était 1030, et cela n'a été atteint que lorsque j'ai augmenté à 10 000 échantillon.
Ai-je raison de penser que JMeter est le mauvais outil pour les tests de charge simples parce que ses frais généraux sont trop élevés pour permettre des mesures précises?
3 réponses
Jmeter vous indique combien de temps chaque requête a réellement pris. AB fait juste quelques calculs très basiques pour obtenir la moyenne globale. Donc, la réponse directe à votre question Est que jmeter a raison et ab fait juste une estimation approximative en vous donnant la moyenne à travers 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 ab va effectuer jmeter. Jmeter fait juste plus, il enregistre plus de données et traite plus logique donc il faut plus de temps pour tourner autour d'une seule requête. Le simple fait est que Jmeter est un outil de test de charge complet, AB est, bien, pas.
Le fait est que le but d'un outilload testing n'est pas d'être l'enfant le plus rapide du bloc, mais plutôt de pouvoir construire une représentation réaliste du type de charge avec laquelle votre application pourrait être touchée quand elle sera mise en ligne. À cet égard, jmeter gagne haut la main, donc cela dépend vraiment de vos besoins. Si vous voulez juste pour générer autant de requêtes que possible en utilisant le moins de matériel, ab est un bon choix, mais si vous voulez construire un test représentatif, avec des trajets transactionnels, une logique conditionnelle et toutes sortes d'autres choses utiles, alors jmeter est le chemin à parcourir. Pensez-y comme ceci: ils sont tous deux des projets Apache mais AB a été, je pense, conçu pour tester le serveur web apache, JMeter, cependant, a été conçu pour tester Tomcat.
Maintenant, je suppose que jmeter produisait des résultats incohérents parce qu'il frappait une limite sur la machine sur laquelle il fonctionnait. Je parie que vous couriez en mode GUI et que vous aviez au moins un écouteur actif, comme ceci, vous demandez à l'outil de faire beaucoup. Si vous avez besoin d'un taux élevé de demandes, Jmeter a un mode lean et mean. En règle générale, 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 sur ce sujet sur le site apache jmeter.
Un autre point que vous devriez considérer, si vous êtes vraiment en train de tester la charge, c'est que pour vraiment profiter de ce genre de chose, vous devez d'abord décider quel type de charge vous avez besoin de votre site pour soutenir et seulement alors vous devriez concevoir un test qui représente cela. Ceci est réalisé en utilisant le rythme et les temps d'attente simulés. Le problème avec le fait de dire à un thread qui devrait simplement disparaître et courir aussi vite qu'il le peut, c'est qu'il itérera aussi vite que ses conditions locales le permettent, mais il y aura toujours {[8] } quelque chose qui met les pauses, même ab est limité; peu importe la légèreté d'un outil, il fait toujours quelque chose. Mais si vous accélérez vos requêtes, vous supprimez ce problème et, comme un bonus supplémentaire plutôt utile, vous vous retrouvez avec une cohérence entre les exécutions et entre les builds du code, donc 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 requêtes - ce qui est très utile pour
Si vous voulez prendre JMeter plus loin, jetez un oeil à la minuterie de débit Constant, puis utilisez plusieurs threads pour construire le niveau de trafic que vous devez représenter.
Dans votre configuration, JMeter se sature plus rapidement qu'il ne peut saturer votre serveur web.
Vous utilisez un serveur web C très optimisé sur un matériel supérieur et le benchmarking avec une application Java relativement lourde sur un matériel inférieur. 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 atteint les limitations matérielles. Java fait beaucoup de belles choses dans le arrière-plan qui gèrent les ressources matérielles, mais aussi créer un comportement imprévisible à l'utilisation extrême des ressources. ApacheBench, d'autre part, est un programme C assez léger qu'il peut saturer le serveur et peut produire des résultats cohérents car il a une capacité excédentaire après avoir saturé votre serveur web.
JMeter est idéal pour les applications dynamiques lourdes qui ont besoin de temps pour traiter les demandes. Toutes les données supplémentaires qu'il fournit aide avec des applications web comme ça. Lorsque vous avez affaire avec le service de fichiers statiques (à peu près la chose la plus rapide qu'un serveur web peut faire) sur des serveurs Web hautement optimisés, vous avez besoin d'un outil assez rapide pour suivre.
Comme il a déjà indiqué dans la première réponse, le mot-clé "exigences". JMeter est un meilleur choix pour tester le serveur qui sert des pages web. Par exemple, il peut envoyer une séquence de requêtes, générer une requête differet pour chaque séquence, analyser les réponses HTML et charger le contenu des images et des scripts à partir du code HTML. AB est un meilleur choix pour les tests D'API REST, où vous avez besoin que le serveur réponde aussi vite que possible et serve autant de demandes que possible, il n'y a pas de connexion entre deux sequent demande et etc. Ainsi, AB est en effet capable de générer plus de requêtes que JMeter vs même serveur à partir de la même machine cliente.