<?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 WordPress - Alain ARDITI&#039;s blog</title>
	<atom:link href="https://alain.arditi.fr/tag/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>https://alain.arditi.fr/tag/wordpress/</link>
	<description>Aide mémoire informatique</description>
	<lastBuildDate>Mon, 13 Nov 2023 09:25:57 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://alain.arditi.fr/wp-content/uploads/2020/04/cropped-ARDITI_Alain_20200326_512x512-32x32.jpg</url>
	<title>Archives des WordPress - Alain ARDITI&#039;s blog</title>
	<link>https://alain.arditi.fr/tag/wordpress/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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 fetchpriority="high" 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="(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 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="(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 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="(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 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-d0b3c9c8 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>
		<item>
		<title>Booster son WordPress avec Varnish 1/4</title>
		<link>https://alain.arditi.fr/2021/02/16/booster-son-wordpress-avec-varnish/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Tue, 16 Feb 2021 22:06:50 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[Varnish]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=289</guid>

					<description><![CDATA[<p>Faire voler votre WordPress en ajoutant le cache Varnish</p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/16/booster-son-wordpress-avec-varnish/">Booster son WordPress avec Varnish 1/4</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Votre WordPress est déjà optimisé, vous avez installé un plugin de cache, mais avec Varnish, vous allez passer à la vitesse supérieure !</p>



<p>Vous avez un WordPress 5.6, votre site est installé sur une distribution Debian Buster avec Apache/PHP/MySQL. Comme Varnish ne fait pas de SSL, il vous faudra un accélérateur SSL comme Nginx ou HAProxy.  Varnish va s&rsquo;intercaler entre le WordPress et le composant qui gère la terminaison SSL.</p>



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



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="436" height="339" src="https://alain.arditi.fr/wp-content/uploads/2021/02/Varnish_wordpress-2.png" alt="" class="wp-image-291" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/Varnish_wordpress-2.png 436w, https://alain.arditi.fr/wp-content/uploads/2021/02/Varnish_wordpress-2-300x233.png 300w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></figure>



<p>On peut installer Varnish 6.1 avec la commande&nbsp;</p>



<pre class="wp-block-code"><code>$ sudo apt install varnish
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libjemalloc2 libvarnishapi2 Suggested packages:
varnish-doc
The following NEW packages will be installed:
libjemalloc2 libvarnishapi2 varnish
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,207 kB of archives.
After this operation, 3,397 kB of additional disk space will be used. Do you want to continue? &#91;Y/n] y
....
$</code></pre>



<p>Jusque là, comme Varnish s&rsquo;installe par défaut sur le port 6081, il n&rsquo;y a aucun impact sur le&nbsp;Wordpress !</p>



<p>On prépare la configuration de Varnish qui se trouve dans <code>/etc/varnish/default.vcl</code></p>



<p>Sauvegardez la version d&rsquo;origine avant de la modifier avec la version à <a href="https://alain.arditi.fr/wp-content/uploads/2021/02/default.vcl_-1.txt" target="_blank" rel="noreferrer noopener">télécharger ici</a> !</p>



<p>Dans ce fichier, il faut vérifier le paragraphe&nbsp;</p>



<pre><code>backend default {
    .host = "localhost";  # WordPress sur trouve sur le même serveur que Varnish
    .port = "8080";
    .....</code></pre>



<p>qui définit l&rsquo;endroit où seront redirigées les requêtes qui arrivent depuis Varnish.</p>



<h3 class="wp-block-heading">Etape 1 : Modifier les ports d&rsquo;écoute d&rsquo;Apache et de Varnish</h3>



<p>Afin que Apache écoute sur le port 8080, il faut modifier 2 fichiers de configuration d&rsquo;Apache :</p>



<p>On passe&nbsp;<code>Listen 80</code>&nbsp;à&nbsp;<code>Listen 8080</code>&nbsp;dans le fichier&nbsp;<code>/etc/apache2/ports.conf</code>&nbsp;et dans la configuration du site WordPress, il faut passer le 80 à 8080 également :</p>



<pre><code>$ less /etc/apache2/sites-enabled/000-default.conf
&lt;VirtualHost *:80&gt;
# The ServerName directive sets the request scheme, hostname and port that
....</code></pre>



<p>de manière à obtenir :</p>



<pre><code>$ less /etc/apache2/sites-enabled/000-default.conf
&lt;VirtualHost *:8080&gt;
# The ServerName directive sets the request scheme, hostname and port that
....</code></pre>



<p>Le redémarrage d&rsquo;Apache permet la prise en compte du changement de port :</p>



<pre><code>$ sudo apachectl -t
Syntax OK
$ 
$ sudo systemctl restart apache2
$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-01-25 10:01:27 CET; 9h ago
     Docs: https://httpd.apache.org/docs/2.4/
 Main PID: 26634 (apache2)
    Tasks: 13 (limit: 4696)
   Memory: 244.9M
   CGroup: /system.slice/apache2.service
           ├─ 3666 /usr/sbin/apache2 -k start
           ├─ 5662 /usr/sbin/apache2 -k start
           ├─ 5663 /usr/sbin/apache2 -k start
           ├─ 6443 /usr/sbin/apache2 -k start
           ├─26634 /usr/sbin/apache2 -k start
           ├─26637 /usr/sbin/apache2 -k start
           ├─26639 /usr/sbin/apache2 -k start
           ├─26899 /usr/sbin/apache2 -k start
           ├─26900 /usr/sbin/apache2 -k start
           ├─26901 /usr/sbin/apache2 -k start
           └─26920 /usr/sbin/apache2 -k start
Jan 25 10:01:27 aa2 systemd[1]: Starting The Apache HTTP Server...
Jan 25 10:01:27 aa2 systemd[1]: Started The Apache HTTP Server.
$</code></pre>



<p>On modifie le port d&rsquo;écoute de Varnish pour passer du port par défaut 6081 au port 80, c&rsquo;est l&rsquo;option -a de la ligne de commande <code>ExecStart</code> dans le fichier&nbsp;/etc/systemd/system/varnish.service qu&rsquo;on aura copié depuis la version distribuée :</p>



<pre><code>$ sudo cp /lib/systemd/system/varnish.service /etc/systemd/system/varnish.service
$
## et modifié comme suit :
$ cat /etc/systemd/system/varnish.service
[Unit]
Description=Varnish HTTP accelerator Documentation=https://www.varnish-cache.org/docs/6.1/ man:varnishd
[Service]
Type=simple
LimitNOFILE=131072
LimitMEMLOCK=82000
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m ExecReload=/usr/share/varnish/varnishreload
ProtectSystem=full 
ProtectHome=true 
PrivateTmp=true 
PrivateDevices=true
[Install] 
WantedBy=multi-user.target 
$</code></pre>



<p>On lance la prise en compte de cette modification et on redémarre Varnish :</p>



<pre><code>$ sudo systemctl daemon-reload
$ sudo systemctl restart varnish
$ sudo systemctl status varnish
● varnish.service - Varnish HTTP accelerator
   Loaded: loaded (/lib/systemd/system/varnish.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-01-25 19:46:50 CET; 7s ago
     Docs: https://www.varnish-cache.org/docs/6.1/
           man:varnishd
 Main PID: 11354 (varnishd)
    Tasks: 217 (limit: 4696)
   Memory: 116.4M
   CGroup: /system.slice/varnish.service
           ├─11354 /usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
           └─11366 /usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
Jan 25 19:46:50 aa2 systemd[1]: Started Varnish HTTP accelerator.
Jan 25 19:46:52 aa2 varnishd[11354]: Debug: Version: varnish-6.1.1 revision efc2f6c1536cf2272e471f5cff5f145239b19460
Jan 25 19:46:52 aa2 varnishd[11354]: Debug: Platform: Linux,4.19.0-9-amd64,x86_64,-junix,-smalloc,-sdefault,-hcritbit
Jan 25 19:46:52 aa2 varnishd[11354]: Version: varnish-6.1.1 revision efc2f6c1536cf2272e471f5cff5f145239b19460
Jan 25 19:46:52 aa2 varnishd[11354]: Platform: Linux,4.19.0-9-amd64,x86_64,-junix,-smalloc,-sdefault,-hcritbit
Jan 25 19:46:52 aa2 varnishd[11354]: Debug: Child (11366) Started
Jan 25 19:46:52 aa2 varnishd[11354]: Child (11366) Started
Jan 25 19:46:52 aa2 varnishd[11354]: Info: Child (11366) said Child starts
Jan 25 19:46:52 aa2 varnishd[11354]: Child (11366) said Child starts
$ </code></pre>



<h3 class="wp-block-heading">Etape 2 : purger le cache Varnish</h3>



<p>Une fois installé, on peut vérifier l&rsquo;amélioration des&nbsp;performances de la mise en place de Varnish.</p>



<p>Pour vérifier la bon fonctionnement de Varnish, il faut gérer la purge. Sur le serveur Varnish, il suffit de lancer la commande suivante pour vider toutes les URLs mises en cache :</p>



<pre><code>$ sudo varnishadm "ban req.url ~ ."
$</code></pre>



<p>Le . de l&rsquo;expression régulière veut dire : 0 ou 1 caractère et n&rsquo;importe lequel. Toutes les URLs vont satisfaire la condition « ~ . » , donc cette expression va bannir toutes les URLs du cache.</p>



<p>La première requête suivant cette purge doit montrer un entête <code>X-Cache: MISS</code></p>



<p>La deuxième requête identique doit montrer un entête <code>X-Cache: HIT</code></p>



<p>On pourrait aussi purger des URLs avec une requête du type PURGE, puisqu&rsquo;on a a géré ce cas dans <a rel="noreferrer noopener" href="https://alain.arditi.fr/wp-content/uploads/2021/02/default.vcl_-1.txt" target="_blank">le fichier default.vcl</a>. Cette configuration permet de faire des purges à distance, sans être loggé sur le serveur et pourra aussi être utilisée par des plugins WordPress pour vider le cache lorsqu&rsquo;on publie un article.</p>



<p>Par exemple pour purger la page de cet article, dont l&rsquo;URL est : https://alain.arditi.fr/2021/02/09/booster-son-wordpress-avec-varnish/ il suffit de lancer la requête suivante sur la machine qui héberge le Varnish :</p>



<pre><code>$ curl -D - -X PURGE "http://localhost/2021/02/09/booster-son-wordpress-avec-varnish/"
HTTP/1.1 200 Purged.
Date: Tue, 09 Feb 2021 13:45:18 GMT
Server: Varnish
X-Varnish: 229742
Content-Length: 0
Accept-Ranges: bytes
Connection: keep-alive
$ sudo varnishadm 
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,4.19.0-9-amd64,x86_64,-junix,-smalloc,-sdefault,-hcritbit
varnish-6.1.1 revision efc2f6c1536cf2272e471f5cff5f145239b19460
Type 'help' for command list.
Type 'quit' to close CLI session.
varnish&gt; ban.list
200        
Present bans:
1612878318.148724     0 -  obj.http.X-Req-URL == /2021/02/09/booster-son-wordpress-avec-varnish/
1612878297.553181     0 C  
1612878289.407936     0 C  
1612878281.014556     0 C  
1612878237.731221     0 C  
1612864182.318939    44 C  
varnish&gt; quit
500        
Closing CLI connection
$</code></pre>



<p>On peut vérifier que la purge a bien fonctionné, en enchainant 2 fois la même requête et en regardant l&rsquo;entête X-Cache :</p>



<pre><code>$ curl -s -D - "https://alain.arditi.fr/2021/02/09/booster-son-wordpress-avec-varnish/" -o /dev/null
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 09 Feb 2021 13:59:29 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Frame-Options: sameorigin
Age: 0
X-Cache: MISS
Accept-Ranges: bytes
$ curl -s -D - "https://alain.arditi.fr/2021/02/09/booster-son-wordpress-avec-varnish/" -o /dev/null
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 09 Feb 2021 14:03:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 32894
Connection: keep-alive
Vary: Accept-Encoding
X-Frame-Options: sameorigin
Age: 245
X-Cache: HIT
Accept-Ranges: bytes
$</code></pre>



<p>Dernier point concernant la purge, on peut vérifier que la purge est interdite depuis une IP externe et génère un code d&rsquo;erreur 405 qui se trouve dans le fichier /etc/varnish/default.vcl :</p>



<pre><code>$ curl -D - -X PURGE "https://alain.arditi.fr/2021/02/09/booster-son-wordpress-avec-varnish/"   
HTTP/1.1 405 This IP is not allowed.
Server: nginx
Date: Tue, 09 Feb 2021 14:11:14 GMT
Content-Length: 0
Connection: keep-alive
X-Varnish: 360523
$</code></pre>



<p>A ce stade, nn est prêt à faire des mesures sur l&rsquo;efficacité des temps de réponse.</p>



<h3 class="wp-block-heading">Etape 3 : mesurer les temps de réponse unitaires</h3>



<p>On peut regarder le temps de chargement d&rsquo;une page avec cUrl ! <br>On prépare un fichier pour le formatage des temps de réponse comme suit :</p>



<pre><code>$ cat curl-format.txt
       time_connect:  %{time_connect}\n
 time_starttransfer:  %{time_starttransfer}\n
                    ----------\n
         time_total:  %{time_total}\n
$ </code></pre>



<p>Ce format pour cUrl est un format réduit, qui contient uniquement les 3 indicateurs qui nous intéressent. Ce qui produit un time_total qui n&rsquo;est pas toujours la somme de time_connect + time_starttransfer.</p>



<p>Pour information, le format qui permet d&rsquo;avoir tous les timers est le suivant :</p>



<pre><code>    time_namelookup:  %{time_namelookup}\n
       time_connect:  %{time_connect}\n
    time_appconnect:  %{time_appconnect}\n
   time_pretransfer:  %{time_pretransfer}\n
      time_redirect:  %{time_redirect}\n
 time_starttransfer:  %{time_starttransfer}\n
                    ----------\n
         time_total:  %{time_total}\n</code></pre>



<p>On lance une requête après le vidage du cache :</p>



<pre><code>$ curl -s -D - -w "@curl-format.txt" -o /dev/null -s "http://localhost/"
HTTP/1.1 200 OK
Date: Mon, 25 Jan 2021 16:00:28 GMT
Vary: Accept-Encoding
X-Frame-Options: sameorigin
Content-Type: text/html; charset=UTF-8
Age: 0
X-Cache: MISS
Accept-Ranges: bytes
Transfer-Encoding: chunked
Connection: keep-alive
       time_connect:  0.001480
 time_starttransfer:  0.030051
                    ----------
         time_total:  0.030324
$</code></pre>



<p>On remarque que l&rsquo;en-tête X-Cache vaut MISS.<br>La page est servie depuis Apache car elle n&rsquo;est pas stockée au niveau de Varnish.<br>Mais si on exécute la même requête encore une fois on obtient :</p>



<pre><code>$ curl -s -D - -w "@curl-format.txt" -o /dev/null -s "http://localhost/"
HTTP/1.1 200 OK
Date: Mon, 25 Jan 2021 16:00:28 GMT
Vary: Accept-Encoding
X-Frame-Options: sameorigin
Content-Type: text/html; charset=UTF-8
Age: 3
X-Cache: HIT
Accept-Ranges: bytes
Content-Length: 30108
Connection: keep-alive
        time_connect:  0.001529
  time_starttransfer:  0.002299
                    ----------
         time_total:  0.002713
$</code></pre>



<p>On divise le temps de réponse par un facteur 10 !!<br>Si on demande la même page directement depuis Apache, on obtient :</p>



<pre><code>$ curl -s -D - -w "@curl-format.txt" -o /dev/null "http://localhost:8080/"
HTTP/1.1 200 OK
Date: Mon, 25 Jan 2021 16:00:39 GMT
Server: Apache
Vary: Accept-Encoding
X-Frame-Options: sameorigin
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
        time_connect:  0.001666
 time_starttransfer:  0.026801
                    ----------
         time_total:  0.027680
$</code></pre>



<p>soit un temps de réponse voisin de celui de Varnish quand la page n&rsquo;est pas cachée. Ce facteur 10 prouve l&rsquo;intérêt de Varnish, qui va pouvoir servir tous les contenus statiques, images, js et css, et pages également, lorsqu&rsquo;elles n&rsquo;ont pas de cookies de session, beaucoup plus rapidement qu&rsquo;un serveur Apache !</p>



<p>Sur ce test, on voit l&rsquo;efficacité de l&rsquo;addition de Varnish sur les contenus statiques en terme de temps de réponse unitaire. C&rsquo;est donc un gain pour l&rsquo;expérience utilisateur !</p>



<p>L&rsquo;autre bénéfice est celui de la tenue en charge, qu&rsquo;on peut mesurer avec des outils comme <a rel="noreferrer noopener" href="https://jmeter.apache.org/" target="_blank">JMeter</a>.</p>



<p>C&rsquo;est ce que nous allons étudier dans les pages suivantes.</p>



<p></p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-d0b3c9c8 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="--col-width:100%;flex-basis:100%">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-d0b3c9c8 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><a href="https://alain.arditi.fr/2021/02/15/booster-son-wordpress-avec-varnish-2-4/">Suite : Booster son WordPress avec Varnish 2/4</a></p>
</div>
</div>
</div>
</div>



<p></p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/16/booster-son-wordpress-avec-varnish/">Booster son WordPress avec Varnish 1/4</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Booster son WordPress avec Varnish 2/4</title>
		<link>https://alain.arditi.fr/2021/02/15/booster-son-wordpress-avec-varnish-2-4/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Mon, 15 Feb 2021 21:05:17 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Varnish]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=344</guid>

					<description><![CDATA[<p>Booster son WordPress avec Varnish : Test n°1 : 40 threads sans Varnish</p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/15/booster-son-wordpress-avec-varnish-2-4/">Booster son WordPress avec Varnish 2/4</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading" id="block-ec72f45b-bbbd-484f-b444-228fc57a694c">Mesurer les temps de réponse et la tenue en charge avec JMeter</h3>



<p><a href="https://jmeter.apache.org/" target="_blank" rel="noreferrer noopener">JMeter</a> est un « injecteur » qui permet de simuler le parcours de plusieurs internautes et donc de produire de l&rsquo;audience, de la charge, sur un serveur afin de vérifier son comportement, sa tenue en charge !</p>



<p id="block-c5dd02f8-9421-4e29-a11e-15bcb0b1f6ea">Le sujet de la tenue en charge est assez vaste. Ici, on réduira le périmètre aux pages statiques puisque pour les pages dynamiques, le Varnish ne va pas pouvoir utiliser son cache.</p>



<p id="block-f3ce61e9-9ad7-4660-a109-d02216938c6a">Les tests ci dessous ont été effectués sur une VM WordPress de test avec très peu de ressources afin de mieux visualiser les limites de la VM.<br>La VM WordPress dispose d&rsquo;un seul vcpu et de 500Mo de RAM et elle se trouve sur mon hyperviseur VirtualBox sur un Macbook Air de 2017 ! Le WordPress utilise le plugin de cache <a href="https://fr.wordpress.org/plugins/wp-fastest-cache/" target="_blank" rel="noreferrer noopener">WP Fastest Cache</a> qui génère les pages prêtes à l&#8217;emploi sur le disque. A noter, que comme JMeter n&rsquo;interprète pas le JavaScript ni les feuilles de style CSS, les optimisations de minification de JS, de CSS, l&rsquo;allègement du poids des images n&rsquo;apparaissent pas dans les résultats de ces tests.</p>



<p id="block-63bd13ae-1ded-49e2-a90f-ea966ee20d92">Dans les paragraphes ci dessous, notre objectif consiste uniquement à « visualiser » l&rsquo;apport du composant Varnish. On lance un premier test sans Varnish, puis on relance le même test en activant Varnish.</p>



<p id="block-c49a42de-9c13-4a9a-b334-bf1a1fb64568">Comme lors du deuxième test, on constate que la VM a encore de la ressource, on lancera un troisième test en doublant le nombre de threads, qui passent de 40 à 80.</p>



<h4 class="wp-block-heading" id="block-5046eef4-0e4a-45a5-b999-04383e4058ed">Test n°1 : 40 threads sans Varnish</h4>



<p id="block-14c0ba0e-ef51-4734-8f3f-ec87085186dc">On lance 40 threads JMeter sur le site en SSL avec Nginx, sans cache Varnish.<br>Les résultats bruts de JMeter : nombre de requêtes 406 128, 0% d&rsquo;erreur.</p>



<figure class="wp-block-image" id="block-002aa6cc-1dbe-42c3-8bb7-09531ca4d8b0"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotActiveThreadsOverTime-13-1.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotActiveThreadsOverTime-13-1.png" alt="L’attribut alt de cette image est vide, son nom de fichier est flotActiveThreadsOverTime-13-1.png."/></a><figcaption>Nombre de threads actifs en fonction du temps</figcaption></figure>



<p id="block-f89f0700-f6ce-47f6-ba5c-0d55c4a5a200">La légende des abscisses indique le jour 09 (Février) suivi de l&rsquo;heure.<br>Les 40 threads sont atteints à 22h27. C&rsquo;est à partir de ce moment qu&rsquo;on atteint le maximum de la charge.</p>



<hr class="wp-block-separator" id="block-b6c5109d-cad8-4e7b-a671-c075cae8b1d5"/>



<p id="block-f6b84cc1-776a-4f2c-aaaa-b30214d197be">Les métriques de la VM sont les suivantes. La granularité de l&rsquo;outil de graphes <a href="http://munin-monitoring.org/" target="_blank" rel="noreferrer noopener">Munin</a>, utilisé pour ces tests est de 5 minutes.</p>



<figure class="wp-block-image" id="block-b2e004a5-47c1-453e-a0ad-a9538dd323f3"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request.png" alt="L’attribut alt de cette image est vide, son nom de fichier est nginx_request.png."/></a><figcaption>Nombre de requêtes traitées par Nginx par seconde</figcaption></figure>



<figure class="wp-block-image" id="block-3e8ca21d-5e3b-4980-8c99-fbcdfa1fb3db"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses.png" alt="L’attribut alt de cette image est vide, son nom de fichier est apache_accesses.png."/></a><figcaption>Nombre de requêtes traitées par Apache par seconde</figcaption></figure>



<p id="block-c8b252c4-5450-4378-ae48-0f5a48b543e9">On a exactement le même nombre de requêtes traitées par Nginx et par Apache puisqu&rsquo;il n&rsquo;y pas de cache. Toutes les requêtes sont transmises à Apache.</p>



<figure class="wp-block-image" id="block-abca910e-7f77-4bf9-af24-13a7b01ce92b"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/load.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/load.png" alt="L’attribut alt de cette image est vide, son nom de fichier est load.png."/></a><figcaption>Load average : charge de la VM</figcaption></figure>



<figure class="wp-block-image" id="block-2e9ae262-4c39-4d78-ae9c-0a39c5bb0a0e"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/cpu.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/cpu.png" alt="L’attribut alt de cette image est vide, son nom de fichier est cpu.png."/></a><figcaption>graphe d&rsquo;utilisation de la CPU</figcaption></figure>



<figure class="wp-block-image" id="block-172891ac-2001-40d9-bf5e-25ab8bf7d235"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries.png" alt="L’attribut alt de cette image est vide, son nom de fichier est mysql_queries.png."/></a><figcaption>Nombre de requêtes MySQL par seconde</figcaption></figure>



<figure class="wp-block-image" id="block-1dbb91ac-b196-45eb-94a0-80a470d47e76"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3.png" alt="L’attribut alt de cette image est vide, son nom de fichier est if_enp0s3.png."/></a><figcaption>Trafic réseau de la VM en Mbps</figcaption></figure>



<figure class="wp-block-image" id="block-eef6d58c-9e26-49ab-81d0-345149100171"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/memory.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/memory.png" alt="L’attribut alt de cette image est vide, son nom de fichier est memory.png."/></a><figcaption>Utilisation de la mémoire. Il reste de la mémoire libre pendant tout le test.</figcaption></figure>



<hr class="wp-block-separator" id="block-6b9650f8-5b4f-4d74-a600-b86aa5c52ace"/>



<p id="block-ac71ef56-4781-48ad-b9e7-9d4d8897ee15">Les métriques coté JMeter sont les suivantes. La granularité des JMeter est de 1 minutes, c&rsquo;est donc beaucoup plus précis dans notre cas que les graphes Munin.</p>



<figure class="wp-block-image" id="block-26bac8aa-e23d-4e88-9808-b2b883db893b"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime-13.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime-13.png" alt="L’attribut alt de cette image est vide, son nom de fichier est flotLatenciesOverTime-13.png."/></a><figcaption>La latence des pages (TTFB) en fonction du temps.</figcaption></figure>



<p id="block-88a5a617-3eea-4969-99fa-8bfbe2620bf8">Les temps de réponse sont en millisecondes car JMeter se trouve sur le même hyperviseur que la VM WordPress. On voit que la latence augmente graduellement en fonction de la charge. est perturbée à 22h32 et à 22h35.</p>



<figure class="wp-block-image" id="block-cd47e4d5-9712-486b-bb5d-cf4925ed9014"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime-13.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotResponseTimesOverTime-13.png" alt="L’attribut alt de cette image est vide, son nom de fichier est flotResponseTimesOverTime-13.png."/></a><figcaption>Les temps de réponse des pages en fonction du temps</figcaption></figure>



<p id="block-02627096-1614-42e2-a02c-dc5e3b16a94b">On fait le même constat sur les temps de réponse. La courbe violette correspond à une page qui pèse 10 fois plus que les autres, son temps de réponse est plus élevé à cause du temps de transfert.</p>



<figure class="wp-block-image" id="block-29584a5a-981a-4942-93c2-5d700d398382"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotBytesThroughputOverTime-13-1.png"><img decoding="async" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotBytesThroughputOverTime-13-1.png" alt="L’attribut alt de cette image est vide, son nom de fichier est flotBytesThroughputOverTime-13-1.png."/></a><figcaption>Graphes de débit réseau en MBps (octets) par seconde.</figcaption></figure>



<p id="block-e41e492c-6138-4127-8c5a-1a121b249de4">On voit que qu&rsquo;à partir de 22h27 le débit se dégrade, avec une perturbation à 22h32. On suppose que cette pointe est un artefact lié à la charge. Néanmoins, à partir de 40 thread, il y a un comportement erratique qu&rsquo;on ne voit pas bien sur les graphes Munin. En y regardant de plus près, on voit que sur les graphes Munin les mesures de 22h30 sont plus faibles que les mesures de 22h25, mais surtout que les mesures de 22h35 sont beaucoup plus faibles, alors qu&rsquo;il y a toujours 40 threads jusqu&rsquo;à 22h37. C&rsquo;est le signe que la VM ne répond plus correctement, on a une dégradation de son comportement à 40 threads.</p>



<p>On va pouvoir constater les différences avec le même test, mais avec Varnish activé qui va cacher toutes les page.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-d0b3c9c8 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/16/booster-son-wordpress-avec-varnish/">Précédent : Booster son WordPress avec Varnish 1/4</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/13/booster-son-wordpress-avec-varnish-3-4/">Suite : Booster son WordPress avec Varnish 3/4</a></p>
</div>
</div>



<p></p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/15/booster-son-wordpress-avec-varnish-2-4/">Booster son WordPress avec Varnish 2/4</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Booster son WordPress avec Varnish 3/4</title>
		<link>https://alain.arditi.fr/2021/02/13/booster-son-wordpress-avec-varnish-3-4/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Sat, 13 Feb 2021 21:04:57 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Varnish]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=350</guid>

					<description><![CDATA[<p>Booster son WordPress avec Varnish : Test n°2 : 40 threads avec Varnish</p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/13/booster-son-wordpress-avec-varnish-3-4/">Booster son WordPress avec Varnish 3/4</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h4 class="wp-block-heading" id="block-5046eef4-0e4a-45a5-b999-04383e4058ed">Test n°2 : 40 threads avec Varnish</h4>



<p id="block-14c0ba0e-ef51-4734-8f3f-ec87085186dc">On lance 40 threads JMeter sur le site en SSL avec Nginx, mais cette fois avec le cache Varnish et avec le plugin de cache WordPress <a rel="noreferrer noopener" href="https://wordpress.org/plugins/wp-fastest-cache/" target="_blank">WP Fastest Cache</a>. <br>Les résultats bruts de JMeter : nombre de requêtes 482 789, 0% d&rsquo;erreur.</p>



<figure class="wp-block-image size-large" id="block-002aa6cc-1dbe-42c3-8bb7-09531ca4d8b0"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotActiveThreadsOverTime.png"><img loading="lazy" decoding="async" width="680" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotActiveThreadsOverTime.png" alt="" class="wp-image-351" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/flotActiveThreadsOverTime.png 680w, https://alain.arditi.fr/wp-content/uploads/2021/02/flotActiveThreadsOverTime-300x176.png 300w" 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 actifs en fonction du temps</figcaption></figure>



<p id="block-f89f0700-f6ce-47f6-ba5c-0d55c4a5a200">La légende des abscisses indique le jour 09 (Février) suivi de l&rsquo;heure.<br>Les 40 threads sont atteints à 23h35. C&rsquo;est à partir de ce moment qu&rsquo;on atteint le maximum de la charge.</p>



<hr class="wp-block-separator" id="block-b6c5109d-cad8-4e7b-a671-c075cae8b1d5"/>



<p id="block-f6b84cc1-776a-4f2c-aaaa-b30214d197be">Les métriques de la VM sont les suivantes. La granularité de l&rsquo;outil de graphes <a href="http://munin-monitoring.org/" target="_blank" rel="noreferrer noopener">Munin</a>, utilisé pour ces tests est de 5 minutes.</p>



<figure class="wp-block-image size-large" id="block-b2e004a5-47c1-453e-a0ad-a9538dd323f3"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request-1.png"><img loading="lazy" decoding="async" width="897" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request-1.png" alt="" class="wp-image-353" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request-1.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request-1-300x167.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request-1-768x428.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 requêtes traitées par Nginx par seconde</figcaption></figure>



<p>Il faut noter l&rsquo;amélioration du maximum. Dans le scénario sans Varnish on arrive à 170 requêtes/s, ici on monte à 220 requêtes/s.</p>



<figure class="wp-block-image size-large" id="block-3e8ca21d-5e3b-4980-8c99-fbcdfa1fb3db"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses-1.png"><img loading="lazy" decoding="async" width="897" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses-1.png" alt="" class="wp-image-355" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses-1.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses-1-300x167.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses-1-768x428.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 requêtes traitées par Apache par seconde</figcaption></figure>



<p id="block-c8b252c4-5450-4378-ae48-0f5a48b543e9">Apache traite cent fois moins de requête avec Varnish. En fait dans le scénario, il y a une requête dynamique dans le scénario et qui ne peut pas être cachée par Varnish. Elle est toujours passée à Apache. On note également sur les deux graphes précédents, mais on retrouvera ce comportement sur tous les graphes suivants, qu&rsquo;on bien un plateau identique au plateau de nombre de threads. Contrairement au scénario 1, sans Varnish où la VM ne suit plus les thread de l&rsquo;injecteur JMeter une fois au maximum. Ce qui confirme la saturation de la VM dans le scénario 1.</p>



<figure class="wp-block-image size-large" id="block-abca910e-7f77-4bf9-af24-13a7b01ce92b"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/load-1.png"><img loading="lazy" decoding="async" width="897" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/02/load-1.png" alt="" class="wp-image-356" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/load-1.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/load-1-300x167.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/load-1-768x428.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>Load average : charge de la VM</figcaption></figure>



<p>La charge de la VM n&rsquo;est pas significative, il ne faut pas tenir compte des petites variations qui sont sous la valeur 0,2.</p>



<figure class="wp-block-image size-large" id="block-2e9ae262-4c39-4d78-ae9c-0a39c5bb0a0e"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/cpu-1.png"><img loading="lazy" decoding="async" width="897" height="596" src="https://alain.arditi.fr/wp-content/uploads/2021/02/cpu-1.png" alt="" class="wp-image-357" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/cpu-1.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/cpu-1-300x199.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/cpu-1-768x510.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 d&rsquo;utilisation de la CPU</figcaption></figure>



<figure class="wp-block-image size-large" id="block-172891ac-2001-40d9-bf5e-25ab8bf7d235"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries-1.png"><img loading="lazy" decoding="async" width="897" height="572" src="https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries-1.png" alt="" class="wp-image-358" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries-1.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries-1-300x191.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries-1-768x490.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 requêtes MySQL par seconde</figcaption></figure>



<p>Les valeurs sont tellement faibles que ce graphe n&rsquo;est pas significatif. Ici on a des millièmes de requêtes par seconde.</p>



<figure class="wp-block-image size-large" id="block-1dbb91ac-b196-45eb-94a0-80a470d47e76"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3-1.png"><img loading="lazy" decoding="async" width="897" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3-1.png" alt="" class="wp-image-359" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3-1.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3-1-300x167.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3-1-768x428.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>Trafic réseau de la VM en Mbps</figcaption></figure>



<figure class="wp-block-image size-large" id="block-eef6d58c-9e26-49ab-81d0-345149100171"><img loading="lazy" decoding="async" width="897" height="656" src="https://alain.arditi.fr/wp-content/uploads/2021/02/memory-1.png" alt="" class="wp-image-360" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/memory-1.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/memory-1-300x219.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/memory-1-768x562.png 768w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /><figcaption>Utilisation de la mémoire. Rien à signaler coté mémoire.</figcaption></figure>



<hr class="wp-block-separator" id="block-6b9650f8-5b4f-4d74-a600-b86aa5c52ace"/>



<p id="block-ac71ef56-4781-48ad-b9e7-9d4d8897ee15">Les métriques coté JMeter sont les suivantes. La granularité des JMeter est de 1 minutes, c&rsquo;est donc beaucoup plus précis dans notre cas que les graphes Munin.</p>



<figure class="wp-block-image size-large" id="block-26bac8aa-e23d-4e88-9808-b2b883db893b"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime.png"><img loading="lazy" decoding="async" width="680" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime.png" alt="" class="wp-image-361" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime.png 680w, https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime-300x176.png 300w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>La latence des pages (TTFB) en fonction du temps.</figcaption></figure>



<p id="block-88a5a617-3eea-4969-99fa-8bfbe2620bf8">La latence ne varie quasiment pas avec la charge. Il n&rsquo;y a pas de saturation. On note également une diminution de la latence par un facteur 10 au moins. On voit la capacité de Varnish à cracher du HTTP !</p>



<figure class="wp-block-image size-large" id="block-cd47e4d5-9712-486b-bb5d-cf4925ed9014"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotResponseTimesOverTime.png"><img loading="lazy" decoding="async" width="680" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotResponseTimesOverTime.png" alt="" class="wp-image-362" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/flotResponseTimesOverTime.png 680w, https://alain.arditi.fr/wp-content/uploads/2021/02/flotResponseTimesOverTime-300x176.png 300w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Les temps de réponse des pages en fonction du temps</figcaption></figure>



<p id="block-02627096-1614-42e2-a02c-dc5e3b16a94b">Même constat, les temps de réponse sont exceptionnels et ne varient pas. Sauf pour la courbe violette correspond à une page qui pèse 10 fois plus que les autres.</p>



<figure class="wp-block-image size-large" id="block-29584a5a-981a-4942-93c2-5d700d398382"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotBytesThroughputOverTime.png"><img loading="lazy" decoding="async" width="680" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotBytesThroughputOverTime.png" alt="" class="wp-image-363" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/flotBytesThroughputOverTime.png 680w, https://alain.arditi.fr/wp-content/uploads/2021/02/flotBytesThroughputOverTime-300x176.png 300w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Graphes de débit réseau en MBps (octets) par seconde.</figcaption></figure>



<p>Trois conclusions à tirer de ce deuxième test :</p>



<ol class="wp-block-list"><li>Les latences et les temps de réponse sont exceptionnels</li><li>Le nombre de requêtes fournies par seconde augmente de 30%, parce que les pages sont servies plus vite.</li><li>A 40 threads, la VM n&rsquo;est pas saturée, contrairement au test précédent qui avait atteint les limites. Les graphes JMeter et Munin suivent le graphe des threads !</li></ol>



<p>On va doit pouvoir pousser le test à 80 threads</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-d0b3c9c8 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/15/booster-son-wordpress-avec-varnish-2-4/" data-type="URL">Précédent : Booster son WordPress avec Varnish 2/4</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/12/booster-son-wordpress-avec-varnish-4-4/">Suite : Booster son WordPress avec Varnish 4/4</a></p>
</div>
</div>



<p></p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/13/booster-son-wordpress-avec-varnish-3-4/">Booster son WordPress avec Varnish 3/4</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Booster son WordPress avec Varnish 4/4</title>
		<link>https://alain.arditi.fr/2021/02/12/booster-son-wordpress-avec-varnish-4-4/</link>
		
		<dc:creator><![CDATA[Alain ARDITI]]></dc:creator>
		<pubDate>Fri, 12 Feb 2021 22:02:45 +0000</pubDate>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Varnish]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://alain.arditi.fr/?p=365</guid>

					<description><![CDATA[<p>Booster son Wordpress avec Varnish : 80 threads avec Varnish</p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/12/booster-son-wordpress-avec-varnish-4-4/">Booster son WordPress avec Varnish 4/4</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h4 class="wp-block-heading" id="block-5046eef4-0e4a-45a5-b999-04383e4058ed">Test n°3 : 80 threads avec Varnish</h4>



<p id="block-14c0ba0e-ef51-4734-8f3f-ec87085186dc">On lance 80 threads JMeter sur le site en SSL avec Nginx, avec le cache Varnish et avec le plugin de cache WordPress <a rel="noreferrer noopener" href="https://wordpress.org/plugins/wp-fastest-cache/" target="_blank">WP Fastest Cache</a> afin d&rsquo;essayer de trouver la limite de la VM WordPress.<br>Les résultats bruts de JMeter : nombre de requêtes 935 664 avec 7% d&rsquo;erreur.</p>



<figure class="wp-block-image size-large" id="block-002aa6cc-1dbe-42c3-8bb7-09531ca4d8b0"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotActiveThreadsOverTime-1.png"><img loading="lazy" decoding="async" width="680" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotActiveThreadsOverTime-1.png" alt="" class="wp-image-366" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/flotActiveThreadsOverTime-1.png 680w, https://alain.arditi.fr/wp-content/uploads/2021/02/flotActiveThreadsOverTime-1-300x176.png 300w" 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 actifs en fonction du temps</figcaption></figure>



<p id="block-f89f0700-f6ce-47f6-ba5c-0d55c4a5a200">La légende des abscisses indique le jour 10 (Février) suivi de l&rsquo;heure.<br>Les 80 threads sont atteints à 08h27. C&rsquo;est à partir de ce moment qu&rsquo;on atteint le maximum de la charge jusqu&rsquo;à 08h37.</p>



<hr class="wp-block-separator" id="block-b6c5109d-cad8-4e7b-a671-c075cae8b1d5"/>



<p id="block-f6b84cc1-776a-4f2c-aaaa-b30214d197be">Les métriques de la VM sont les suivantes. La granularité de l&rsquo;outil de graphes <a href="http://munin-monitoring.org/" target="_blank" rel="noreferrer noopener">Munin</a>, utilisé pour ces tests est de 5 minutes.</p>



<figure class="wp-block-image size-large" id="block-b2e004a5-47c1-453e-a0ad-a9538dd323f3"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request-2.png"><img loading="lazy" decoding="async" width="897" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request-2.png" alt="" class="wp-image-367" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request-2.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request-2-300x167.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/nginx_request-2-768x428.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 requêtes traitées par Nginx par seconde</figcaption></figure>



<p>Il faut noter l&rsquo;amélioration du maximum. On est à 360 requêtes/s ce qui prouve que la VM avec encore des ressources. On a augmenté de plus de 60% pour une augmentation de 100% du nombre de threads. Ce qui indique qu&rsquo;il y a probablement une contention, sinon on aurait aussi fait 100% de requêtes/s en plus !</p>



<figure class="wp-block-image size-large" id="block-3e8ca21d-5e3b-4980-8c99-fbcdfa1fb3db"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses-2.png"><img loading="lazy" decoding="async" width="897" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses-2.png" alt="" class="wp-image-368" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses-2.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses-2-300x167.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/apache_accesses-2-768x428.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 requêtes traitées par Apache par seconde</figcaption></figure>



<p id="block-c8b252c4-5450-4378-ae48-0f5a48b543e9">Apache ne fait rien ou presque.</p>



<figure class="wp-block-image size-large" id="block-abca910e-7f77-4bf9-af24-13a7b01ce92b"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/load-2.png"><img loading="lazy" decoding="async" width="897" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/02/load-2.png" alt="" class="wp-image-369" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/load-2.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/load-2-300x167.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/load-2-768x428.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>Load average : charge de la VM</figcaption></figure>



<p>La charge de la VM n&rsquo;est pas significative, il ne faut pas tenir compte des petites variations.</p>



<figure class="wp-block-image size-large" id="block-2e9ae262-4c39-4d78-ae9c-0a39c5bb0a0e"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/cpu-2.png"><img loading="lazy" decoding="async" width="897" height="596" src="https://alain.arditi.fr/wp-content/uploads/2021/02/cpu-2.png" alt="" class="wp-image-370" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/cpu-2.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/cpu-2-300x199.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/cpu-2-768x510.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 d&rsquo;utilisation de la CPU</figcaption></figure>



<p>L&rsquo;utilisation de la CPU a doublé et passe à 20%, ce qui reste faible. Ce n&rsquo;est pas en calcul que la VM est limitée.</p>



<figure class="wp-block-image size-large" id="block-172891ac-2001-40d9-bf5e-25ab8bf7d235"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries-2.png"><img loading="lazy" decoding="async" width="897" height="572" src="https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries-2.png" alt="" class="wp-image-371" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries-2.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries-2-300x191.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/mysql_queries-2-768x490.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 requêtes MySQL par seconde</figcaption></figure>



<p>Là aussi, on a un « joli » graphe mais pas significatif. MySQL ne fait rien.</p>



<figure class="wp-block-image size-large" id="block-1dbb91ac-b196-45eb-94a0-80a470d47e76"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3-2.png"><img loading="lazy" decoding="async" width="897" height="500" src="https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3-2.png" alt="" class="wp-image-372" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3-2.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3-2-300x167.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/if_enp0s3-2-768x428.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>Trafic réseau de la VM en Mbps</figcaption></figure>



<p>On voit la contention !!! Le maximum de débit réseau est atteint à 8h20, alors que les 80 threads sont atteints à 8h27. Ce plateau montre que la VM n&rsquo;arrive pas à produire plus de pages que  lorsqu&rsquo;elle est soumise à 65 threads.</p>



<figure class="wp-block-image size-large" id="block-eef6d58c-9e26-49ab-81d0-345149100171"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/memory-2.png"><img loading="lazy" decoding="async" width="897" height="656" src="https://alain.arditi.fr/wp-content/uploads/2021/02/memory-2.png" alt="" class="wp-image-373" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/memory-2.png 897w, https://alain.arditi.fr/wp-content/uploads/2021/02/memory-2-300x219.png 300w, https://alain.arditi.fr/wp-content/uploads/2021/02/memory-2-768x562.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>Utilisation de la mémoire. Rien à signaler coté mémoire.</figcaption></figure>



<hr class="wp-block-separator" id="block-6b9650f8-5b4f-4d74-a600-b86aa5c52ace"/>



<p id="block-ac71ef56-4781-48ad-b9e7-9d4d8897ee15">Les métriques coté JMeter sont les suivantes. La granularité des JMeter est de 1 minutes, c&rsquo;est donc beaucoup plus précis dans notre cas que les graphes Munin.</p>



<figure class="wp-block-image size-large" id="block-26bac8aa-e23d-4e88-9808-b2b883db893b"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime-1.png"><img loading="lazy" decoding="async" width="680" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime-1.png" alt="" class="wp-image-374" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime-1.png 680w, https://alain.arditi.fr/wp-content/uploads/2021/02/flotLatenciesOverTime-1-300x176.png 300w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>La latence des pages (TTFB) en fonction du temps.</figcaption></figure>



<p id="block-88a5a617-3eea-4969-99fa-8bfbe2620bf8">La latence ne varie pas jusqu&rsquo;à 8h20 puis elle se disperse. En fait lorsque la machine est saturée, comme on atteint une limite de débit, les latences s&rsquo;allongent.</p>



<figure class="wp-block-image size-large" id="block-cd47e4d5-9712-486b-bb5d-cf4925ed9014"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotResponseTimesOverTime-1.png"><img loading="lazy" decoding="async" width="680" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotResponseTimesOverTime-1.png" alt="" class="wp-image-375" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/flotResponseTimesOverTime-1.png 680w, https://alain.arditi.fr/wp-content/uploads/2021/02/flotResponseTimesOverTime-1-300x176.png 300w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Les temps de réponse des pages en fonction du temps</figcaption></figure>



<p id="block-02627096-1614-42e2-a02c-dc5e3b16a94b">Même constat, les temps de réponse s&rsquo;allongent à partir de 8h20.</p>



<figure class="wp-block-image size-large" id="block-29584a5a-981a-4942-93c2-5d700d398382"><a href="https://alain.arditi.fr/wp-content/uploads/2021/02/flotBytesThroughputOverTime-1.png"><img loading="lazy" decoding="async" width="680" height="400" src="https://alain.arditi.fr/wp-content/uploads/2021/02/flotBytesThroughputOverTime-1.png" alt="" class="wp-image-376" srcset="https://alain.arditi.fr/wp-content/uploads/2021/02/flotBytesThroughputOverTime-1.png 680w, https://alain.arditi.fr/wp-content/uploads/2021/02/flotBytesThroughputOverTime-1-300x176.png 300w" sizes="auto, (min-width: 1280px) 1240px, (min-width: 822px) calc(100vw - 120px), (min-width: 482px) calc(100vw - 80px), calc(100vw - 40px)" /></a><figcaption>Graphes de débit réseau en MBps (octets) par seconde.</figcaption></figure>



<p>Et le débit ne suit pas les threads&#8230;..</p>



<p>Conclusions à tirer de ce troisième test :</p>



<ol class="wp-block-list"><li>On a réussi à saturer la VM vers 65 threads.</li><li>La contention apparaît au niveau du réseau. La VM n&rsquo;arrive pas à fournir plus de 15 Mbps.</li><li>Au delà de 65 threads, la VM répond, mais les temps de réponse s&rsquo;allongent et elle produit des erreurs.</li></ol>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-d0b3c9c8 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/13/booster-son-wordpress-avec-varnish-3-4/">Précédent : Booster son WordPress avec Varnish 3/4</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/12/booster-son-wordpress-avec-varnish-5-4/">Suivant : Booster son WordPress avec Varnish 5/4</a></p>
</div>
</div>



<p></p>
<p>L’article <a href="https://alain.arditi.fr/2021/02/12/booster-son-wordpress-avec-varnish-4-4/">Booster son WordPress avec Varnish 4/4</a> est apparu en premier sur <a href="https://alain.arditi.fr">Alain ARDITI&#039;s blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
