[JAVA] Définissez la charge d'accès qui peut être modifiée graphiquement avec JMeter (partie 2)

introduction

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) sample_image ↑ 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.

Dernier synopsis

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. .. ..

Essayez d'utiliser le minuteur de mise en forme du débit (édition avancée)

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.

Informations environnementales

Récupération environnementale

Si Apache est arrêté, la procédure de démarrage est différente de la précédente, alors laissez-la comme rappel.

Confirmation de la communication

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.

Vérifiez l'état du conteneur

$ 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.

Arrêt du conteneur (référence)

$ 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)

Démarrer le conteneur

$ 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.

Exécuter en série un modèle de transition d'écran

Prenant Amazon comme exemple, la plupart des gens utilisent le site selon le flux suivant.

  1. Affichez la première page
  2. Sélectionnez un produit
  3. Acheter

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.

Paramètres de situation

--Un utilisateur --Page 01-> Page 02-> Page 03 ――Habituellement 15RPS (RequestPerSecond), mais il monte momentanément à 75RPS

Exprimez le flux d'accès avec JMeter

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.

Définir ThroughputShapingTimer

スクリーンショット 2020-10-18 22.17.48.png

Le montant de la charge est en cours de modification.

Définir un groupe de threads

スクリーンショット 2020-10-18 22.43.35.png

Définissez le nombre de threads (degré de parallélisme) sur 1.

Exécutez JMeter

スクリーンショット 2020-10-18 22.22.39.png

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)

Analyse du journal Apache

 $ 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.

Analyse du journal Apache (confirmez qu'il s'agit d'une série)

 $ 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.

Exécuter un modèle de transition d'écran en parallèle

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.

Paramètres de situation

Définir un groupe de threads

スクリーンショット 2020-10-18 23.41.35.png

Définissez le nombre de threads (degré de parallélisme) sur 3.

Exécutez JMeter

スクリーンショット 2020-10-18 23.45.47.png

Cette fois, vous avez également pu accéder aux trois URL presque uniformément.

Analyse du journal Apache

 $ 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.

Analyse du journal Apache (confirmez qu'il est parallèle)

 $ 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é.

Exécuter plusieurs modèles de transition d'écran en parallèle

Jusqu'à la dernière fois, j'ai essayé les modèles suivants. (Modèle 1)

  1. Affichez la première page
  2. Sélectionnez un produit
  3. Acheter

Cette fois, ajoutez les transitions d'écran suivantes en tant qu'un autre groupe de threads. (Modèle 2)

  1. Affichez la première page
  2. Sélectionnez un produit
  3. Sélectionnez d'autres produits recommandés

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.

Paramètres de situation

(Motif 1) * Identique à la dernière fois

(Modèle 2)

--5 utilisateurs --Page 11-> Page 12-> Page 13 --50RPS (RequestPerSecond) se produit en continu

Exprimez le flux d'accès avec JMeter

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.

スクリーンショット 2020-10-19 2.53.12.png

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

Définir ThroughputShapingTimer

スクリーンショット 2020-10-19 23.54.09.png

Rendez-le uniforme à 50 RPS.

Exécutez JMeter

スクリーンショット 2020-10-20 0.13.33.png

Vous pouvez maintenir une charge uniforme pour chacun des groupes de threads 1 et 2.

Créer un rapport JMeter

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.

  1. Ajustez l'intervalle de dessin du graphique du rapport JMeter スクリーンショット 2020-10-20 1.47.27.png 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.

  2. Ouvrez le menu de génération de rapport スクリーンショット 2020-10-20 1.28.33.png Sélectionnez «Outils» -> «Générer un rapport HTML» dans la barre de menus.

  3. Entrez les informations requises pour générer le rapport スクリーンショット 2020-10-20 1.31.41.png 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

  4. Générez un rapport スクリーンショット 2020-10-20 1.32.35.png Cliquez sur Générer un rapport en bas et cochez-le pour terminer la génération.

Vérifiez le rapport JMeter

  1. Ouvrez le rapport généré dans votre navigateur スクリーンショット 2020-10-20 1.52.04.png Puisque le rapport a été généré à l'emplacement spécifié dans le répertoire Output précédemment, ouvrez ʻindex.html`.

  2. Transition vers le graphique cible スクリーンショット 2020-10-20 1.53.28.png Sélectionnez «Débit».

  3. Transition vers le graphique cible スクリーンショット 2020-10-20 1.55.11.png Sélectionnez «Transactions par seconde».

  4. Impressionné par le beau graphique スクリーンショット 2020-10-20 1.56.37.png Vous pouvez dessiner la forme d'onde exactement comme défini par ThroughputShapingTimer! !!
    ** Félicitations, vous êtes également un maître JMeter! ** **

Parler plus tard

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.

Q1 La quantité de charge réglée n'est pas atteinte

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.

Q2 La charge réglée n'est pas du tout atteinte. .. ..

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)

Q3 Peu importe mes efforts, la charge attendue ne sort pas. .. ..

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é.

à la fin

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.

référence

ThrouputShapingTimer JMeter generating-dashboard

Recommended Posts

Définissez la charge d'accès qui peut être modifiée graphiquement avec JMeter (partie 2)
Définissez la charge d'accès qui peut être modifiée graphiquement avec JMeter (Partie 1)
Quatre rangées avec gravité pouvant être jouées sur la console
[Rails] "Pry-rails" qui peuvent être utilisés lors de l'enregistrement avec la méthode create
Description qui le rend accessible uniquement aux affiches
Organiser les méthodes qui peuvent être utilisées avec StringUtils
À propos du problème que hidden_field peut être utilisé de manière insensée
Test de charge avec JMeter
Apprendre Ruby avec la sélection des débutants AtCoder [Quelques sommes] Augmentez les méthodes qui peuvent être utilisées
Seul le flux de niveau supérieur peut être parallélisé avec Java Stream.
Créer un contrôle de page qui peut être utilisé avec RecyclerView
Base de données Firebase-Realtime sur Android pouvant être utilisée avec copie
SwiftUI View qui peut être utilisé en combinaison avec d'autres frameworks
Résumé des JDK pouvant être installés avec Homebrew (à partir de novembre 2019)