<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archives des JMeter - Alain ARDITI&#039;s blog</title>
	<atom:link href="https://alain.arditi.fr/tag/jmeter/feed/" rel="self" type="application/rss+xml" />
	<link>https://alain.arditi.fr/tag/jmeter/</link>
	<description>Aide mémoire informatique</description>
	<lastBuildDate>Wed, 08 Nov 2023 15:54:26 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://alain.arditi.fr/wp-content/uploads/2020/04/cropped-ARDITI_Alain_20200326_512x512-32x32.jpg</url>
	<title>Archives des JMeter - Alain ARDITI&#039;s blog</title>
	<link>https://alain.arditi.fr/tag/jmeter/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Tests de charge : le plugin jp@gc Concurrency Thread Group</title>
		<link>https://alain.arditi.fr/2022/04/03/tests-de-charge-le-plugin-jpgc-concurrency-thread-group/</link>
					<comments>https://alain.arditi.fr/2022/04/03/tests-de-charge-le-plugin-jpgc-concurrency-thread-group/#respond</comments>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Sun, 03 Apr 2022 17:24:10 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[Test de Charge]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charge]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=1097</guid>

					<description><![CDATA[<p>Lors de tests de charge avec JMeter, il est courant d’utiliser le plugin jp@gc Concurrency Thread Group (https://jmeter-plugins.org/wiki/ConcurrencyThreadGroup/), qui permet de faire monter la charge par marche d’escalier. Les marches d’escalier quand elles sont suffisamment longues par rapport à la fréquence des prises de mesures du côté de l’infrastructure, permettent de faire une corrélation directe&#8230; </p>
<div class="more-link-container"><a class="more-link" href="https://alain.arditi.fr/2022/04/03/tests-de-charge-le-plugin-jpgc-concurrency-thread-group/">Poursuivre la lecture <span class="screen-reader-text">Tests de charge : le plugin jp@gc Concurrency Thread Group</span></a></div>
<p>L’article <a href="https://alain.arditi.fr/2022/04/03/tests-de-charge-le-plugin-jpgc-concurrency-thread-group/">Tests de charge : le plugin jp@gc Concurrency Thread Group</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Lors de tests de charge avec JMeter, il est courant d’utiliser le plugin jp@gc Concurrency Thread Group (<a href="https://jmeter-plugins.org/wiki/ConcurrencyThreadGroup/" target="_blank" rel="noreferrer noopener">https://jmeter-plugins.org/wiki/ConcurrencyThreadGroup/</a>), qui permet de faire monter la charge par marche d’escalier.</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/B9olHiSkBPQ2w3WvFYegBqMTObxnoVjyYMAA11cJk5Yv4xvxp3hdp1HwgYyX-PMOUO4cfnzjlFvtLs654CLmDZxiXe0M1FFpV3pQwexKJ6MeUw3joCLo7QHyaYyBnMClIbhZ1hQq" alt="JMeter logo"/></figure>



<p>Les marches d’escalier quand elles sont suffisamment longues par rapport à la fréquence des prises de mesures du côté de l’infrastructure, permettent de faire une corrélation directe entre la charge et le comportement de la plateforme. En effet, la plateforme va consommer des ressources en fonction de l&rsquo;injection et on pourra visualiser les marches d’escalier du côté des graphiques de l’infrastructure.</p>



<span id="more-1097"></span>



<p>A condition que la durée des marches, ou plus précisément la durée des paliers, permette d’avoir suffisamment de points de mesure côté infrastructure. Si la fréquence de la métrologie est de 5 minutes, par exemple, qui est la valeur courante des logiciels de métrologie, il faut au moins des paliers de 15 à 20 minutes pour avoir 3 à 4 mesures et visualiser ainsi le palier.</p>



<p>Dans l’exemple suivant, on peut voir l’utilisation du plugin “Concurrency Thread Group” avec des paliers de 20 minutes.</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/2nQJkcMBYSxMnF36TP43CihgrFAOMJjJ5ZtCcHElEMzbmAMwryDCE-wyMY28PG0wKSbZ4tTYEOcxEkpMcPqH4t-NDDVgS81Nt0Ph_gfoXZSMW5w2GAnkDxj0U-nHSy94XwNX0Lkn" alt=""/></figure>



<p>Du côté de l’infrastructure, sur le graphe du débit réseau on retrouve les paliers :</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/kOuUPKzgvJhlC5EpSTXOkmQqKq4T0f0gyZdvSdQYs5j2ZbscmoIfoJ95k5r_bdPSPmUj2SkPJ6gleVTi5bGsOuYkU4gvGcXLcG3aQeKNbxseN4A_F7N4tiUGPLb6jnOuTjVTpAu5" alt=""/></figure>



<p>On peut ainsi faire la correspondance entre le nombre de threads et la charge de la plateforme.</p>



<p>On peut dire qu’à 60 threads, au 3<sup>ème</sup> palier, le débit de la plateforme est de 60 Mbps et qu&rsquo;au 8<sup>ème</sup> et dernier palier, à 150 threads, le débit est de 150Mbps.</p>



<p>Même si les paliers de la métrologie ne sont pas plats, on retrouve bien l’évolution de l’injecteur, et dans ce cas précis, on peut même conclure sans trop se tromper que le débit augmente de 1 Mbps par thread.</p>



<p>Par contre, on n’en déduit pas facilement le nombre de parcours ou de sessions simultanées à chaque palier.</p>



<p>Un moyen assez simple d’extrapoler les résultats pour avoir des métriques marketing, est de spécifier des valeurs judicieuses dans le plugin “Concurrency Thread Group”, comme on va le voir dans le graphique ci-dessous :</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/Cti5CG10tspGS_UmmaEWmhdsTsY18i3_RQtBOQtN-n76TKT_SFjP9LHiDT4dR3UPmDafmR06jwVzteGgw9bd-l78xqQ7qnH0WPYBjN0pZGFLKWv4uyYE7YM9BYMJIVCiNYSztNxc" alt=""/></figure>



<p>Ici, on a des marches d’escalier de 20 minutes avec 20 threads supplémentaires à chaque marche. On remarque que les surfaces sous les marches augmentent d’une unité de surface (4 carreaux) par marche.</p>



<p>Ainsi la surface sous la dernière marche vaut 5 fois la surface sous la première marche.</p>



<figure class="wp-block-image size-large is-resized"><img fetchpriority="high" decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2022/04/Screenshot-2021-12-16-at-10.50.20_escaliers-1024x722.png" alt="" class="wp-image-1100" width="610" height="430" srcset="https://alain.arditi.fr/wp-content/uploads/2022/04/Screenshot-2021-12-16-at-10.50.20_escaliers-1024x722.png 1024w, https://alain.arditi.fr/wp-content/uploads/2022/04/Screenshot-2021-12-16-at-10.50.20_escaliers-300x212.png 300w, https://alain.arditi.fr/wp-content/uploads/2022/04/Screenshot-2021-12-16-at-10.50.20_escaliers-768x542.png 768w, https://alain.arditi.fr/wp-content/uploads/2022/04/Screenshot-2021-12-16-at-10.50.20_escaliers.png 1534w" sizes="(min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></figure>



<p>Comme les threads travaillent de manière uniforme, on peut en déduire que s’ils parcourent n scénarios pendant les 20 première minutes, c’est à dire pendant la première marche, ils en parcourent 5 fois plus lorsque JMeter atteint les 100 threads, c’est à dire à la dernière marche.</p>



<p>Comme JMeter fournit le nombre total de scénarios qu’il a exécutés à la fin du tir, en détaillant le nombre d’exécution par URL, on peut en déduire facilement le nombre de visites.</p>



<p>Pour connaître le nombre de scénarios exécutés pendant les 20 premières minutes, on part de l’hypothèse que nombre de scénarios est proportionnel à la surface sous les marches.</p>



<p>La surface totale de l’escalier de 5 marches, qu’on appellera S<sub>tot</sub>, est de 1+2+3+4+5 = 5&#215;6/2 = 15. Donc S<sub>tot</sub> = 15.</p>



<p>Si le nombre total de scénarios exécutés par JMeter, donc le nombre de visites, est V<sub>tot</sub>, alors pendant les 20 premières minutes (durée de la première marche), JMeter a exécuté&nbsp; V<sub>tot</sub> / S<sub>tot</sub> visites.</p>



<p>Et pendant les 20 dernières minutes, à la 5<sup>ème</sup> marche, il aura exécuté (V<sub>tot</sub> / S<sub>tot</sub> * 5) visites, puisque la surface sous la 5eme marche est 5 fois plus grande que la surface de la première.</p>



<p>En prenant les usages du Web qui comptabilisent les sessions comme toute visite après 30 minutes d’inactivité, si on extrapole le nombre de visites du dernier palier de 20 minutes à 30 minutes, on obtient (V<sub>tot</sub> / S<sub>tot</sub> * 5) * 3/2 sessions simultanées lorsqu’on atteint 100 threads.</p>



<p>On voit que ce calcul s’applique quel que soit le nombre de threads et la durée des paliers, sur la base des éléments fournis par JMeter, et se fait de manière simple, pour peu qu’on choisisse bien les paramètres du plugin “Concurrency Thread Group”.</p>



<p>En faisant la corrélation avec les graphes de l’infrastructure, on peut en déduire facilement le nombre de sessions simultanées qu’elle peut supporter !</p>



<p>Une fois qu&rsquo;on connaît le nombre de sessions simultanées, on peut extrapoler les nombre de visite à l&rsquo;heure, puis par jour et enfin le nombre de visites mensuelles, en jetant un oeil sur l&rsquo;article : <a href="https://alain.arditi.fr/2022/04/02/test-de-charge-comment-extrapoler-le-nombre-de-visites/">Test de charge : Comment extrapoler le nombre de visites ?</a></p>
<p>L’article <a href="https://alain.arditi.fr/2022/04/03/tests-de-charge-le-plugin-jpgc-concurrency-thread-group/">Tests de charge : le plugin jp@gc Concurrency Thread Group</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://alain.arditi.fr/2022/04/03/tests-de-charge-le-plugin-jpgc-concurrency-thread-group/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Test de charge : Comment extrapoler le nombre de visites ?</title>
		<link>https://alain.arditi.fr/2022/04/02/test-de-charge-comment-extrapoler-le-nombre-de-visites/</link>
					<comments>https://alain.arditi.fr/2022/04/02/test-de-charge-comment-extrapoler-le-nombre-de-visites/#respond</comments>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Sat, 02 Apr 2022 10:17:54 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[Test de Charge]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charge]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=1092</guid>

					<description><![CDATA[<p>Le test de charge a pour objectif d’avoir une idée de l’audience que pourra supporter le site testé. Sauf que le test est généralement fait sur une durée relativement courte avec des scénarios plus ou moins réalistes. A partir de là, on va essayer d’extrapoler l’audience produite par le test en un nombre de visites&#8230; </p>
<div class="more-link-container"><a class="more-link" href="https://alain.arditi.fr/2022/04/02/test-de-charge-comment-extrapoler-le-nombre-de-visites/">Poursuivre la lecture <span class="screen-reader-text">Test de charge : Comment extrapoler le nombre de visites ?</span></a></div>
<p>L’article <a href="https://alain.arditi.fr/2022/04/02/test-de-charge-comment-extrapoler-le-nombre-de-visites/">Test de charge : Comment extrapoler le nombre de visites ?</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Le test de charge a pour objectif d’avoir une idée de l’audience que pourra supporter le site testé. Sauf que le test est généralement fait sur une durée relativement courte avec des scénarios plus ou moins réalistes. A partir de là, on va essayer d’extrapoler l’audience produite par le test en un nombre de visites par mois, par jour, en nombre de sessions simultanées et en nombre de conversions à l’heure quand il s’agit de boutiques en ligne.&nbsp;</p>



<span id="more-1092"></span>



<p>On va s’intéresser à l’audience d’un site de commerce en ligne. Avant de passer une commande sur un site de commerce en ligne, un internaute va peut-être passer 20 minutes à naviguer sur le site pour parcourir le catalogue et remplir son panier. Ensuite, il va passer la commande, créer son compte, saisir son adresse de livraison, effectuer le paiement, et éventuellement vérifier sa commande sur le site. Il aura passé 30 minutes sur le site.</p>



<p>Afin de simuler l’audience, nous utilisons l’outil JMeter (<a href="https://jmeter.apache.org" target="_blank" rel="noreferrer noopener nofollow">https://jmeter.apache.org</a>).</p>



<figure class="wp-block-image size-full"><img decoding="async" width="521" height="177" src="https://alain.arditi.fr/wp-content/uploads/2022/04/JMeter_logo.png" alt="JMeter logo" class="wp-image-1093" srcset="https://alain.arditi.fr/wp-content/uploads/2022/04/JMeter_logo.png 521w, https://alain.arditi.fr/wp-content/uploads/2022/04/JMeter_logo-300x102.png 300w" sizes="(min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></figure>



<p>Si on veut simuler une audience équivalente à 600 commandes à l’heure, il faudra lancer notre scénario 600 fois en une heure. Comme il dure 30 minutes, il faudra lancer 300 threads en parallèle qui vont chacun effectuer 2 scénarios. On aura bien nos 600 commandes en une heure, sauf qu’on imagine que les passages de commande vont se trouver plutôt à la fin des 30 minutes, on aura donc un biais par rapport à la réalité.</p>



<p>Si on veut supprimer ce biais, il faudrait que l’injecteur soit dans un rythme de croisière nominal, avant la prise des mesures, afin que les aléas temporels du scénario permettent de distribuer les commandes. Ca veut dire, qu’il faudra lancer les 300 threads quelques heures auparavant et au moins 30 minutes après l’heure de mesure.</p>



<p>Et si le site de commerce en ligne à un taux de conversion de 5%, c’est à dire le nombre de visiteurs qui vont passer une commande, il faut multiplier par 20 le nombre de scénarios exécutés par l’injecteur, sachant que 95% pourcents d’entre eux ne doivent pas passer de commande. En conservant des scénarios de 30 minutes, il faudra 6000 threads pour simuler l’audience et faire durer le test un bon paquet d’heures&#8230;.</p>



<p>Bref, dans ces conditions, la simulation de la réalité devient très difficile en pratique, car la durée des tests est prohibitive !</p>



<p>Afin de permettre la réalisation des tests dans des durées acceptables, on va raccourcir la durée du parcours d’un visiteur.</p>



<p>On va faire la supposition que lancer 300 threads qui jouent un scénario de 30 minutes pendant 1 heure, c’est équivalent pour le site qui reçoit les visites à 30 threads qui jouent un scénario de 3 minutes pendant 1 heure.</p>



<p>Dans les 2 cas, on aura exécuté 600 scénarios en 1 heure. Le site aura répondu aux mêmes sollicitations sauf que dans le deuxième cas, le rythme de croisière sera atteint dix fois plus rapidement, facilitant du même coup la réalisation du test qui pourra durer 10 fois moins longtemps !</p>



<p>Si finalement, le scénario est accéléré pour durer 30 secondes, avec un enchaînement de 20 à 40 requêtes HTTP et des aléas temporels de quelques centaines de millisecondes entre les requêtes, on obtient l’équivalent de la charge précédente avec 5 threads pendant 30 secondes.</p>



<p>Si on fait durer ce dernier test 10 minutes, chaque thread aura fait 20 boucles. On n’est pas loin d’un rythme de croisière avec suffisamment d’aléa pour le considérer comme représentatif d’une audience de 600 commandes à l’heure.</p>



<p>Une manière simple de créer des tirs sur JMeter simulant une charge données est d’utiliser les paramètres “Number of Threads” et “Ramp-up period” dans l&rsquo;objet “Thread Group”&nbsp;&nbsp;</p>



<p>Dans l’exemple ci dessous :</p>



<p><img decoding="async" src="https://lh5.googleusercontent.com/QbgnVRD_W9-NnDcVzy763VtKfRgtOb83ZA7g9qG_VifKW5VYDwq41TUSOnfzLRK0-a0ss498gAmxwpfN9vkbhpWRk18TQv878s4pMiUUsh90sPhwu0YApniEby2rdhlk_nj_sEiI" width="602" height="275"></p>



<p>les 30 threads seront atteint après une période de 20 minutes, pendant laquelle, JMeter va graduellement augmenter le nombre de threads pour passer de 1 à 30, puis il va continuer avec ce nombre de threads pendant 10 minutes, jusqu’à l’arrêt du test.</p>



<p>Le graphique du nombre de threads en fonction du temps est le suivant :</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/uK9jR8hX9NboPImyiOynbeKQUvBurOCfZmE2J-aeZkpQIFGia2GU4KICp2DKFK56UWfhbOXzrl47twBPWwoTrT6JvO3_r6PHMMRYIDhDu9mbaYjPSeeqDt0ll04jGk10Xc21Cqgi" alt=""/></figure>



<p>On peut remarquer que si la durée du “Ramp-up” fait les ⅔ de la durée totale, alors les surfaces A et B ci-dessous sont égales :</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/lfu_rEX2v8kyF8JEyG2eIPCVD4-lpqNhBwJcFpZd5fFlEOQJ1KiSHXlfOP_UaRPs2jhFqf8gAqkbPOVbzSlkS2cgtlEwKcaYl1AvLyTiiGjDOuM7lCQhCFuOUQgS980PWWx_L4QL" alt=""/></figure>



<p>Si le nombre de conversion réalisées par JMeter pendant toute la durée du tir vaut N, alors, le nombre de conversions effectuées pendant la période nominale, ici, les 10 dernières minutes, vaut la moitié, soit N/2.</p>



<p>On peut dire que le nombre de conversions à l’heure vaut N/2&#215;6, soit 3N conversions à l’heure.</p>



<p>Si les statistiques de la boutique indiquent un taux de conversion de 5%, alors, en ajoutant des scénarios sans conversion et en multipliant le nombre de threads par 20, on simulerait l’audience de la boutique.</p>



<p>Pour calculer l’audience équivalente au tir ci-dessus, on peut dire qu’on a 3Nx20 visiteurs à l’heure. Comme une session dans les usages du Web est comptabilisée après 30 minutes d’inactivité, on peut dire qu’on a un équivalent de 2x3Nx20 sessions simultanées.</p>



<p>Comment estimer le trafic quotidien et mensuel ?</p>



<p>La réponse dépend largement du type du site et des habitudes de fréquentation.</p>



<p>On peut se lancer dans un calcul à la louche, sachant qu’on obtient des ordres de grandeur et qu’il faut adapter le calcul en fonction des statistiques du site.</p>



<p>Si on estime que l’heure du pic d’affluence représente 20% du trafic de la journée, dans notre cas 3Nx20 visiteurs, pour la journée on en aurait 5 fois plus, soit Nx300 visites par jour.</p>



<p>Reste à extrapoler au mois. Si on considère que le jour le plus chargé représente 10% des visites du mois, on aurait Nx3000 visites par mois !</p>



<p>Si N vaut 100, notre tir produirait une charge équivalente à :</p>



<ul class="wp-block-list"><li>300 commandes à l’heure,</li><li>30 000 visites par jour,</li><li>300 000 visites par mois.</li></ul>
<p>L’article <a href="https://alain.arditi.fr/2022/04/02/test-de-charge-comment-extrapoler-le-nombre-de-visites/">Test de charge : Comment extrapoler le nombre de visites ?</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://alain.arditi.fr/2022/04/02/test-de-charge-comment-extrapoler-le-nombre-de-visites/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tests de charge : Un peu d’histoire</title>
		<link>https://alain.arditi.fr/2021/07/23/tests-de-charge-un-peu-dhistoire/</link>
					<comments>https://alain.arditi.fr/2021/07/23/tests-de-charge-un-peu-dhistoire/#respond</comments>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Fri, 23 Jul 2021 16:23:28 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[Test de Charge]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charge]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=1065</guid>

					<description><![CDATA[<p>Ou plutôt pourquoi je me suis remis à faire des tests…..<br />
En 1996, lorsque j’ai travaillé sur le premier site Web bancaire français, j'ai mis au point mon premier outil de test car il n’y avait aucun produit pour accomplir cette tâche....</p>
<p>L’article <a href="https://alain.arditi.fr/2021/07/23/tests-de-charge-un-peu-dhistoire/">Tests de charge : Un peu d’histoire</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Ou plutôt pourquoi je me suis remis à faire des tests…..</p>



<p>Il y a deux objectifs dans ma démarche :</p>



<ol class="wp-block-list"><li>améliorer les sites de nos clients. Les tests de charge permettent d’apprécier le comportement d’un site lors de fortes audiences et de détecter les éventuelles contentions.</li><li>développer la maîtrise du Web chez les développeurs. A travers la mise au point des scénarios, on apprend comment un navigateur dialogue avec un site Web. C’est une brique essentielle dans la fabrication des sites Web.</li></ol>



<h3 class="wp-block-heading">Un sujet récurrent depuis le début du Web</h3>



<p>On connaît tous l’importance des temps de réponse et les problématiques d&rsquo;audience des sites Web.</p>



<p>En 1996, lorsque j’ai travaillé sur le premier site Web bancaire français, j&rsquo;ai mis au point mon premier outil de test car il n’y avait aucun produit pour accomplir cette tâche. J’ai utilisé l’inoxydable Telnet pour simuler des connexions, des scénarios et des tests de charge !</p>



<p>A cette époque, Telnet sur HP-UX permettait d’injecter des requêtes HTTP avec un pipe.</p>



<p>Ca donnait des commandes de ce type :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">$ echo -n “GET / HTTP/1.0\n\n” | telnet tohero.fr 80
Trying 92.222.234.216...
Connected to tohero.fr.
Escape character is '^]'.
HTTP/1.1 301 Moved Permanently
Server: nginx/1.10.3 (Ubuntu)
Date: Mon, 12 Jul 2021 09:19:03 GMT
Content-Type: text/html
Content-Length: 194
Connection: close
Location: https://www.tohero.fr/actualites

&lt;html&gt;
&lt;head&gt;&lt;title&gt;301 Moved Permanently&lt;/title&gt;&lt;/head&gt;
&lt;body bgcolor="white"&gt;
&lt;center&gt;&lt;h1&gt;301 Moved Permanently&lt;/h1&gt;&lt;/center&gt;
&lt;hr&gt;&lt;center&gt;nginx/1.10.3 (Ubuntu)&lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;
Connection closed by foreign host.
$</pre></div>



<p>Grâce à la simplicité du protocole HTTP, ça devenait (plus ou moins) facile d’injecter des requêtes POST, de stocker des cookies et de jouer un scénario avec des Shell scripts. C’est ainsi que j’ai commencé les tests de charge sur le site que j’étais en train de construire.&nbsp; J’avais baptisé ce petit programme de tests “Gator”. On s’en servait également pour les tests systèmes, fonctionnels de bout en bout. On avait déjà un ancêtre de Sélénium pour les recettes.</p>



<p>Malheureusement, la grande majorité des “Telnet” ne supportaient pas le pipe. J’ai donc réécrit Gator en Perl, ce qui a donné naissance à gator.pl</p>



<p>Cette fois le script Perl était bien plus évolué et prenait en entrée des scénarios de test sous forme de fichiers.</p>



<p>Au début des années 2000, on n’envoyait pas beaucoup d’informations dans les headers et le JavaScript ne posait pas trop de problèmes. On était capable de créer nos tests sans sniffer le trafic Web, uniquement avec la connaissance des pages à tester.</p>



<p>Néanmoins, la mise au point de ce type de tests n’était&nbsp; possible que par les développeurs. Et les années passant, je me suis dit que les scripts Perl étaient trop compliqués à maintenir et je me suis tourné vers un produit. Comme à l’époque je programmais en Java et j’utilisais <a href="https://tomcat.apache.org/" target="_blank" rel="noreferrer noopener">Tomcat</a> comme serveur applicatif, je me suis naturellement tourné vers <a href="https://jakarta.apache.org/" target="_blank" rel="noreferrer noopener">Jakarta JMeter</a>, qui faisait partie de la même suite logicielle que Tomcat, pour faire les tests de charge.</p>



<h3 class="wp-block-heading">Les RFC</h3>



<p>L’intérêt de travailler sur la mise au point des scénarios de tests de charge est de comprendre le dialogue entre un client (navigateur) et un serveur Web. Ce dialogue a été formalisé pour la première fois dans un « Request For Comment », la <a href="https://datatracker.ietf.org/doc/rfc1945/" target="_blank" rel="noreferrer noopener">RFC 1945</a> écrite en partie par Tim Berners Lee qui détaille le protocole HTTP. Par la suite d&rsquo;autres RFC , comme la <a href="https://datatracker.ietf.org/doc/rfc2068/" target="_blank" rel="noreferrer noopener">RFC 2068</a> ont complété cette documentation au fur et à mesure que le protocole s&rsquo;est enrichi. Depuis, il y a eu bien d’autres RFC qui illustrent la complexité  du dialogue entre le client Web et le serveur.</p>



<p>Depuis quelques années, cette communication est au cœur de l’optimisation de l’expérience client. Tout le monde s&rsquo;y intéresse et des logiciels comme <a href="https://developers.google.com/speed/pagespeed/insights/?hl=fr">Google PageSpeed</a> qui font aujourd’hui le bonheur des agences digitales, décortiquent en détail cette communication. On parle ici des <strong>performances d’un site</strong>. </p>



<p>Les tests de charge supposent idéalement que le site est déjà performant. On constate en pratique qu’un site performant supporte mieux la charge qu’un site peu performant. Ça veut dire que les équipes qui ont travaillé sur le projet étaient déjà sensibles à la performance. </p>



<p>Pour autant les tests de charges vont permettre de trouver des optimisations liées aux pics d&rsquo;audience. C’est leur objectif premier, mais on peut trouver bien d’autres contentions ou imperfections avec ce type de tests !</p>
<p>L’article <a href="https://alain.arditi.fr/2021/07/23/tests-de-charge-un-peu-dhistoire/">Tests de charge : Un peu d’histoire</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://alain.arditi.fr/2021/07/23/tests-de-charge-un-peu-dhistoire/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress : Plugin de cache ou Varnish ?</title>
		<link>https://alain.arditi.fr/2021/03/07/wordpress-plugin-de-cache-ou-varnish/</link>
					<comments>https://alain.arditi.fr/2021/03/07/wordpress-plugin-de-cache-ou-varnish/#comments</comments>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Sun, 07 Mar 2021 21:58:03 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charge]]></category>
		<category><![CDATA[Varnish]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=994</guid>

					<description><![CDATA[<p>A la question : Faut-il un plugin de cache ou Varnish ? la réponse est : les 2 !</p>
<p>L’article <a href="https://alain.arditi.fr/2021/03/07/wordpress-plugin-de-cache-ou-varnish/">WordPress : Plugin de cache ou Varnish ?</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>On a vu dans une série d&rsquo;article précédents l&rsquo;apport de Varnish sur un site qui avait déjà un plugin de cache : <a href="https://alain.arditi.fr/2021/02/16/booster-son-wordpress-avec-varnish/">Booster son WordPress avec Varnish</a></p>



<p>L&rsquo;apport de Varnish est important, par contre, on ne voit pas ce qu&rsquo;apporte le plugin de cache WordPress. Effectivement, sur les pages statiques lorsque Varnish est installé, WordPress ne travaille plus. On verra néanmoins l&rsquo;intérêt du plugin en conclusion.</p>



<p>J&rsquo;ai utilisé le plugin WordPress de cache <a href="https://wordpress.org/plugins/wp-fastest-cache/" target="_blank" rel="noreferrer noopener">WP Fastest Cache</a> pour faire les tests, mais globalement tous les plugins de cache WordPress travaillent de la même manière. Ils créent la page sur le disque et WordPress, ou plutôt le serveur Web, Apache ou Nginx, renvoie directement la page depuis le disque. Il ne devrait pas y avoir beaucoup de différence entre les différents plugins de cache pour WordPress. Donc celui-ci ou un autre, ce n&rsquo;est pas la question dans cet article.</p>



<p>l&rsquo;infrastructure cible est une petite VM avec 1 vcpu et 500Mo de RAM sur VirtualBox de mon MacBook Air 2017. L&rsquo;injecteur JMeter est sur une autre VM de ma machine, les latences sont donc très faibles par rapports aux latences sur Internet.</p>



<p>On va tester un scénario de 7 pages statiques :</p>



<figure class="wp-block-table"><table><tbody><tr><td>1- /</td><td>La « Home page » pour démarrer. <br>Là, on initie une connexion HTTPS.</td></tr><tr><td>2 &#8211; /category/uncategorized/</td><td>Liste des articles sans catégorie.<br>Les 3 articles ci dessous !</td></tr><tr><td>3 &#8211; /2021/02/05/test-article/</td><td>Article qui pèse 4ko</td></tr><tr><td>4 &#8211; /2021/02/05/test-article-27/</td><td>Article qui pèse 4ko</td></tr><tr><td>5 &#8211; /2021/02/01/nouvel-article/</td><td>Article qui pèse 10Ko</td></tr><tr><td>6 &#8211; /author/aa2-1/</td><td>Liste des articles publiés par l&rsquo;auteur aa2</td></tr><tr><td>7 &#8211; /author/aa2-1/</td><td>idem</td></tr></tbody></table><figcaption>Scénario de test</figcaption></figure>



<p>Sur 3 configurations différentes </p>



<ol class="wp-block-list"><li>WordPress avec Varnish</li><li>WordPress sans Varnish et sans plugin</li><li>WordPress sans Varnish et avec le plugin WP Fastest Cache</li></ol>



<p>JMeter est configuré pour lancer 30 threads. Il passe de 1 à 30 en 5 minutes et reste 2 minutes à 30 threads, sans aucun délai entre les threads. Ce n&rsquo;est pas très réaliste, c&rsquo;est juste un test technique. On verra d&rsquo;ailleurs dans l&rsquo;analyse que le serveur est saturé bien avant d&rsquo;arriver au plateau des 30 threads dans les 3 cas.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/flotActiveThreadsOverTime.png"><img loading="lazy" decoding="async" width="895" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/03/flotActiveThreadsOverTime.png" alt="" class="wp-image-996" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/flotActiveThreadsOverTime.png 895w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotActiveThreadsOverTime-300x134.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotActiveThreadsOverTime-768x343.png 768w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Nombre de threads en fonction du temps pendant les 7 minutes du test</figcaption></figure>



<p> </p>



<h3 class="wp-block-heading">WordPress avec Varnish</h3>



<p>On retrouve les performances qu&rsquo;on avait déjà vues dans l&rsquo;article <a href="https://alain.arditi.fr/2021/02/12/booster-son-wordpress-avec-varnish-4-4/">Booster son WordPress avec Varnish 5/4</a>. Dans cette configuration, on arrive à produire plus de 30Mbps de flux depuis le serveur.</p>



<p>La connexion initiale lors de l&rsquo;accès à la « Home page » prend du temps. C&rsquo;est le temps de la création de la communication TCP/IP et la mise en place du SSL avec le serveur Nginx. Et au début de chaque threads, il y a une reconnection afin de simuler la réalité.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/flotLatenciesOverTime-1.png"><img loading="lazy" decoding="async" width="895" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/03/flotLatenciesOverTime-1.png" alt="" class="wp-image-997" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/flotLatenciesOverTime-1.png 895w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotLatenciesOverTime-1-300x134.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotLatenciesOverTime-1-768x343.png 768w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Graphe de latence</figcaption></figure>



<p>La latence ci-dessus est l&rsquo;équivalent du Time To First Byte (TTFB). On voit que les latences sont exceptionnelles basses sauf pour la « Home page » en violet. Quelque soit la page, Varnish la sort de la mémoire sans aucun traitement. Il n&rsquo;y a donc aucune différence entre les pages.</p>



<p>On va plutôt étudier les temps de réponse qui sont plus démonstratifs, sur les autres configurations.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-1.png"><img loading="lazy" decoding="async" width="895" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-1.png" alt="" class="wp-image-999" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-1.png 895w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-1-300x134.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-1-768x343.png 768w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Temps de réponse avec Varnish</figcaption></figure>



<p>Ici, on voit que les temps de réponse sont très similaires au TTFB, puisqu&rsquo;ensuite, s&rsquo;ajoute le temps de transfert de la page à l&rsquo;intérieur du MacBook !</p>



<h3 class="wp-block-heading">WordPress sans Varnish sans plugin de cache</h3>



<p>Par contre, avec la deuxième configuration, sans Varnish et sans plugin, les temps de réponse sont nettement plus élevés</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-2-1-1024x476.png"><img loading="lazy" decoding="async" width="1024" height="476" src="https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-2-1-1024x476.png" alt="" class="wp-image-1001" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-2-1-1024x476.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-2-1-300x139.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-2-1-768x357.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-2-1.png 1026w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-1.png"></a>Temps de réponse sans Varnish sans plugin</figcaption></figure>



<p>L&rsquo;échelle du graphe est 4 fois plus grande, on atteint la seconde. Et on note une différence entre les pages, cette fois-ci. La « Home » est en violet, mais dépassée par les catégories. En troisième c&rsquo;est la page « 5 &#8211; /2021/02/01/nouvel-article/ » qui est plus lourde que les autres, car elle a plus de contenu. Le temps de réponse est quasiment le même pour les autres pages.</p>



<h3 class="wp-block-heading">WordPress sans Varnish avec plugin de cache</h3>



<p>Avec la troisième configuration, sans Varnish mais avec le plugin WP Fastest Cache, les temps de réponse sont meilleurs que ceux de la configuration précédente :</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-3-1.png"><img loading="lazy" decoding="async" width="895" height="424" src="https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-3-1.png" alt="" class="wp-image-1005" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-3-1.png 895w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-3-1-300x142.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/flotResponseTimesOverTime-3-1-768x364.png 768w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Temps de réponse sans Varnish mais avec plugin</figcaption></figure>



<p>L&rsquo;échelle du graphique est divisé par 3 par rapport au précédent, on atteint les 350 ms.</p>



<p>Maintenant qu&rsquo;on a vu le détail des pages et les temps de réponse, on va pouvoir comparer les graphes de consommation de ressources du serveur.<br>Dans les graphes qui suivent, les 3 périodes correspondent aux 3 configurations dans l&rsquo;ordre suivant :</p>



<ol class="wp-block-list" id="block-c54e3c86-071b-468c-a495-582fbe0f7c87"><li>WordPress avec Varnish</li><li>WordPress sans Varnish et sans plugin</li><li>WordPress sans Varnish et avec le plugin WP Fastest Cache</li></ol>



<div class="wp-block-image"><figure class="aligncenter size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/cpu.png"><img loading="lazy" decoding="async" width="254" height="596" src="https://alain.arditi.fr/wp-content/uploads/2021/03/cpu.png" alt="" class="wp-image-1007" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/cpu.png 254w, https://alain.arditi.fr/wp-content/uploads/2021/03/cpu-128x300.png 128w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Consommation de CPU</figcaption></figure></div>



<p>La première période, celle « Avec Varnish » montre que la CPU est tout de même tout utilisée. <br>C&rsquo;est l&rsquo;effet HTTPS ! Toute la CPU est utilisée par Nginx pour la terminaison SSL. C&rsquo;est à se demander si on ne ferait pas mieux d&rsquo;abandonner le SSL pour les sites statiques afin diminuer la consommation énergétique du numérique !</p>



<p>Pour les deuxièmes et troisièmes périodes, on atteint les 100% d&rsquo;utilisation de la CPU. Dans ces 2 cas, on constate une contention de la CPU. Dans le premier cas, sans Varnish sans plugin, les 100% de CPU sont atteints de suite. Dans le cas sans Varnish mais avec plugin, les 100% sont atteints dans les 3 minutes. On note plus d&rsquo;activité système dans ce dernier cas. En effet, on va le confirmer sur les débits, avec le plugin de cache, le débit est beaucoup plus élevé, donc les entrées/sorties sont plus sollicitées.</p>



<p></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/if_enp0s3.png"><img loading="lazy" decoding="async" width="259" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/03/if_enp0s3.png" alt="" class="wp-image-1008" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/if_enp0s3.png 259w, https://alain.arditi.fr/wp-content/uploads/2021/03/if_enp0s3-155x300.png 155w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Débit en Mbps</figcaption></figure></div>



<p>On voit clairement avec ce graphe de débit, la capacité à fournir des pages lorsque Varnish fonctionne. La contention se situe au niveau du réseau avec Varnish. A 36Mbps, on est au maximum de ce que la VM peut produire. Pour les 2 autres configurations les débits sont beaucoup plus faibles, la contention se situe bien au niveau de la CPU.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/load.png"><img loading="lazy" decoding="async" width="287" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/03/load.png" alt="" class="wp-image-1009" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/load.png 287w, https://alain.arditi.fr/wp-content/uploads/2021/03/load-172x300.png 172w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Load average</figcaption></figure></div>



<p>Le graphe du Load average est l&rsquo;inverse de celui du débit ! On confirme la contention au niveau de la CPU.</p>



<p>Regardons les 2 graphes MySQL</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/mysql_queries.png"><img loading="lazy" decoding="async" width="251" height="572" src="https://alain.arditi.fr/wp-content/uploads/2021/03/mysql_queries.png" alt="" class="wp-image-1011" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/mysql_queries.png 251w, https://alain.arditi.fr/wp-content/uploads/2021/03/mysql_queries-132x300.png 132w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Nombre de requêtes MySQL</figcaption></figure></div>



<p>Là aussi, on confirme les données précédentes. Avec Varnish, il n&rsquo;y a pas de requêtes. Toutes les pages sont en RAM. Sans Varnish, WordPress récupère une partie de ses données depuis MySQL. Sans plugin, le site fait deux fois plus de requêtes.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/mysql_bytes.png"><img loading="lazy" decoding="async" width="232" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/03/mysql_bytes.png" alt="" class="wp-image-1012" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/mysql_bytes.png 232w, https://alain.arditi.fr/wp-content/uploads/2021/03/mysql_bytes-139x300.png 139w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Débit MySQL en Mbps</figcaption></figure></div>



<p>Avec le plugin de cache WordPress, le site fournit presque trois fois plus de pages, c&rsquo;est pour cette raison qu&rsquo;il y a plus de données extraites du MySQL et avec moins de requêtes. On suppose que les traitements sont optimisés pour extraire le maximum de données en un minimum de requêtes.</p>



<p>Le bilan en nombre de pages pour les 3 configurations avec le même scénario qui dure 7 minutes est le suivant :</p>



<ol class="wp-block-list" id="block-4df110cc-b43e-455f-9f65-3e19a581ca38"><li>WordPress avec Varnish : <br>190 000 pages <br>débit max de 500 pages/s</li><li>WordPress sans Varnish et sans plugin : <br>18 000 pages<br>débit max de 46 pages/s</li><li>WordPress sans Varnish et avec le plugin WP Fastest Cache : <br>56 000 pages<br>débit max de 150 pages/s</li></ol>



<p>Même si les graphes ne sont pas toujours parlants, ce bilan permet de remettre les résultats en perpective :</p>



<p>Avec Varnish le site WordPress produit 3 fois plus de pages (indépendamment du plugin de cache), que lorsque WordPress est configuré avec un plugin de cache.<br>Avec le plugin de cache le site produit 3 fois plus de pages que lorsque WordPress n&rsquo;a pas de plugin.<br>Il faut quand même noter qu&rsquo;il y a une saturation réseau avec Varnish et que sans SSL on pourrait améliorer les performances d&rsquo;un facteur au moins 2 !</p>



<p>Le bilan est clair. Les plugins de cache apportent une performance significative à WordPress. Il ne faut donc pas s&rsquo;en priver puisqu&rsquo;ils s&rsquo;installent de manière quasiment automatique. C&rsquo;est une optimisation facile à mettre en place chez les hébergeurs qui fournissent du WordPress clé en main. Pour passer à la vitesse supérieur, il faut ajouter Varnish.</p>



<p>Alors pourquoi ne pas installer Varnish et c&rsquo;est tout !</p>



<p>Parce que les plugins de cache optimisent l&rsquo;expérience utilisateur ! Nous n&rsquo;avons pas regardé ce qui se passe lorsqu&rsquo;on charge une page du point de vue utilisateur. Mais les optimisations comme la minification des CSS, du JavaScript ou l&rsquo;allègement des images sont essentielles pour le ressenti utilisateur ! Et c&rsquo;est un critère de poids pour les outils d&rsquo;analyse de sites.</p>



<p>Lors des tests de charges, nous n&rsquo;étudions pas ces aspects. Le bilan est clair, il faut Varnish ET un plugin de cache si on veut améliorer les performances de WordPress sous tous les aspects.</p>



<p>Donc à la question : WordPress : Plugin de cache ou Varnish ?<br>Je réponds : les 2 mon capitaine !</p>



<p>La dernière optimisation pour les performances c&rsquo;est l&rsquo;addition d&rsquo;un CDN. Le problème c&rsquo;est qu&rsquo;ils sont, soit payants, soit nécessitent de laisser la gestion du domaine, comme CloudFlare. Mais c&rsquo;est un « must have » pour les sites à forte audience internationale.</p>



<hr class="wp-block-separator"/>



<h3 class="wp-block-heading">Petite réflexion sur les tests menés ci-dessus. </h3>



<p>Dans les 3 configurations, on atteint les limites de la VM bien avant le plateau des 30 threads. On pourrait dire, il valait mieux aller à 20 threads ou moins selon la configuration, pour voir les graphes monter en fonction de la charge sans aller jusqu&rsquo;à la saturation. Alors effectivement, dans ce cas les graphes auraient été plus lisibles.</p>



<p>Mais en fait, tant que les scénarios ne font pas d&rsquo;erreur, et là, pour nos 3 scénarios, on a 0% d&rsquo;erreur, on peut ajouter de la charge et saturer le système, ce n&rsquo;est pas très grave. On atteint les limites plus vite. Et comme on cherche à comparer les limites des 3 configurations autant y aller !</p>



<p>Alors que se passe-t-il lorsqu&rsquo;on atteint une contention et que WordPress continue à répondre sans erreur ?</p>



<p>Et bien, il répond plus lentement ! C&rsquo;est comme un bouchon d&rsquo;automobilistes sur la route. On passe toujours le même nombre de voiture par tronçon, mais plus lentement. C&rsquo;est la raison de l&rsquo;augmentation des temps de réponse. Plus on ajoute de threads, plus les temps de réponses augmentent, le débit restant à peu près inchangé pendant tout le restant du test. <br>Le critère à retenir, c&rsquo;est vraiment <strong>le débit du site, ou le nombre de pages par seconde</strong>. On voit très bien pendant les tests de charge que cette valeur va se figer dès qu&rsquo;on atteint un certain nombre de threads, qu&rsquo;on mette des timers, qu&rsquo;on simule les utilisateurs ou pas, ce nombre ne varie pas. Ce nombre est la limite de l&rsquo;infrastructure.</p>



<p>Si on ajoute des threads, les pages arrivent plus lentement, car il y une contention, c&rsquo;est le phénomène « bouchon ». Si on continue à ajouter des threads, passé une autre limite on commence à voir des erreurs. A partir de ce point là, le test n&rsquo;est plus pertinent. </p>



<p>Les erreurs sont donc un point à surveiller lors des tests avec JMeter, et les <a href="https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-les-assertions/">assertions</a> sont la réponse à cette exigence !</p>



<hr class="wp-block-separator"/>



<p>Références :<br><a href="https://wordpress.org/" target="_blank" rel="noreferrer noopener">WordPress</a><br><a href="https://jmeter.apache.org/" target="_blank" rel="noreferrer noopener">JMeter</a><br><a href="https://varnish-cache.org/" target="_blank" rel="noreferrer noopener">Varnish</a><br><a href="https://wordpress.org/plugins/wp-fastest-cache/" target="_blank" rel="noreferrer noopener">WP Fastest Cache</a></p>



<p></p>
<p>L’article <a href="https://alain.arditi.fr/2021/03/07/wordpress-plugin-de-cache-ou-varnish/">WordPress : Plugin de cache ou Varnish ?</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://alain.arditi.fr/2021/03/07/wordpress-plugin-de-cache-ou-varnish/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Les tests de charge avec JMeter : les assertions</title>
		<link>https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-les-assertions/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Mon, 01 Mar 2021 15:27:06 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charge]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=885</guid>

					<description><![CDATA[<p>Les assertions dans JMeter permettent de s'assurer que les scénarios sont correctement exécutés</p>
<p>L’article <a href="https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-les-assertions/">Les tests de charge avec JMeter : les assertions</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>On l&rsquo;a vu dans les articles précédents, si on ne fournit pas les bons « nonces » à WordPress on peut faire le scénario avec des erreurs mais aussi avec des réponses ayant un retour HTTP 200 OK, mais dont le contenu n&rsquo;est pas celui qu&rsquo;on attend. On reçoit par exemple la page de login au lieu de la page de backoffice WordPress. Si on n&rsquo;y prête pas attention et qu&rsquo;on supprime les requêtes de « heartbeat » pour simplifier, on pourrait lancer des tests de charge qui ne produirait que des erreurs invisibles si on ne regarde pas le contenu de la réponse.</p>



<p>Pour ce faire, on va utiliser les assertions. On va chercher une chaîne de caractères pour vérifier qu&rsquo;on a bien créé un article.</p>



<p>On va simplement chercher le titre de l&rsquo;article. Comme il y a une variable dans le titre : l&rsquo;identifiant de l&rsquo;article, on est certain que si on retrouve ce titre c&rsquo;est bien l&rsquo;article qu&rsquo;on vient de créer !</p>



<p>On écrit le titre et le texte de l&rsquo;article dans la requête /wp-<code>json/wp/v2/posts/id_article?_locale=user</code>. Ici on a même mis l&rsquo;<code>id_article</code> dans le texte du titre.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-19.png"><img loading="lazy" decoding="async" width="1024" height="484" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-19-1024x484.png" alt="" class="wp-image-886" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-19-1024x484.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-19-300x142.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-19-768x363.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-19.png 1387w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Saisie de l&rsquo;article</figcaption></figure>



<p>On peut vérifier le titre de l&rsquo;article sur la page qui affiche l&rsquo;article : <code>/permalien/titre-du-nouvel-article/</code> et rechercher la chaîne de caractères : <br><code>&lt;h1 class="entry-title"&gt;Titre du nouvel article ${id_article}&lt;/h1&gt;</code></p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-22.png"><img loading="lazy" decoding="async" width="1024" height="484" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-22-1024x484.png" alt="" class="wp-image-889" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-22-1024x484.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-22-300x142.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-22-768x363.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-22.png 1387w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Paramètres de l&rsquo;assertion pour vérifier le titre de l&rsquo;article</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-21.png"><img loading="lazy" decoding="async" width="1024" height="484" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-21-1024x484.png" alt="" class="wp-image-888" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-21-1024x484.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-21-300x142.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-21-768x363.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-21.png 1387w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Résultat lorsque l&rsquo;assertion est fausse. La requête est en erreur !</figcaption></figure>



<p>La mise en place d&rsquo;assertions est une bonne pratique. Néanmoins, il ne faut pas en abuser, car l&rsquo;évolutivité de notre scénario et sa résistance au changement de version du site va se réduire.</p>



<p>Voici un rapide aperçu de la création de scénario. C&rsquo;est une des parties du test de charge, la suite consistant effectivement à lancer les scénarios pour étudier le comportement du site grace à la métrologie et à tous les indicateurs qui pourraient donner des indices.</p>



<hr class="wp-block-separator"/>



<p>Références :<br><a href="https://jmeter.apache.org/usermanual/test_plan.html#assertions" target="_blank" rel="noreferrer noopener nofollow">Les assertions dans JMeter</a></p>
<p>L’article <a href="https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-les-assertions/">Les tests de charge avec JMeter : les assertions</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les tests de charge avec JMeter : les fichiers de données</title>
		<link>https://alain.arditi.fr/2021/03/01/les-test-de-charge-avec-jmeter-les-fichiers-de-donnees/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Mon, 01 Mar 2021 10:53:43 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charge]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=839</guid>

					<description><![CDATA[<p>Les fichiers de données permettent d'injecter des données externes à un scénario. Comme les logins utilisateurs !</p>
<p>L’article <a href="https://alain.arditi.fr/2021/03/01/les-test-de-charge-avec-jmeter-les-fichiers-de-donnees/">Les tests de charge avec JMeter : les fichiers de données</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Lorsqu&rsquo;on crée des scénarios de tests de charge, il est intéressant de faire varier les logins utilisateurs pour ne pas avoir toujours le même utilisateur dans tous les threads. On peut ainsi détecter des problèmes de gestion de session lorsque la charge est élevée.</p>



<p>Mais pour le test d&rsquo;une boutique en ligne, c&rsquo;est également un moyen de ne pas toujours mettre les mêmes produits dans le panier.</p>



<p>Dans l&rsquo;article présent, je vais détailler comment définir plusieurs utilisateurs pour le scénario pour WordPress.</p>



<p>Il faut créer les utilisateurs dans WordPress en premier.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter-users-1.png"><img loading="lazy" decoding="async" width="1009" height="876" src="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter-users-1.png" alt="" class="wp-image-840" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter-users-1.png 1009w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter-users-1-300x260.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter-users-1-768x667.png 768w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Ecran de création d&rsquo;un utilisateur</figcaption></figure>



<p> Dans l&rsquo;écran de création des utilisateurs, l&#8217;email est obligatoire et il faut qu&rsquo;il soit différent pour chaque utilisateur. Il est possible d&rsquo;utiliser des alias d&#8217;email avec +. Ici alain+1@arditi.fr est un email différent de alain@arditi.fr pour WordPress, mais ils renvoient tous les deux sur la même boite. On pourrait mettre n&rsquo;importe quoi derrière le + : alain+testwordpress@arditi.fr . Cette fonctionnalité est fournie par les serveurs de mail et non pas par WordPress. Là, il ne faut pas oublier de copier les mots de passe qu&rsquo;on va utiliser par la suite.</p>



<p>Par ailleurs, on crée un fichier des utilisateurs : <code>users.csv</code> dans lequel on va déclarer les utilisateurs avec les mots de passe. Notre format utilise la virgule comme séparateur entre le login et le mot de passe. Attention, si le mot de passe contient une virgule, ça pose problème. Dans ce cas, on peut changer le séparateur pour mettre une tabulation si besoin :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">aa2@apollo:~$ cat users.csv
aa2-1,j5Bm4mLKmv$!Y!kX8h0lAxcS
aa2-2,o&amp;xoYmoG&amp;ElHdG8RJQ6tjNeM
aa2-3,GvCcybyebOWz#BF3St$yda7D
aa2-4,sncEXfUd5q1vEbr@ZqCGaKsI
aa2-5,S#JLq3kqgC2UE5o4tR#a7iIo
aa2@apollo:~$</pre></div>



<p>On déclare ce fichier et sa syntaxe. On déclare les 2 variables <code>LOGIN</code> et <code>PASSWORD</code> qui vont contenir les valeurs du fichier <code>users.csv</code>. </p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-2.png"><img loading="lazy" decoding="async" width="1024" height="641" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-2-1024x641.png" alt="" class="wp-image-841" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-2-1024x641.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-2-300x188.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-2-768x481.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-2.png 1271w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a></figure>



<p>Maintenant on peut utiliser les 2 variables <code>${LOGIN}</code> et <code>${PASSWORD}</code> dans la page d&rsquo;authentification </p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-3.png"><img loading="lazy" decoding="async" width="1024" height="641" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-3-1024x641.png" alt="" class="wp-image-842" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-3-1024x641.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-3-300x188.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-3-768x481.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-3.png 1271w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Page d&rsquo;authentification de WordPress avec les logins variables</figcaption></figure>



<p></p>
<p>L’article <a href="https://alain.arditi.fr/2021/03/01/les-test-de-charge-avec-jmeter-les-fichiers-de-donnees/">Les tests de charge avec JMeter : les fichiers de données</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les tests de charge avec JMeter : permaliens variables avec date</title>
		<link>https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-permaliens-variables-avec-date/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Mon, 01 Mar 2021 10:11:29 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charge]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=829</guid>

					<description><![CDATA[<p>Avec la variable prédéfinie ${__time} on peut créer des scénarios avec des permaliens variables !</p>
<p>L’article <a href="https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-permaliens-variables-avec-date/">Les tests de charge avec JMeter : permaliens variables avec date</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Le paramétrage de mon WordPress utilise des « permaliens » de la forme YYYY/MM/DD pour année/mois/jour pour identifier les articles par URL.</p>



<p>Lors d&rsquo;un test de charge, quand on crée le scénario le matin et qu&rsquo;on le lance l&rsquo;après-midi, tout va bien, car le permalien d&rsquo;un article créé dans la journée n&rsquo;a pas varié pour la partie date.</p>



<p>Lorsqu&rsquo;on rejoue le scénario le jour suivant, on a des erreurs car le permalien n&rsquo;est plus à jour. L&rsquo;URL de l&rsquo;article génère un « 404 Not found » !</p>



<p>Il faut donc utiliser la date du jour dans les scénarios pour avoir le bon lien.</p>



<p>On va utiliser la variable/fonction : <code>${__time(yyyy/MM/dd,)}</code> pour obtenir des permaliens variables sur la date.</p>



<p>Je cherche la chaîne « 2021/02/26 » dans le scénario avec les jumelles</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="570" height="302" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image.png" alt="" class="wp-image-831" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image.png 570w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-300x159.png 300w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /><figcaption>Recherche de la date</figcaption></figure>



<p>Je trouve 2 URLs qui utilisent cette date :</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-24.png"><img loading="lazy" decoding="async" width="1024" height="806" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-24-1024x806.png" alt="" class="wp-image-923" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-24-1024x806.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-24-300x236.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-24-768x605.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-24.png 1208w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Permalien avec la date 2021/02/26</figcaption></figure>



<p>L&rsquo;affichage de l&rsquo;article et l&rsquo;affichage de wp-admin qui contient cette date dans le Referer de la requête. Si le Referer n&rsquo;est pas correct, ça ne produit pas d&rsquo;erreur dans WordPress.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-25.png"><img loading="lazy" decoding="async" width="1024" height="564" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-25-1024x564.png" alt="" class="wp-image-928" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-25-1024x564.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-25-300x165.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-25-768x423.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-25.png 1208w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Mise en variable du permalien</figcaption></figure>



<p>Avec cette variable on peut rejouer le scénario à volonté indépendamment de la date.</p>



<p>Pour avoir le détail sur les fonctions et les variables prédéfinies dans JMeter voir la <a href="https://jmeter.apache.org/usermanual/functions.html" target="_blank" rel="noreferrer noopener nofollow">documentation sur les fonctions</a>.</p>
<p>L’article <a href="https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-permaliens-variables-avec-date/">Les tests de charge avec JMeter : permaliens variables avec date</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les tests de charge avec JMeter 5/5</title>
		<link>https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-5-4/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Mon, 01 Mar 2021 09:35:02 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charge]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=809</guid>

					<description><![CDATA[<p>Cette fois on s&#8217;intéresse à la mise à la corbeille d&#8217;un article. On a vu dans l&#8217;article précédent que l&#8217;URL de mise à la corbeille est de la forme : https://alain.arditi.fr/wp-admin/post.php?post=809&#38;action=trash&#38;_wpnonce=feaf2f87fd Ce lien contient l&#8217;identifiant de l&#8217;article, ici 809 et un nonce qui vient de la page qui affiche les articles https://alain.arditi.fr/wp-admin/edit.php Nous allons extraire&#8230; </p>
<div class="more-link-container"><a class="more-link" href="https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-5-4/">Poursuivre la lecture <span class="screen-reader-text">Les tests de charge avec JMeter 5/5</span></a></div>
<p>L’article <a href="https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-5-4/">Les tests de charge avec JMeter 5/5</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Cette fois on s&rsquo;intéresse à la mise à la corbeille d&rsquo;un article. On a vu dans l&rsquo;article précédent que l&rsquo;URL de mise à la corbeille est de la forme :</p>



<p><a href="https://alain.arditi.fr/wp-admin/post.php?post=809&amp;action=trash&amp;_wpnonce=feaf2f87fd">https://alain.arditi.fr/wp-admin/post.php?post=809&amp;action=trash&amp;_wpnonce=feaf2f87fd</a></p>



<p>Ce lien contient l&rsquo;identifiant de l&rsquo;article, ici 809 et un nonce qui vient de la page qui affiche les articles https://alain.arditi.fr/wp-admin/edit.php</p>



<p>Nous allons extraire le nonce depuis la page 482 &#8211; /wp-admin/edit.php de notre scénario en passant par un BeanShell PostProcessor qui permet de rajouter l&rsquo;id_article dans l&rsquo;expression régulière. </p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-2.png"><img loading="lazy" decoding="async" width="1024" height="692" src="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-2-1024x692.png" alt="" class="wp-image-812" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-2-1024x692.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-2-300x203.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-2-768x519.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-2.png 1208w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>BeanShell PostProcessor</figcaption></figure>



<p>On construit une variable s qui contient l&rsquo;expression régulière qu&rsquo;on va passer dans RegPhrase qui sera utilisée dans le « Regular Expression Extractor » :</p>



<p><code>String s = "post=${id_article}&amp;action=trash&amp;_wpnonce=([^\"]+)\"";<br>vars.put("RegPhrase",s);</code></p>



<p>Notez qu&rsquo;il faut protéger les <code>"</code> qui font partie de l&rsquo;expression régulière avec un <code>\</code>  : <code>([^\"]+)\"</code></p>



<p>Dans le « Regular Expression Extractor » on retrouve cette fois la variable RegPhrase qui contient notre expression régulière variable</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-3.png"><img loading="lazy" decoding="async" width="1024" height="692" src="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-3-1024x692.png" alt="" class="wp-image-814" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-3-1024x692.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-3-300x203.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-3-768x519.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-3.png 1208w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Récupération du trash_nonce</figcaption></figure>



<p>Maintenant qu&rsquo;on a le « nonce » pour supprimer l&rsquo;article, on peut l&rsquo;utiliser dans la page de suppression</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-4.png"><img loading="lazy" decoding="async" width="1024" height="692" src="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-4-1024x692.png" alt="" class="wp-image-815" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-4-1024x692.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-4-300x203.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-4-768x519.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_corbeille-4.png 1208w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>URL de suppression d&rsquo;un article</figcaption></figure>



<p>Afin de finaliser un scénario complet avec le vidage de la corbeille et le logout, voici les différents « nonces » à extraire et leur utilisation</p>



<h3 class="wp-block-heading">Nonce pour la santé du site</h3>



<p>Ce « nonce » est utilisé dans les requêtes Ajax qui permettent d&rsquo;avoir l&rsquo;état de santé du site : le health check site status.<br>Il est posé sur la page de login <code>/wp-login.php</code>, une fois qu&rsquo;on est authentifié et il est utilisé dans les requêtes de la forme <code>/wp_admin/admin-ajax.php</code> pour avoir l&rsquo;état de santé du site.</p>



<p>L&rsquo;expression régulière pour l&rsquo;extraire est : <br><code>"site_status_result":"([^"]+)"</code></p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-1.png"><img loading="lazy" decoding="async" width="1024" height="998" src="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-1-1024x998.png" alt="" class="wp-image-853" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-1-1024x998.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-1-300x292.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-1-768x748.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-1.png 1203w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Expression régulière et URLs en rouge qui utilisent le « nonce »</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-2.png"><img loading="lazy" decoding="async" width="1024" height="998" src="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-2-1024x998.png" alt="" class="wp-image-854" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-2-1024x998.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-2-300x292.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-2-768x748.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/JMeter_nonce_health_check-2.png 1203w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Utilisation du « nonce » dans les URLs /wp-admin/admin_ajax.php</figcaption></figure>



<h3 class="wp-block-heading">Nonce pour le battement de coeur</h3>



<p>C&rsquo;est le « nonce » qui permet de vérifier la légitimité de nos actions sur les articles de WordPress. Il est posé dans la page qui affiche tous les articles <code>/wp-admin/edit.php</code> et il est utilisé dans les requêtes de la forme <code>/wp_admin/admin-ajax.php</code>. Si le « nonce » n&rsquo;est pas correct, WordPress considère qu&rsquo;on n&rsquo;est plus authentifié et renvoie des codes « 403 Forbidden » sur les requêtes Ajax. Sur les autres pages on reçoit un code 200, mais c&rsquo;est la page de login qui s&rsquo;affiche. D&rsquo;où l&rsquo;intérêt d&rsquo;ajouter des assertions qui vérifient que les réponses à nos requêtes sont bien celles qu&rsquo;on attend.</p>



<p>L&rsquo;expression régulière pour l&rsquo;extraire est : <br><code>{"nonce":"([^"]+)"}</code></p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-4.png"><img loading="lazy" decoding="async" width="1024" height="1001" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-4-1024x1001.png" alt="" class="wp-image-855" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-4-1024x1001.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-4-300x293.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-4-768x751.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-4.png 1203w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Expression régulière et URLs en rouge qui utilisent le « nonce »</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-5.png"><img loading="lazy" decoding="async" width="1024" height="1001" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-5-1024x1001.png" alt="" class="wp-image-857" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-5-1024x1001.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-5-300x293.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-5-768x751.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-5.png 1203w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Utilisation du « nonce » heartbeat dans les URLs /wp-admin/admin_ajax.php</figcaption></figure>



<h3 class="wp-block-heading">Nonce de création d&rsquo;un article</h3>



<p>Ce « nonce » est généré lorsqu&rsquo;on crée un article, sur l&rsquo;URL <code>/wp-admin/post-new.php</code>, et il est utilisé dans toutes les requêtes qui suivent la création jusqu&rsquo;à la publication de l&rsquo;article.</p>



<p>L&rsquo;expression régulière pour l&rsquo;extraire est : <code>wp.apiFetch.createNonceMiddleware\( "([^"]+)" \)</code></p>



<figure class="wp-block-image size-large is-resized"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-11.png"><img loading="lazy" decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-11-1024x542.png" alt="" class="wp-image-865" width="610" height="322" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-11-1024x542.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-11-300x159.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-11-768x406.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-11.png 1240w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Expression régulière et URLs en rouge qui utilisent le « nonce »</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-12.png"><img loading="lazy" decoding="async" width="1024" height="542" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-12-1024x542.png" alt="" class="wp-image-866" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-12-1024x542.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-12-300x159.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-12-768x406.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-12.png 1240w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Utilisation du « nonce » dans l&rsquo;entête des requêtes d&rsquo;édition de l&rsquo;article</figcaption></figure>



<h3 class="wp-block-heading">Nonce de déverrouillage de l&rsquo;article</h3>



<p>Ce « nonce » est généré lorsqu&rsquo;on crée un article, sur l&rsquo;URL <code>/wp-admin/post-new.php</code>, et il est utilisé lorsqu&rsquo;on publie l&rsquo;article sur une URL <code>/wp_admin/admin-ajax.php</code></p>



<p>L&rsquo;expression régulière pour l&rsquo;extraire est : <br><code>"unlockNonce":"([^"]+)"</code></p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-13.png"><img loading="lazy" decoding="async" width="1024" height="542" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-13-1024x542.png" alt="" class="wp-image-868" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-13-1024x542.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-13-300x159.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-13-768x406.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-13.png 1240w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Expression régulière et URL en rouge qui utilise le « nonce »</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-14.png"><img loading="lazy" decoding="async" width="1024" height="542" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-14-1024x542.png" alt="" class="wp-image-869" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-14-1024x542.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-14-300x159.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-14-768x406.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-14.png 1240w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Utilisation du nonce de déverrouillage avec l&rsquo;identifiant de l&rsquo;article</figcaption></figure>



<p>Dans la requête précédente, on voit qu&rsquo;on passe un paramètre active_post_lock qui vaut <code>1614277890:1</code>. Cette valeur est le timestamp de création de l&rsquo;article au format Epoch suivi de l&rsquo;identifiant de l&rsquo;utilisateur. Pour afficher le timestamp au format date, il faut lancer la commande suivante dans un Shell :</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">aa2@apollo:~$ date -r 1614277890
Thu Feb 25 19:31:30 CET 2021
aa2@apollo:~$</pre></div>



<p>La variable prédéfinie ${__time(/1000,)} fournit le timestamp à la seconde.</p>



<h3 class="wp-block-heading">Nonce de vidage de la corbeille</h3>



<p>On récupère ce « nonce » dans la page <code>/wp-admin/edit.php</code> et on l&rsquo;utilise dans la même page <code>/wp_admin/edit.php</code> mais avec l&rsquo;action « Vider la corbeille ». </p>



<p>L&rsquo;expression régulière pour l&rsquo;extraire est :<br><code>&lt;input type="hidden" id="_wpnonce" name="_wpnonce" value="([^"]+)" /&gt;</code></p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-15.png"><img loading="lazy" decoding="async" width="1024" height="514" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-15-1024x514.png" alt="" class="wp-image-871" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-15-1024x514.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-15-300x151.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-15-768x386.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-15.png 1306w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Extraction du « nonce » de vidage de la corbeille</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-16.png"><img loading="lazy" decoding="async" width="1024" height="514" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-16-1024x514.png" alt="" class="wp-image-872" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-16-1024x514.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-16-300x151.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-16-768x386.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-16.png 1306w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Utilisation du « nonce » de vidage de la corbeille</figcaption></figure>



<h3 class="wp-block-heading">Nonce de déconnexion</h3>



<p>C&rsquo;est le nonce qu&rsquo;il faut fournir pour terminer sa session proprement. On le récupère sur la page <code>/wp-admin/edit.php</code> et on l&rsquo;utilise sur <code>/wp-admin/login.php</code></p>



<p>L&rsquo;expression régulière pour l&rsquo;extraire est :<br><code>action=logout&amp;_wpnonce=([^']+)'&gt;Se</code></p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-17.png"><img loading="lazy" decoding="async" width="1024" height="514" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-17-1024x514.png" alt="" class="wp-image-874" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-17-1024x514.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-17-300x151.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-17-768x386.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-17.png 1306w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Extraction du « nonce » de déconnexion</figcaption></figure>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/03/image-18.png"><img loading="lazy" decoding="async" width="1024" height="514" src="https://alain.arditi.fr/wp-content/uploads/2021/03/image-18-1024x514.png" alt="" class="wp-image-875" srcset="https://alain.arditi.fr/wp-content/uploads/2021/03/image-18-1024x514.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-18-300x151.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-18-768x386.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/03/image-18.png 1306w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Utilisation du « nonce » de déconnexion</figcaption></figure>



<p></p>



<p>En plus des « nonces » ci dessus, on avait déjà extrait l&rsquo;identifiant de l&rsquo;article dans l&rsquo;article précédent : <a href="https://alain.arditi.fr/2021/02/26/les-tests-de-charge-avec-jmeter-4-4/" data-type="post" data-id="584">Les tests de charge avec JMeter 4/4</a>. Ce qui fait au total 8 « nonces » ou variables pour un scénario qui est très simple. Ce scénario n&rsquo;a pas d&rsquo;intérêt en soi, il permet d&rsquo;illustrer la création de scénarios sur des pages dynamiques. WordPress est un bon exemple car on voit ici que le scénario nécessite pas mal de travail pour fonctionner parfaitement.</p>



<p>Un point à noter, c&rsquo;est la dépendance du scénario avec le site à tester. Dans le cas de ce WordPress, on a des URLs qui dépendent de certains plugins. L&rsquo;URL <code>/wp-json/contact-form-7/v1/contact-forms</code> se retrouve dans le scénario car il y a le plugin Contact Form 7, même si on ne l&rsquo;utilise pas.</p>



<p>Dans les expressions régulières on est parfois contraint par la locale du site. Si on a plusieurs locales, il faut trouver des expressions régulières indépendantes de la locale.</p>



<p>Tout ceci montre la relative fragilité des scénarios. Il est possible qu&rsquo;avec une nouvelle version de WordPress le scénario actuel ne fonctionne plus. Pareil si j&rsquo;ajoute des plugins, ou que je change de langue.</p>



<p>Le bilan est que maintenir un scénario dans la durée est compliqué et nécessite un investissement constant sans quoi si on s&rsquo;y remet une fois par an on repart de zéro à chaque fois !</p>



<p> </p>
<p>L’article <a href="https://alain.arditi.fr/2021/03/01/les-tests-de-charge-avec-jmeter-5-4/">Les tests de charge avec JMeter 5/5</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les tests de charge avec JMeter 4/5</title>
		<link>https://alain.arditi.fr/2021/02/26/les-tests-de-charge-avec-jmeter-4-4/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Fri, 26 Feb 2021 21:35:14 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charge]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=584</guid>

					<description><![CDATA[<p>Scénario JMeter avec création d'un article et mise en variable de l'id_article</p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/26/les-tests-de-charge-avec-jmeter-4-4/">Les tests de charge avec JMeter 4/5</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Maintenant qu&rsquo;on a réussi à se connecter sur le site WordPress, on va continuer à enrichir le scénario pour créer un article. On va d&rsquo;abord afficher le tableau de bord du backoffice de WordPress, puis la liste des articles. A partir de cette page on va cliquer sur le bouton Ajouter pour créer un nouvel article</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="695" height="370" src="https://alain.arditi.fr/wp-content/uploads/2021/02/WordPress-ajouter_article.png" alt="" class="wp-image-585" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/WordPress-ajouter_article.png 695w, https://alain.arditi.fr/wp-content/uploads/2021/02/WordPress-ajouter_article-300x160.png 300w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /><figcaption>Backoffice WordPress, bouton Ajouter un article en rouge</figcaption></figure>



<p>Ensuite on saisit un titre et un texte dans le contenu, puis, on clique sur le bouton « Publier ».</p>



<p>Ensuite, on retourne sur la page qui affiche tous les articles et on le supprime en cliquant sur le lien <span style="color:#ff0000" class="has-inline-color">Corbeille</span> qui apparaît sous l&rsquo;article lorsqu&rsquo;on passe la souris sur l&rsquo;article.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_corbeille-1.png"><img loading="lazy" decoding="async" width="1024" height="643" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_corbeille-1-1024x643.png" alt="" class="wp-image-782" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_corbeille-1-1024x643.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_corbeille-1-300x188.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_corbeille-1-768x482.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_corbeille-1.png 1362w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>On voit le « nonce » dans l&rsquo;URL de mise à la corbeille</figcaption></figure>



<p>On arrête l&rsquo;enregistrement du scénario à cette étape, on reprendra ensuite pour vider la corbeille et se déconnecter.</p>



<p>Par contre, il faut absolument conserver les éléments du « View Result Tree » lors de l&rsquo;enregistrement, car c&rsquo;est par les données de l&rsquo;enregistrement qu&rsquo;on va pouvoir retrouver les « nonces » à passer dans les requêtes. En effet, on va vite s&rsquo;apercevoir qu&rsquo;une page comme celle qui affiche tous les article wp-admin/edit.php va produire plusieurs « nonces » par article affiché, ne serait que celui pour le modifier et celui pour le supprimer. Mais si vous avez des plugins, comme un gestionnaire de cache, il va également ajouter un « nonce » par page, pour purger le cache. </p>



<p>La technique qui va nous permettre de savoir quel « nonce » est utilisé à quel moment, est la suivante :</p>



<h3 class="wp-block-heading">1 &#8211; Sauvegarder le résultat de l&rsquo;enregistrement dans un fichier</h3>



<p>Là on parle d&rsquo;enregistrer le « View Result Tree » du « Test Script Recorder ». il faut fournir un fichier pour que le Script Recorder stocke les résultats. Par défaut, tout ce qui est nécessaire est coché dans la configuration</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter-View_Result_Tree_Recording.png"><img loading="lazy" decoding="async" width="1024" height="560" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter-View_Result_Tree_Recording-1024x560.png" alt="" class="wp-image-768" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter-View_Result_Tree_Recording-1024x560.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter-View_Result_Tree_Recording-300x164.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter-View_Result_Tree_Recording-768x420.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter-View_Result_Tree_Recording.png 1444w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Configuration de l&rsquo;enregistrement du fichier du « Test Script Recorder »</figcaption></figure>



<h3 class="wp-block-heading">2 &#8211; Enregistrer une partie du scénario</h3>



<p>J&rsquo;écris « une partie », car enregistrer un scénario complet, même simple, comme par exemple pour WordPress, se connecter, afficher les articles, créer un article, saisir du texte, publier l&rsquo;article, supprimer l&rsquo;article, vider la corbeille et enfin se déconnecter, va produire plus d&rsquo;une cinquantaine de requêtes, car il y a de l&rsquo;Ajax qui entre en jeu.</p>



<p>On se retrouve assez vite noyé avec le décalage entre les actions et les requêtes. Donc procéder par étape allège un peu le travail. C&rsquo;est la raison pour laquelle on a commencé par l&rsquo;étape où on se connecte à WordPress. Maintenant on va regarder la suite : afficher les articles, créer un article, le publier et le mettre à la corbeille.</p>



<p>On va enrichir notre scénario du login. On définit le « Counter start value » à 120 afin d&rsquo;avoir une suite de numéros croissants pour identifier les URLs du Thread Plan.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-1.png"><img loading="lazy" decoding="async" width="1024" height="598" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-1-1024x598.png" alt="" class="wp-image-784" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-1-1024x598.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-1-300x175.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-1-768x449.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-1.png 1491w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a></figure>



<p>On démarre le scénario en se connectant, mais sans lancer l&rsquo;enregistrement, qu&rsquo;on va démarrer à l&rsquo;affichage de la page « Tous les articles ». C&rsquo;est à dire qu&rsquo;on démarre l&rsquo;enregistrement, on définit le proxy dans le navigateur et on affiche l&rsquo;URL /wp-admin/edit.php</p>



<p>On crée l&rsquo;article, on le publie et on le met à la corbeille.</p>



<p>A la fin de l&rsquo;enregistrement, on voit une vingtaine d&rsquo;URLs supplémentaires dans le Thread Plan</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-2.png"><img loading="lazy" decoding="async" width="1024" height="629" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-2-1024x629.png" alt="" class="wp-image-791" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-2-1024x629.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-2-300x184.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-2-768x472.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-2.png 1438w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Scénario avec la création/suppression de l&rsquo;article 788</figcaption></figure>



<p>On peut noter que dans deux des URLs, la 146 et la 151, l&rsquo;identifiant 788 de l&rsquo;article apparaît. Il va falloir rendre cette valeur variable pour suivre la valeur de cet incrément. </p>



<h3 class="wp-block-heading">3 &#8211; Lancer le scénario et faire l&rsquo;état des lieux</h3>



<p>Si on rejoue le scénario sans faire de retouche, on va constater les erreurs dans l&rsquo;item « View Result Tree » du Thread Plan. Toutes les pages en rouges ont reçu des 403 Forbidden, et la page 153 wp-admin/edit.php affiche l&rsquo;article créé.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-3.png"><img loading="lazy" decoding="async" width="1024" height="651" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-3-1024x651.png" alt="" class="wp-image-793" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-3-1024x651.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-3-300x191.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-3-768x488.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-3.png 1438w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Les erreurs du « View Result Tree » du « Thread Plan »</figcaption></figure>



<p>Les erreurs de permission sont liées aux « nonces ». On a renvoyé les valeurs enregistrées précédemment au lieu des aléas  fournis par WordPress.</p>



<p>A partir de cette étape, il suffit d&rsquo;éliminer les erreurs une par une !!</p>



<h3 class="wp-block-heading">4 &#8211; Mettre l&rsquo;identifiant de l&rsquo;article en variable</h3>



<p>On a vu que notre enregistrement a créé l&rsquo;article n°788. Il faut chercher cette valeur dans la réponse (Response Body) de la création d&rsquo;article : post-new.php. On trouve de nombreuses références à l&rsquo;article 788, mais la plus simple à extraire, donc celle qui est la plus discriminante se trouve dans le bloc :</p>



<p><code>&lt;script id='wp-editor-js-before'&gt; var _wpMetaBoxUrl = "https:\/\/alain.arditi.fr\/wp-admin\/post.php?post=<span style="color:#ff0000" class="has-inline-color">788</span>&amp;action=edit&amp;meta-box-loader=1&amp;meta-box-loader-nonce=fc2b874bfc"; &lt;/script&gt;</code></p>



<p>qu&rsquo;on voit sur le panneau de droite lorsqu&rsquo;on fait la recherche de 788</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-4.png"><img loading="lazy" decoding="async" width="1024" height="651" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-4-1024x651.png" alt="" class="wp-image-795" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-4-1024x651.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-4-300x191.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-4-768x488.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-4.png 1438w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Recherche des URLs contenant l&rsquo;id de l&rsquo;article 788</figcaption></figure>



<p>L&rsquo;expression régulière pour extraire l&rsquo;id_article, va être :<br><code>post.php\?post=([^&amp;]+)&amp;</code><br>A noter le \ devant le ? car sinon, le ? génère une expression régulière et produit une erreur. On peut désormais utiliser la variable <code>${id_article}</code> partout où apparaît 788 dans le scénario.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-5.png"><img loading="lazy" decoding="async" width="1024" height="651" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-5-1024x651.png" alt="" class="wp-image-796" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-5-1024x651.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-5-300x191.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-5-768x488.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-5.png 1438w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Extraction de l&rsquo;id_article</figcaption></figure>



<p>On lance la recherche de 788 avec les jumelles <img loading="lazy" decoding="async" width="35" height="35" class="wp-image-497" style="width: 35px;" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_bouton_jumelles.png" alt="JMeter bouton jumelles"> on voit sur le panneau de gauche les URLs qui contiennent ce numéro. On peut même faire un Search/Replace de 788 par <code>${id_article}</code> en faisant attention aux valeurs qu&rsquo;on remplace.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-6.png"><img loading="lazy" decoding="async" width="1024" height="651" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-6-1024x651.png" alt="" class="wp-image-797" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-6-1024x651.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-6-300x191.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-6-768x488.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-6.png 1438w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Recherche de l&rsquo;id_article 788 dans les URLs</figcaption></figure>



<p>Dans le cas de l&rsquo;URL 151 &#8211; /wp-json/wp/v2/posts/788?_locale=user on remplace le 788 dans l&rsquo;URLs par ${id_article}, mais aussi dans le texte de l&rsquo;article, comme ça chaque article créé par le scénario aura un titre différent.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-7.png"><img loading="lazy" decoding="async" width="1024" height="651" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-7-1024x651.png" alt="" class="wp-image-799" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-7-1024x651.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-7-300x191.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-7-768x488.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_article-7.png 1438w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Ajout de la variable ${id_article} dans le titre</figcaption></figure>



<p>Voila un exemple de correction des problèmes liés à l&rsquo;id_article.</p>



<p>Pour que le scénario fonctionne, il reste encore une dizaine de valeurs en dur, surtout des « nonces » à extraire et à mettre en variable. Afin d&rsquo;alléger l&rsquo;article, on va uniquement voir comment trouver le « nonce » pour mettre l&rsquo;article à la corbeille. C&rsquo;est le cas le plus complexe, car la mise à la corbeille est une URL qui contient l&rsquo;id_article, donc une expression régulière variable ! Elle est de la forme : <code>post=${id_article}&amp;action=trash&amp;_wpnonce=([^"]+)"</code></p>



<p>On va explorer comment faire une expression régulière pour extraire le nonce avec la variable id_article dans l&rsquo;expression.</p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/26/les-tests-de-charge-avec-jmeter-4-4/">Les tests de charge avec JMeter 4/5</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les tests de charge avec JMeter 3/5</title>
		<link>https://alain.arditi.fr/2021/02/22/les-tests-de-charge-avec-jmeter-3-4/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Mon, 22 Feb 2021 17:19:58 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charge]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=509</guid>

					<description><![CDATA[<p>La mise au point de scénarios sur des pages dynamiques est beaucoup plus complexe que sur les pages statiques. En effet, il faut fournir des données dans les formulaires, qui sont parfois variables, et avec des aléas comme les « nonces » pour que le serveur accepte nos requêtes. WordPress est un bon exemple de serveur qui&#8230; </p>
<div class="more-link-container"><a class="more-link" href="https://alain.arditi.fr/2021/02/22/les-tests-de-charge-avec-jmeter-3-4/">Poursuivre la lecture <span class="screen-reader-text">Les tests de charge avec JMeter 3/5</span></a></div>
<p>L’article <a href="https://alain.arditi.fr/2021/02/22/les-tests-de-charge-avec-jmeter-3-4/">Les tests de charge avec JMeter 3/5</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>La mise au point de scénarios sur des pages dynamiques est beaucoup plus complexe que sur les pages statiques. En effet, il faut fournir des données dans les formulaires, qui sont parfois variables, et avec des aléas comme les « nonces » pour que le serveur accepte nos requêtes.</p>



<p>WordPress est un bon exemple de serveur qui utilise des « nonces » pour contrôler la légitimité des requêtes.</p>



<p>Lorsque vous affichez un formulaire, comme la page des Articles, WordPress place des champs cachés contenant des nombre aléatoires, les « nonces », qu&rsquo;il faut obligatoirement fournir lorsqu&rsquo;on envoie, on poste, les champs du formulaire sans quoi, on reçoit un message « Forbidden 403 » qui indique de WordPress refuse notre requête.</p>



<p>Il faut donc passer obligatoirement par l&rsquo;affichage des formulaires avant de lancer une requête avec les données du formulaire afin de récupérer le bon « nonce ». Et des fois, on s&rsquo;aperçoit que le « nonce » a été fourni quelques pages auparavant et pas juste dans la requête précédente !</p>



<p>Il faut démarrer le scénario en se connectant sur le backoffice WordPress avec des identifiants. Ce sera la première partie du scénario.</p>



<p>Pour démarrer, on va enregistrer le login sur le backoffice avec le Recorder, comme on l&rsquo;a fait pour les pages statiques dans l&rsquo;article <a href="https://alain.arditi.fr/2021/02/22/les-tests-de-charge-avec-jmeter/" data-type="post">Les tests de charge avec JMeter</a> </p>



<p>On arrête l&rsquo;enregistrement dès qu&rsquo;on est loggé. On peut rejouer le scénario et voici de qu&rsquo;on obtient :</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-1.png"><img loading="lazy" decoding="async" width="1024" height="508" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-1-1024x508.png" alt="" class="wp-image-511" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-1-1024x508.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-1-300x149.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-1-768x381.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-1.png 1362w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Scénario de login sur WordPress</figcaption></figure>



<p>On constate qu&rsquo;on a plus d&rsquo;une dizaine d&rsquo;URL rien que pour le login !<br>On a également deux erreurs sur les URL Ajax lorsqu&rsquo;on rejoue le scénario. Mais pour le login, ça fonctionne. Si on regarde de plus près ce qu&rsquo;on envoie sur le formulaire de login :</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-2.png"><img loading="lazy" decoding="async" width="1024" height="508" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-2-1024x508.png" alt="" class="wp-image-512" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-2-1024x508.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-2-300x149.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-2-768x381.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-2.png 1362w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Formulaire de login WordPress</figcaption></figure>



<p>On voit que le login et le mot de passe sont effectivement transmis sur le formulaire. On note que l&rsquo;URL contient deux variables ${scheme}://${host}/wp-admin</p>



<p>Ces variables sont déclarées dans l&rsquo;item « User Defined Variables » et sont utilisé par la suite par JMeter. Ces variables permettent par exemple de lancer le même scénario sur un serveur en HTTP et en HTTPS ou sur un port comme le 6081 pour avoir directement Varnish ou 8080 pour avoir directement Apache. On pourra ainsi comparer les performances selon l&rsquo;architecture</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_variables.png"><img loading="lazy" decoding="async" width="1024" height="638" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_variables-1024x638.png" alt="" class="wp-image-514" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_variables-1024x638.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_variables-300x187.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_variables-768x479.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_variables.png 1089w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Variables dans JMeter</figcaption></figure>



<p>Maintenant si on s&rsquo;intéresse aux erreurs sur les requêtes Ajax, on voit le code de retour « 403 Forbidden »</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-1.png"><img loading="lazy" decoding="async" width="1024" height="638" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-1-1024x638.png" alt="" class="wp-image-519" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-1-1024x638.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-1-300x187.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-1-768x479.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-1.png 1089w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">L&rsquo;URL Ajax a reçu un code 403 Forbidden</figcaption></figure>



<p>Si on regarde les données de la requête POST, on voit un « _wpnonce »</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-2.png"><img loading="lazy" decoding="async" width="1024" height="638" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-2-1024x638.png" alt="" class="wp-image-520" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-2-1024x638.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-2-300x187.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-2-768x479.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-2.png 1089w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Nonce dans la requête POST Ajax</figcaption></figure>



<p>On retrouve ce « nonce » dans notre scénario</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-3.png"><img loading="lazy" decoding="async" width="1024" height="638" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-3-1024x638.png" alt="" class="wp-image-522" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-3-1024x638.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-3-300x187.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-3-768x479.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-3.png 1089w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Nonce dans le scénario</figcaption></figure>



<p>Comme ce « nonce » a une valeur fixe dans notre scénario et que WordPress génère des valeurs aléatoires à chaque login, cette requête Ajax ne va pas fonctionner si on ne lui transmet pas le bon « nonce ».</p>



<p>Pour trouver le bon « nonce », il faut chercher dans le « View Result Tree » du « Test Script Recorder » qui a été généré lorsqu&rsquo;on a enregistré le scénario ! En effet, le « nonce » a été fourni par une page précédente et a été utilisé ensuite dans l&rsquo;Ajax. Une fois qu&rsquo;on rejoue le scénario, le « nonce » présenté n&rsquo;est plus le même. Et comme WordPress en place une bonne dizaine, il n&rsquo;est pas simple de retrouver le bon. Il faut donc faire une recherche de la chaîne <code>"fc5858da59"</code> dans le « View Result Tree » du « Test Script Recorder »</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-4.png"><img loading="lazy" decoding="async" width="828" height="679" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-4.png" alt="" class="wp-image-524" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-4.png 828w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-4-300x246.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-ajax-4-768x630.png 768w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Requêtes qui contiennent le « nonce » fc5858da59</figcaption></figure>



<p>Le « nonce » est généré sur la page <code>053 - /wp/admin/</code><br>On va essayer de récupérer sa valeur par une extraction sur le corps de la page HTML, qu&rsquo;on voit si on affiche l&rsquo;onglet « Response Body » et qu&rsquo;on fait une recherche de la chaine <code>"fc5858da59"</code> on trouve la ligne</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">&lt;script&gt;
var SiteHealth = {"screen":"dashboard","nonce":{"site_status":"33e44d2192","site_status_result":"fc5858da59"},"site_status":{"direct":[],"async":[],"issues":{"good":"15","recommended":"4","critical":"1"}}};
&lt;/script&gt;</pre></div>



<p>que nous allons utiliser pour récupérer un « nonce » qui changera à chaque login.</p>



<p>On va ajouter un post processeur sur la page <code>052 - /wp-login/</code> pour faire une extraction de cette valeur et la stocker dans une variable, qu&rsquo;on appellera <code>site_status_nonce</code>. On n&rsquo;utilise pas <code>053- /wp/admin/</code>, car la page est grisée, c&rsquo;est le résultat de la redirection du login. C&rsquo;est la requête <code>052 - /wp-login/</code> qui fournira le « nonce » !</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-1.png"><img loading="lazy" decoding="async" width="1024" height="627" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-1-1024x627.png" alt="" class="wp-image-527" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-1-1024x627.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-1-300x184.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-1-768x470.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-1.png 1150w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Addition d&rsquo;un Regular Expression Extractor</figcaption></figure>



<p>On va remplir les champs avec l&rsquo;expression régulière : <code>"site_status_result":"([^"]+)"</code> qui signifie tout ce qui se trouve entre ″ et ″ et qui ne contient pas de ″.</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-2.png"><img loading="lazy" decoding="async" width="1024" height="653" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-2-1024x653.png" alt="" class="wp-image-528" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-2-1024x653.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-2-300x191.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-2-768x490.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-2.png 1137w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Expression régulière pour récupérer le « nonce »</figcaption></figure>



<p>On pourrait utiliser l&rsquo;expression régulière <code>"site_status_result":"(.+?)"</code> qui signifie n&rsquo;importe quoi jusqu&rsquo;à la première ″ rencontrée. Le ? permet d&rsquo;avoir une expression « non greedy », sinon le moteur d&rsquo;expression prend tout ce qu&rsquo;il trouve jusqu&rsquo;à la dernière ″ du fichier !<br>Pour plus d&rsquo;informations, il faut regarder la documentation : h<a rel="noreferrer noopener" href="https://jmeter.apache.org/usermanual/regular_expressions.html" target="_blank">ttps://jmeter.apache.org/usermanual/regular_expressions.html</a></p>



<p>On peut également tester les expressions régulières dans JMeter. Dans le « View Result Tree », on affiche la page <code>052 - /wp-login/</code> et dans la combo box au dessus, on choisit « Regexp Tester ». On peut alors saisir une expression régulière dans le panneau de droite, qui va s&rsquo;appliquer au « Request Body » de la page <code>052 - /wp-login/</code>. On peut vérifier ici, qu&rsquo;on récupère le « nonce » <code>f9d0db48be</code></p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-3.png"><img loading="lazy" decoding="async" width="1024" height="534" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-3-1024x534.png" alt="" class="wp-image-530" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-3-1024x534.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-3-300x156.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-3-768x401.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-3.png 1390w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Test de l&rsquo;expression régulière</figcaption></figure>



<p>Maintenant qu&rsquo;on sait récupérer le « nonce », il faut l&rsquo;utiliser. Il faut modifier les 2 pages Ajax <br><code>109 - /wp-admin/admin-ajax.php</code> et<br><code>110 - /wp-admin/admin-ajax.php</code> pour mettre la variable <code>${site_status_nonce}</code> dans les paramètres de la requête</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-4.png"><img loading="lazy" decoding="async" width="1024" height="619" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-4-1024x619.png" alt="" class="wp-image-532" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-4-1024x619.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-4-300x181.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-4-768x464.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-4.png 1236w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Utilisation de la variable ${site_status_nonce} dans la requête</figcaption></figure>



<p>Désormais, les requêtes Ajax fonctionnent et renvoient un code 200 !</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-5.png"><img loading="lazy" decoding="async" width="1024" height="658" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-5-1024x658.png" alt="" class="wp-image-533" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-5-1024x658.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-5-300x193.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-5-768x493.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_regular_expression_extractor-5.png 1152w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Requêtes Ajax qui fonctionnent</figcaption></figure>



<p>A ce stade, on a un login qui fonctionne. On pourrait faire un scénario sans lancer ces requêtes Ajax qui ont pour principal objectif de montrer comment récupérer un « nonce » dans une page Web.</p>



<p>Dernière étape du login, on peut nettoyer les requêtes qui sont grisées. En effet, ce sont des requêtes implicites, qui proviennent de redirection des requêtes précédentes. </p>



<p>Par exemple, l&rsquo;appel de « 024 &#8211; wp-admin » déclenche les redirections suivantes, qu&rsquo;on peut voir du coté du navigateur :</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-4.png"><img loading="lazy" decoding="async" width="1024" height="660" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-4-1024x660.png" alt="" class="wp-image-772" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-4-1024x660.png 1024w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-4-300x193.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-4-768x495.png 768w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-4.png 1357w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a></figure>



<p>L&rsquo;enchaînement est le suivant</p>



<ol class="wp-block-list">
<li>https://alain.arditi.fr/wp-admin</li>



<li>http://alain.arditi.fr/wp-admin/</li>



<li>https://alain.arditi.fr/wp-admin/</li>



<li>https://alain.arditi.fr/wp-login.php?redirect_to=https%3A%2F%2Falain.arditi.fr%2Fwp-admin%2F&amp;reauth=1</li>
</ol>



<p>Les lecteurs  perspicaces verront une optimisation qui consiste à ne pas repasser en HTTP à l&rsquo;étape 2 puis repasser en HTTPS à l&rsquo;étape 3. C&rsquo;est une optimisation qui supprime un aller/retour entre le client et le serveur. 31 ms d&rsquo;après la trace du « Waterfall ». Cette redirection est faite au niveau d&rsquo;Apache par les rewrites ajoutés par le plugin WP Fastest Cache.  Dans le cas présent, je laisse, l&rsquo;enjeu étant faible, et surtout à la prochaine mise à jour du plugin je perdrais mes modifications.</p>



<p>Comme JMeter suit les redirections par défaut, il va lancer les 4 requêtes à partir de la première. C&rsquo;est la raison qui fait que dans notre scénario, on retrouve 3 requêtes grisées. Elle ne sont pas jouées par défaut. On peut donc supprimer toutes les requêtes grisées pour alléger. On retrouve notre scénario de login final :</p>



<figure class="wp-block-image size-large"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-5.png"><img loading="lazy" decoding="async" width="878" height="627" src="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-5.png" alt="" class="wp-image-773" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-5.png 878w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-5-300x214.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/JMeter_login-5-768x548.png 768w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption class="wp-element-caption">Scénario  de login final</figcaption></figure>



<p>Dans l&rsquo;article suivant on va continuer notre scénario. On va créer un article, renseigner du contenu et le mettre à la corbeille. En effet, sans la mise à la corbeille, un scénario qui générerait 1000 créations d&rsquo;articles, nous obligerait à les supprimer par la suite, sans quoi on se retrouverait avec un site rempli d&rsquo;article de test ! Dans ces requêtes on va être obligés de trouver les « nonces », sans quoi, impossible de créer, publier ou supprimer un article.</p>



<p>A noter que la bonne manière de procéder pour les tests de charge voudrait qu&rsquo;on réinitialise les données après chaque test. On remet le site comme d&rsquo;origine. On pourrait très bien ne pas supprimer les articles si on restaure les données. Avec WordPress, il suffit de restaurer la base de données.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><a href="https://alain.arditi.fr/2021/02/22/les-tests-de-charge-avec-jmeter-2-4/">Précédent : Les tests de charge avec JMeter 2/5</a></p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><a href="https://alain.arditi.fr/2021/02/26/les-tests-de-charge-avec-jmeter-4-4/">Suite : Les tests de charge avec JMeter 4/5</a></p>
</div>
</div>



<p>Site officiel de JMeter : <a href="https://jmeter.apache.org/" target="_blank" rel="noreferrer noopener">https://jmeter.apache.org/</a></p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/22/les-tests-de-charge-avec-jmeter-3-4/">Les tests de charge avec JMeter 3/5</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
