La dernière fois, j'ai installé ThroughputShapingTimer (plug-in) dans JMeter. J'ai expliqué comment ajuster graphiquement la quantité de charge. Définissez la charge d'accès qui peut être modifiée graphiquement avec JMeter (Partie 1) ↑ Image de contrôle de la charge d'accès Page officielle
Cela a été une longue histoire d'introduire un usage simple, donc cette fois je vais expliquer l'utilisation pratique.
M. A, qui s'est vu confier le test de performance du site par son patron. En réponse à la prétention déraisonnable du patron qui a déclaré: "Je veux tester la montée en flèche de l'accès lors du buzz sur Twitter" En utilisant ThroughputShapingTimer, M. A peut désormais effectuer le test qui répond aux attentes avec JMeter.
Cependant, M. A n'a vérifié le test que sur une seule page. Il a eu du mal à créer des scénarios de test plus complexes en fonction de ses visites sur son site Web. .. ..
Avec cette petite histoire, j'expliquerai immédiatement le modèle de test et la création du scénario de test de JMeter.
Dans cet article, nous présenterons les trois modèles de test suivants dans le flux de saut, étape et saut.
Si Apache est arrêté, la procédure de démarrage est différente de la précédente, alors laissez-la comme rappel.
Vous pouvez également vérifier en envoyant une requête depuis JMeter, mais ici nous vérifierons avec la commande CURL.
$ curl http://localhost:8080/index.html curl: (7) Failed to connect to localhost port 8080: Connection refused
S'il devient "Failed", cela signifie que vous ne pouvez pas communiquer avec l'Apache que vous avez utilisé la dernière fois.
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e2dc7c3714ee httpd:2.4 "httpd-foreground" 6 days ago Exited (0) 5 days ago my-apache-app
Puisque Status
est ʻexited`, vous pouvez voir que le conteneur est à l'état arrêté (normal).
Si c'est ʻUp`, cela signifie qu'il est dans un état bloqué, donc arrêtez le conteneur une fois.
$ docker stop e2dc7c3714ee
Spécifiez l'ID du conteneur et arrêtez. Après avoir exécuté la commande, vérifiez à nouveau le statut du conteneur et confirmez qu'il est «Exited». (Si cela ne fonctionne pas, redémarrez le PC)
$ docker start e2dc7c3714ee e2dc7c3714ee
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e2dc7c3714ee httpd:2.4 "httpd-foreground" 6 days ago Up 3 seconds 0.0.0.0:8080->80/tcp, 0.0.0.0:32772->8080/tcp my-apache-app
$ curl http://localhost:8080/index.html hello
Vous êtes maintenant prêt.
Prenant Amazon comme exemple, la plupart des gens utilisent le site selon le flux suivant.
Ce modèle décrit comment ajuster la charge en supposant qu'un utilisateur répète la même transition de page à l'infini.
--Un utilisateur --Page 01-> Page 02-> Page 03 ――Habituellement 15RPS (RequestPerSecond), mais il monte momentanément à 75RPS
Utiliser le groupe de fils créé la dernière fois Comme nous n'avons pas préparé le contenu pour le test cette fois, nous allons accéder à trois types d'URL en accédant au même HTML avec des caractères de requête différents.
Page 01 *
Page 02 *
Page 03 *
Le montant de la charge est en cours de modification.
Définissez le nombre de threads (degré de parallélisme) sur 1.
Vous avez pu accéder aux trois URL presque uniformément. (Bien que ce ne soit pas complètement égal, ThroughputShapingTimer est ludique, alors pardonnez-moi)
$ docker logs e2dc7c3714ee | tail -1094 | awk '{print $4}' | sed 's_\[18/Oct/2020:__' | uniq -c 〜〜〜 16 13:20:00 14 13:20:01 16 13:20:02 14 13:20:03 16 13:20:04 14 13:20:05 15 13:20:06 26 13:20:07 38 13:20:08 50 13:20:09 63 13:20:10 75 13:20:11 63 13:20:12 51 13:20:13 39 13:20:14 27 13:20:15 16 13:20:16 14 13:20:17 15 13:20:18 14 13:20:19 〜〜〜
Il est passé de 15RPS à 75RPS et est revenu à 15RPS.
$ docker logs e2dc7c3714ee | tail -10 | awk '{print $4, $7}' [18/Oct/2020:13:20:36 /index.html?test02 [18/Oct/2020:13:20:36 /index.html?test03 [18/Oct/2020:13:20:36 /index.html?test01 [18/Oct/2020:13:20:36 /index.html?test02 [18/Oct/2020:13:20:36 /index.html?test03 [18/Oct/2020:13:20:36 /index.html?test01 [18/Oct/2020:13:20:36 /index.html?test02 [18/Oct/2020:13:20:36 /index.html?test03 [18/Oct/2020:13:20:36 /index.html?test01 [18/Oct/2020:13:20:36 /index.html?test02
Vous pouvez voir que l'accès arrive dans l'ordre de la page 01-> page 02-> page 03.
La dernière fois, j'ai ajusté la charge en supposant qu'un utilisateur répète indéfiniment la même transition de page, mais il ne peut pas s'agir d'un site Web réel.
Je vais vous expliquer comment ajuster la quantité de charge en supposant que trois utilisateurs feront la même transition d'écran que la dernière fois en même temps.
Définissez le nombre de threads (degré de parallélisme) sur 3.
Cette fois, vous avez également pu accéder aux trois URL presque uniformément.
$ docker logs e2dc7c3714ee | tail -1082 | awk '{print $4}' | sed 's_\[18/Oct/2020:__' | uniq -c 〜〜〜 14 14:44:50 15 14:44:51 14 14:44:52 15 14:44:53 15 14:44:54 14 14:44:55 16 14:44:56 14 14:44:57 16 14:44:58 13 14:44:59 28 14:45:00 38 14:45:01 50 14:45:02 65 14:45:03 75 14:45:04 63 14:45:05 51 14:45:06 37 14:45:07 28 14:45:08 15 14:45:09 15 14:45:10 15 14:45:11 15 14:45:12 15 14:45:13 〜〜〜
Il est passé de 15RPS à 75RPS et est revenu à 15RPS.
$ docker logs e2dc7c3714ee | tail -10 | awk '{print $4, $7}' [18/Oct/2020:14:45:29 /index.html?test03 [18/Oct/2020:14:45:29 /index.html?test02 [18/Oct/2020:14:45:29 /index.html?test01 [18/Oct/2020:14:45:29 /index.html?test02 [18/Oct/2020:14:45:29 /index.html?test03 [18/Oct/2020:14:45:29 /index.html?test02 [18/Oct/2020:14:45:29 /index.html?test03 [18/Oct/2020:14:45:29 /index.html?test01 [18/Oct/2020:14:45:29 /index.html?test03 [18/Oct/2020:14:45:29 /index.html?test01
Par rapport à la fois précédente, l'ordre d'accès n'est plus dans l'ordre de la page 01-> page 02-> page 03. Vous pouvez voir que trois utilisateurs ont accédé en même temps et que l'ordre a été modifié.
Jusqu'à la dernière fois, j'ai essayé les modèles suivants. (Modèle 1)
Cette fois, ajoutez les transitions d'écran suivantes en tant qu'un autre groupe de threads. (Modèle 2)
Cette fois (Modèle 1) Trois utilisateurs effectuent des transitions d'écran en même temps (Modèle 2) Cinq utilisateurs effectuent des transitions d'écran en même temps Je vais vous expliquer comment ajuster le montant de la charge sur place.
(Motif 1) * Identique à la dernière fois
(Modèle 2)
--5 utilisateurs --Page 11-> Page 12-> Page 13 --50RPS (RequestPerSecond) se produit en continu
Le groupe de threads créé la dernière fois sera utilisé.
Dupliquez et placez le groupe de fils comme indiqué dans l'image ci-dessous. Placez le rapport de statistiques dans la même hiérarchie que le groupe de threads.
Modifiez les paramètres dupliqués comme suit.
Groupe de discussion:
Nombre de fils: "5"
Requête HTTP (test11):
Chemin: /index.html? Test11
Requête HTTP (test12):
Chemin: /index.html? Test12
Requête HTTP (test13):
Chemin: /index.html? Test13
Rendez-le uniforme à 50 RPS.
Vous pouvez maintenir une charge uniforme pour chacun des groupes de threads 1 et 2.
Comme le contenu du test est compliqué cette fois, il est difficile de confirmer qu'il fonctionne comme prévu en analysant le journal Apache. Sortons un rapport avec la fonction standard de JMeter et vérifions le résultat.
Ajustez l'intervalle de dessin du graphique du rapport JMeter
Du coup, c'est une procédure qui n'est normalement pas effectuée. .. ..
Le rapport trace le graphique toutes les minutes par défaut.
Le temps de test étant très court cette fois, nous raccourcirons également l'intervalle de dessin du graphique.
Ouvrez <le répertoire dans lequel vous avez extrait JMeter> / apache-jmeter-5.3 / bin / user.properties
.
Autour de la ligne 76, il y a une valeur de réglage pour l'intervalle de dessin du graphique appelée jmeter.reportgenerator.overall_granularity
, donc décommentez-la et changez-la de 60000 millisecondes à 1000 millisecondes.
Ouvrez le menu de génération de rapport Sélectionnez «Outils» -> «Générer un rapport HTML» dans la barre de menus.
Entrez les informations requises pour générer le rapport Fichier de résultat (csv ou jtl): nom du fichier de sortie spécifié dans le rapport statistique Fichier user.properties: sous bin (fichier réécrit précédemment) Répertoire de sortie: n'importe où est OK
Générez un rapport Cliquez sur Générer un rapport en bas et cochez-le pour terminer la génération.
Ouvrez le rapport généré dans votre navigateur Puisque le rapport a été généré à l'emplacement spécifié dans le répertoire Output précédemment, ouvrez ʻindex.html`.
Transition vers le graphique cible Sélectionnez «Débit».
Transition vers le graphique cible Sélectionnez «Transactions par seconde».
Impressionné par le beau graphique
Vous pouvez dessiner la forme d'onde exactement comme défini par ThroughputShapingTimer
! !!
** Félicitations, vous êtes également un maître JMeter! ** **
Mr. A "Enfin, le paramétrage de JMter est terminé!" Patron "Merci, je laisse ce test de performance à Mr. A. Bonne chance!" M. A "Oui!"
M. A est prêt à mesurer les performances de l'application Web testée. Mais c'était le début du véritable enfer. M. A, qui est encore inexpérimenté, ne pouvait pas encore prédire les nombreux problèmes qui se poseraient à l'avenir. .. ..
Je ne prévois pas de suite, mais si j'ose lui donner un titre la prochaine fois ** La prochaine fois: "Il y a des échecs de performances et de production." **
Les tests de performance ne sont qu'un moyen de détecter les problèmes. Le raccourci vers une fin heureuse est pour votre patron de guider le plan d'examen de A vers un plan d'examen plus approprié et pour A d'impliquer les personnes impliquées dans divers problèmes, grands et petits.
Un aparté, j'espère que cet article augmentera le nombre de personnes qui peuvent mener une vie JMeter plus riche.
Appendix
Au fur et à mesure que j'écrirai l'article, je résumerai les points que j'ai pensé "Je risque de trébucher sur ce point ..." au format QA. Si vous avez d'autres préoccupations, veuillez commenter.
Mr. A "Le réglage est correct, mais la charge attendue n'est pas atteinte ... Elle est légèrement en dessous de la valeur réglée ..." Patron "Spécifications?"
Dans cette vérification, ce n'était pas un problème car seule une petite quantité de charge a été appliquée, mais la valeur mesurée est légèrement inférieure au réglage d'environ plusieurs centaines de RPS.
Puisqu'il s'agit d'OSS, oublions-le et définissons une charge légèrement plus élevée en supposant qu'elle sera inférieure.
M. A "J'ai défini la quantité de charge équivalente à la production réelle, mais la valeur mesurée est nettement inférieure ... JMeter génère également une erreur ..." Patron "Je ne peux pas dire sans voir l'erreur, mais JMeter a peut-être atteint sa limite."
JMeter fonctionne sur Java, donc il consomme beaucoup de ressources. Tout d'abord, essayez d'augmenter la mémoire allouée à JMeter.
référence: Que faire si OutOfMemory apparaît dans JMeter
S'il y a suffisamment de mémoire mais que la charge attendue n'est pas atteinte, il est possible que le nombre maximum de connexions OS ait été atteint. Augmentons le nombre maximum de descripteurs de fichiers. (Si vous n'êtes pas sûr, demandez à la personne en charge de l'infrastructure de le faire!)
référence: [Modifiez /etc/security/limits.conf au lieu de ulimit -n si vous souhaitez conserver les paramètres après le redémarrage / l'arrêt (contre-mesures d'erreur «Trop de fichiers ouverts» «Trop de fichiers ouverts»)](https :: //qiita.com/neko_the_shadow/items/841bf59c4f80588baad7)
Mr. A "J'ai revu divers réglages, mais la charge équivalente à la production réelle ne sort pas ..." Patron "C'est peut-être la limite du serveur JMeter ..."
Dans un système à grande échelle, il y a une limite à la quantité de charge qui peut être sortie par un JMeter afin que le traitement soit réparti entre plusieurs serveurs. (Je ne peux pas le dire sans condition ...) Distribuons le traitement de JMeter par l'une des méthodes suivantes.
Exemple: lorsque le traitement est réparti sur 10 JMeters
--Réglez la valeur de réglage de ThroughputShapingTimer à 1/10 et placez-la sur 10 JMeters à exécuter. --En plus de ce qui précède, faites de JMeter une configuration maître-esclave.
référence: Création d'un environnement JMeter Master / Slave sur AWS (CentOS 7) FireWall et KeyStore sont les erreurs
L'avantage de la configuration maître-esclave est que les journaux d'exécution sont agrégés dans le maître, ce qui facilite la création de rapports. Cependant, le coût est un inconvénient car le nombre d'instances de serveur est augmenté d'une unité.
Cela fait longtemps, mais cet article est complet.
J'ai réalisé que rédiger un article est assez difficile.
J'ai été aidé par Qiita et d'autres à plusieurs reprises, mais je viens de l'écrémer. Désormais, j'aimerais lire l'article en le mordant un peu plus.
Cette fois, j'ai publié un article sur les tests de performances, mais mon activité principale consiste à personnaliser le framework Java. (Spring Framework, etc.) Étant donné que le framework Java contient beaucoup de contenu commercial et qu'il est difficile d'écrire des articles, Je pense qu'il sera peut-être possible de saisir cette occasion pour défier des domaines qui n'ont pas été touchés jusqu'à présent.
Je voudrais créer une page Web avec des pages GitHub et des actions GitHub. Foundation-> Java Framework Je n'ai jamais touché l'écran, donc je ferai de mon mieux pour ne pas disparaître.
ThrouputShapingTimer JMeter generating-dashboard
Recommended Posts