<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>loadtest.app</title><description>Des outils de test de charge analysés et comparés, et des guides pour lancer et lire un test de charge.</description><link>https://loadtest.app/</link><language>fr-FR</language><item><title>Loi d&apos;Amdahl : formule, exemples et limites</title><link>https://loadtest.app/fr/amdahls-law/</link><guid isPermaLink="true">https://loadtest.app/fr/amdahls-law/</guid><description>La loi d&apos;Amdahl expliquée : formule, tableau d&apos;accélération, exemples, puis la loi de Gustafson, l&apos;USL et ce qu&apos;elles impliquent pour les tests de charge.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;La loi d&amp;#39;Amdahl (Amdahl&amp;#39;s law) dit que l&amp;#39;accélération obtenue en parallélisant un travail est plafonnée par la part qui ne peut pas s&amp;#39;exécuter en parallèle. Si une fraction p du travail se répartit sur n processeurs, serveurs ou threads, l&amp;#39;accélération vaut S = 1 / ((1 − p) + p/n), et quelle que soit la taille de n, elle ne dépasse jamais 1 / (1 − p). Avec 95 % de travail parallèle, le plafond est de 20 fois, même sur mille machines.&lt;/p&gt;
&lt;p&gt;Les chiffres ci-dessous sont de l&amp;#39;arithmétique, sans aucun test derrière. Les articles cités ont été vérifiés le 1er novembre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fraction parallèle p&lt;/th&gt;
&lt;th&gt;n = 2&lt;/th&gt;
&lt;th&gt;n = 8&lt;/th&gt;
&lt;th&gt;n = 64&lt;/th&gt;
&lt;th&gt;n → ∞&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0,50&lt;/td&gt;
&lt;td&gt;1,33&lt;/td&gt;
&lt;td&gt;1,78&lt;/td&gt;
&lt;td&gt;1,97&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,90&lt;/td&gt;
&lt;td&gt;1,82&lt;/td&gt;
&lt;td&gt;4,71&lt;/td&gt;
&lt;td&gt;8,77&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,95&lt;/td&gt;
&lt;td&gt;1,90&lt;/td&gt;
&lt;td&gt;5,93&lt;/td&gt;
&lt;td&gt;15,42&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,99&lt;/td&gt;
&lt;td&gt;1,98&lt;/td&gt;
&lt;td&gt;7,48&lt;/td&gt;
&lt;td&gt;39,26&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Que dit la loi en termes simples ?&lt;/h2&gt;
&lt;p&gt;Un travail ne peut pas finir plus vite que sa part séquentielle, donc des workers supplémentaires ne raccourcissent que le reste. Dès que la part parallèle devient petite face à la part séquentielle, ajouter des workers ne change presque plus le temps total.&lt;/p&gt;
&lt;p&gt;Prenez un travail de 10 secondes dont 1 seconde est séquentielle (un verrou, une écriture unique) et 9 secondes se répartissent également, soit p = 0,9. Huit workers le terminent en 1 + 9/8 = 2,125 secondes (4,71 fois plus vite) ; soixante-quatre ont besoin d&amp;#39;environ 1,14 seconde. Rien ne le fait passer sous 1 seconde, donc 10 est le plafond.&lt;/p&gt;
&lt;h2&gt;D&amp;#39;où vient cette loi ?&lt;/h2&gt;
&lt;p&gt;Gene Amdahl a présenté l&amp;#39;argument en 1967 à l&amp;#39;AFIPS Spring Joint Computer Conference, dans un article qui défendait l&amp;#39;approche à processeur unique.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas lu le texte intégral de &lt;a href=&quot;https://doi.org/10.1145/1465482.1465560&quot;&gt;Validity of the single processor approach to achieving large scale computing capabilities&lt;/a&gt;. Mark Hill et Michael Marty le résument dans &lt;a href=&quot;https://research.cs.wisc.edu/multifacet/amdahl/&quot;&gt;Amdahl&amp;#39;s Law in the Multicore Era&lt;/a&gt; (IEEE Computer, 2008) : une fraction parallélisable à l&amp;#39;infini sans surcoût d&amp;#39;ordonnancement, le reste totalement séquentiel, et l&amp;#39;accélération décrite sans présenter d&amp;#39;équation (« without presenting an equation »).&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce que cela change pour les tests de charge et de capacité ?&lt;/h2&gt;
&lt;p&gt;Le débit cesse de croître au rythme des serveurs, threads ou pods dès qu&amp;#39;un composant partagé traite une partie de chaque requête l&amp;#39;une après l&amp;#39;autre. Un test de charge le montre sous la forme d&amp;#39;une courbe de débit qui s&amp;#39;aplatit pendant que vous continuez à ajouter de la capacité.&lt;/p&gt;
&lt;p&gt;L&amp;#39;article de Neil Gunther de 2008, cité plus bas, écrit la même loi sous la forme N / (1 + σ(N − 1)), avec σ la fraction séquentielle, et mesure la scalabilité comme le débit à N divisé par le débit à 1. Dans un système web, la part séquentielle est tout ce que chaque requête doit traverser à son tour : un verrou ou une ligne que chaque requête met à jour, une base de données primaire unique qui reçoit toutes les écritures, un consommateur de file unique ou une API tierce limitée en débit.&lt;/p&gt;
&lt;h2&gt;Comment trouver la part séquentielle dans un test de charge ?&lt;/h2&gt;
&lt;p&gt;Lancez le même test à plusieurs niveaux de charge et observez quelle ressource sature pendant que le débit s&amp;#39;aplatit. Le composant qui est à sa limite quand la capacité supplémentaire ne rapporte plus rien est la part séquentielle, ou la file d&amp;#39;attente devant elle.&lt;/p&gt;
&lt;p&gt;Signes typiques : le débit plafonne alors que la couche applicative a encore du CPU libre, les attentes grossissent à un seul endroit partagé (verrous, connexions à la base, profondeur de file), et le temps de réponse monte au même rythme que les utilisateurs, ce qui est la &lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;loi de Little&lt;/a&gt; face à un plafond. Une exécution à charge constante ne peut pas le montrer, donc montez la charge par paliers. Le réglage &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/what-is-ramp-up-steps-in-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=amdahls-law&quot;&gt;Ramp Up Steps&lt;/a&gt; de LoadFocus ajoute les utilisateurs virtuels par lots égaux. Le &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/reading-the-capacity-panel?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=amdahls-law&quot;&gt;panneau de capacité&lt;/a&gt; de LoadFocus regroupe une exécution terminée par nombre d&amp;#39;utilisateurs virtuels actifs et, sur les offres payantes, liste le p95, les requêtes par seconde et le taux d&amp;#39;erreur par palier pour les exécutions à un seul générateur de charge. Il n&amp;#39;indique un niveau de capacité que si l&amp;#39;exécution a franchi au moins trois paliers, le palier le plus haut valant au moins le double du plus bas. Il n&amp;#39;ajuste aucun modèle de scalabilité : l&amp;#39;ajustement décrit plus bas est à faire vous-même.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce que la loi de Gustafson ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est le contrepoint : si le problème grandit avec la machine, la part séquentielle reste petite et l&amp;#39;accélération croît presque linéairement. Amdahl fixe le travail, Gustafson fixe le temps d&amp;#39;exécution.&lt;/p&gt;
&lt;p&gt;La note de John Gustafson de 1988, &lt;a href=&quot;https://doi.org/10.1145/42411.42415&quot;&gt;Reevaluating Amdahl&amp;#39;s law&lt;/a&gt;, rapportait des accélérations de 1016 à 1021 sur un hypercube de 1024 processeurs à Sandia, pour des applications dont la part séquentielle était de 0,4 à 0,8 %, et soutenait que les utilisateurs agrandissent le problème jusqu&amp;#39;à remplir le temps dont ils disposent. Avec s&amp;#39; la part séquentielle mesurée sur l&amp;#39;exécution parallèle, l&amp;#39;accélération mise à l&amp;#39;échelle, une formule que la note attribue à E. Barsis à Sandia, vaut N + (1 − N)s&amp;#39;.&lt;/p&gt;
&lt;p&gt;Avec s&amp;#39; = 0,05 et 64 processeurs, cela donne 60,85, contre 15,42 selon Amdahl, parce que les deux valeurs de 5 % sont mesurées sur des machines différentes. Dans un système web, Gustafson s&amp;#39;applique quand chaque serveur ajouté travaille sur sa propre part des données ; Amdahl s&amp;#39;applique quand chaque utilisateur supplémentaire touche toujours la même ligne partagée.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;apporte l&amp;#39;Universal Scalability Law ?&lt;/h2&gt;
&lt;p&gt;Un second terme pour la cohérence, c&amp;#39;est-à-dire le coût de garder des données partagées cohérentes entre workers, qui croît avec le nombre de paires de workers. Avec lui, le débit peut atteindre un maximum puis baisser à mesure que vous ajoutez de la capacité.&lt;/p&gt;
&lt;p&gt;L&amp;#39;article de Gunther &lt;a href=&quot;https://arxiv.org/abs/0808.1431&quot;&gt;A General Theory of Computational Scalability Based on Rational Functions&lt;/a&gt; (arXiv, 2008) énonce l&amp;#39;Universal Scalability Law (USL) ainsi :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;C(N) = N / (1 + σ(N - 1) + κN(N - 1))
peak at N* = sqrt((1 - σ) / κ)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;σ représente la contention (sérialisation ou mise en file) et κ la cohérence (copies incohérentes des données) ; avec κ = 0, on retrouve la formule d&amp;#39;Amdahl. Parmi les exemples de Gunther pour le pire cas figure la mise à jour d&amp;#39;enregistrements en base, et il qualifie le débit au-delà de N* de « retrograde », c&amp;#39;est-à-dire décroissant. Avec les valeurs d&amp;#39;exemple σ = 0,05 et κ = 0,001, le maximum se situe vers 31 workers : le débit relatif vaut 9,03 à 32 et 7,82 à 64, là où le terme σ seul prévoit 15,42.&lt;/p&gt;
&lt;h2&gt;Comment ajuster l&amp;#39;USL sur une série de tests de charge ?&lt;/h2&gt;
&lt;p&gt;Mesurez le débit à plusieurs niveaux de concurrence, divisez chaque valeur par le débit à un utilisateur, puis estimez σ et κ par la méthode des moindres carrés.&lt;/p&gt;
&lt;p&gt;Réarrangée, la formule s&amp;#39;écrit N / C − 1 = σ(N − 1) + κN(N − 1), ce qui est linéaire en σ et κ. Les valeurs ci-dessous sont générées à partir de σ = 0,05 et κ = 0,001 ; mettez dans x vos propres requêtes par seconde par palier :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np

n = np.array([1, 2, 4, 8, 16, 32])          # virtual users
x = np.array([50, 95, 172, 284, 402, 452])  # req/s per level
c = x / x[0]                                # relative capacity
A = np.column_stack([n - 1, n * (n - 1)])
(s, k), *_ = np.linalg.lstsq(A, n / c - 1, rcond=None)
print(f&amp;quot;sigma={s:.3f} kappa={k:.4f}&amp;quot;)
print(f&amp;quot;peak near {np.sqrt((1 - s) / k):.0f} users&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le script affiche &lt;code&gt;sigma=0.050&lt;/code&gt;, &lt;code&gt;kappa=0.0010&lt;/code&gt; et un maximum vers 31 utilisateurs. Ne changez que la concurrence d&amp;#39;un palier à l&amp;#39;autre et incluez un palier à un utilisateur, puisque chaque point est divisé par lui.&lt;/p&gt;
&lt;h2&gt;Où ces modèles cessent-ils d&amp;#39;être utiles ?&lt;/h2&gt;
&lt;p&gt;Ils résument une courbe de débit en une ou deux constantes, donc ils ne peuvent ni désigner le verrou en cause ni suivre un système qui change sous la charge. Servez-vous-en pour lire une courbe mesurée et la prolonger un peu : un ajustement sur des paliers loin sous le coude dit peu de chose du maximum.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Paramètres constants. Un cache en cours de préchauffage, un autoscaler ou un pool qui atteint sa limite modifie σ et κ en cours de test.&lt;/li&gt;
&lt;li&gt;Le débit seulement. Le p95 et le p99 peuvent se dégrader en premier : vérifiez aussi la &lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;latence de queue&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Le générateur de charge. S&amp;#39;il sature d&amp;#39;abord, la courbe plate est la sienne.&lt;/li&gt;
&lt;li&gt;Tests fermés. Des utilisateurs virtuels en nombre fixe mesurent un &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;système fermé&lt;/a&gt; ; les vrais utilisateurs arrivent à leur propre rythme.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pouvez-vous expliquer la loi d&amp;#39;Amdahl simplement ?&lt;/strong&gt;
Un travail n&amp;#39;est jamais plus rapide que la part qui ne peut pas être partagée. Si un dixième du travail doit s&amp;#39;exécuter en séquence, aucun nombre de workers supplémentaires ne le rend plus de dix fois plus rapide, car ce dixième prend toujours le même temps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qu&amp;#39;est-ce que la loi de Gustafson ?&lt;/strong&gt;
La loi de Gustafson dit que lorsque le problème grandit avec le nombre de processeurs, l&amp;#39;accélération croît presque linéairement, selon N + (1 − N)s&amp;#39;, avec s&amp;#39; la part séquentielle de l&amp;#39;exécution parallèle. John Gustafson l&amp;#39;a publiée en 1988 (en attribuant la formule à son collègue de Sandia E. Barsis) en contrepoint de l&amp;#39;hypothèse d&amp;#39;Amdahl d&amp;#39;un problème de taille fixe.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;Loi de Little en test de charge : dimensionner et vérifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/queueing-theory/&quot;&gt;Théorie des files d&amp;#39;attente : ce qu&amp;#39;elle dit de la latence&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Théorie des files d&apos;attente : ce qu&apos;elle dit de la latence</title><link>https://loadtest.app/fr/queueing-theory/</link><guid isPermaLink="true">https://loadtest.app/fr/queueing-theory/</guid><description>Théorie des files d&apos;attente : arrivées, serveurs, notation de Kendall, pourquoi la latence s&apos;envole près de la saturation et ce que cela change en test.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;La théorie des files d&amp;#39;attente (en anglais queueing theory) est la mathématique de l&amp;#39;attente : à partir du rythme d&amp;#39;arrivée du travail, de la durée de chaque tâche et du nombre de serveurs, elle prédit combien de temps les tâches attendent et quelle longueur atteint la file. Pour le logiciel, son résultat le plus utile est que le temps de réponse augmente lentement sous charge modérée, puis brusquement quand un serveur approche 100 % d&amp;#39;occupation. Dans le modèle le plus simple, un serveur occupé 90 % du temps répond en moyenne dix fois plus lentement qu&amp;#39;un serveur inactif.&lt;/p&gt;
&lt;p&gt;Les chiffres ci-dessous sont des calculs tirés de formules classiques, vérifiés par un script, sans test derrière. Les sources ont été vérifiées le 1er novembre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Taux d&amp;#39;utilisation ρ&lt;/th&gt;
&lt;th&gt;Temps dans le système W ÷ temps de service S&lt;/th&gt;
&lt;th&gt;Si S = 20 ms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0,5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;40 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,7&lt;/td&gt;
&lt;td&gt;3,3&lt;/td&gt;
&lt;td&gt;67 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,8&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;100 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,9&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;200 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,95&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;400 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,99&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2 000 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Ce sont des moyennes pour la file M/M/1 : un serveur, des arrivées de Poisson et des temps de service exponentiels.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce que la théorie des files d&amp;#39;attente ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est la branche des probabilités qui modélise un travail qui arrive, attend puis est servi. Une file se décrit par ses arrivées, ses temps de service, son nombre de serveurs et sa discipline de service, c&amp;#39;est-à-dire l&amp;#39;ordre dans lequel les tâches en attente sont prises.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.2.html&quot;&gt;Urban Operations Research&lt;/a&gt; de Larson et Odoni, un texte du MIT en libre accès, cite les guichets de banque, les caisses de supermarché et les péages comme cas classiques. Un serveur web entre dans le même cadre : les requêtes arrivent, des threads ou des cœurs les traitent, et les autres attendent dans une file.&lt;/p&gt;
&lt;h2&gt;D&amp;#39;où vient la théorie des files d&amp;#39;attente ?&lt;/h2&gt;
&lt;p&gt;Du central téléphonique, où A. K. Erlang a obtenu les premiers résultats pour la compagnie des téléphones de Copenhague.&lt;/p&gt;
&lt;p&gt;Selon sa &lt;a href=&quot;https://mathshistory.st-andrews.ac.uk/Biographies/Erlang/&quot;&gt;biographie MacTutor&lt;/a&gt;, l&amp;#39;article d&amp;#39;Erlang de 1909 montrait que des appels passés au hasard suivent la loi de Poisson, et sa formule de 1917 sur les pertes et le temps d&amp;#39;attente a vite été adoptée par des compagnies de téléphone de nombreux pays. L&amp;#39;article de David Kendall de 1953, &lt;a href=&quot;https://doi.org/10.1214/aoms/1177728975&quot;&gt;Stochastic Processes Occurring in the Theory of Queues and their Analysis by the Method of the Imbedded Markov Chain&lt;/a&gt;, a introduit la notation encore en usage, comme le rappelle le &lt;a href=&quot;https://arxiv.org/abs/0810.1091&quot;&gt;récit de son œuvre&lt;/a&gt; par Geoffrey Grimmett. La &lt;a href=&quot;https://doi.org/10.1287/opre.9.3.383&quot;&gt;démonstration de L = λW&lt;/a&gt; par Little et les résultats de Kingman en trafic dense ont suivi en 1961.&lt;/p&gt;
&lt;h2&gt;Que signifie la notation de Kendall, comme M/M/1 ?&lt;/h2&gt;
&lt;p&gt;Elle nomme une file en trois parties, A/S/c : la loi des intervalles entre arrivées, celle des temps de service et le nombre de serveurs. M/M/1 signifie des arrivées aléatoires, des temps de service exponentiels et un seul serveur.&lt;/p&gt;
&lt;p&gt;M signifie memoryless, sans mémoire (arrivées de Poisson ou temps exponentiels), D déterministe et G general, c&amp;#39;est-à-dire n&amp;#39;importe quelle loi : M/D/1 est un serveur dont le temps de service est constant.&lt;/p&gt;
&lt;h2&gt;Comment le temps de réponse augmente-t-il avec le taux d&amp;#39;utilisation ?&lt;/h2&gt;
&lt;p&gt;Dans une file M/M/1, le temps moyen passé dans le système est W = 1/(μ − λ), soit S/(1 − ρ). Quand le taux d&amp;#39;utilisation ρ approche 1, W croît sans limite.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;lambda = arrival rate        mu = service rate (1 / S)
rho    = lambda / mu         (utilization, must stay below 1)
W      = 1 / (mu - lambda)   = S / (1 - rho)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Larson et Odoni le démontrent pour un &lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.6.1.html&quot;&gt;centre d&amp;#39;appels à une seule opératrice&lt;/a&gt; et montrent qu&amp;#39;il n&amp;#39;existe pas de régime stationnaire pour ρ ≥ 1 : la file ne cesse de s&amp;#39;allonger. La même source montre que le temps dans le système suit une loi exponentielle. Chaque percentile augmente donc du même facteur 1/(1 − ρ), et le p95 vaut environ trois fois la moyenne : 600 ms sur la ligne 0,9 ci-dessus.&lt;/p&gt;
&lt;h2&gt;Pourquoi la latence fait-elle un coude avant que le CPU atteigne 100 % ?&lt;/h2&gt;
&lt;p&gt;Parce qu&amp;#39;une requête attend chaque fois qu&amp;#39;elle trouve le serveur occupé, ce qui arrive de plus en plus souvent quand le taux d&amp;#39;utilisation monte. Sous les hypothèses M/M/1, le temps de réponse a déjà doublé à 50 % d&amp;#39;utilisation.&lt;/p&gt;
&lt;p&gt;La ressource qui sature peut aussi être un pool de connexions, un verrou de base de données ou une boucle d&amp;#39;événements à un seul thread, et la plus chargée dicte la courbe. C&amp;#39;est ce coude précoce qui explique pourquoi le taux d&amp;#39;utilisation visé reste bien en dessous de 100 %. Partez de votre budget de latence : avec S = 20 ms et une moyenne cible de 100 ms, le tableau autorise environ 80 %, et une cible de 60 ms environ 67 %, avant que les pics de trafic ne prennent leur part.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/reading-the-capacity-panel?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=queueing-theory&quot;&gt;panneau de capacité&lt;/a&gt; de LoadFocus regroupe un test terminé par nombre d&amp;#39;utilisateurs virtuels actifs et indique le dernier palier qui a tenu avant que le taux d&amp;#39;erreur dépasse 1 % ou que le p95 dépasse le double du meilleur palier, à condition qu&amp;#39;aucun palier supérieur ne se soit rétabli. Il lui faut un test sur un seul générateur de charge qui monte sur au moins trois paliers, le plus haut valant au moins le double du plus bas. D&amp;#39;après le calcul ci-dessus, si le palier le plus léger a laissé le goulot d&amp;#39;étranglement presque inactif, le doublement se déclenche juste au-delà de 50 % d&amp;#39;utilisation ; s&amp;#39;il le chargeait déjà à ρ0, le doublement se déclenche plus tard, au-delà de (1 + ρ0)/2 sous M/M/1.&lt;/p&gt;
&lt;h2&gt;Pourquoi la variabilité compte-t-elle autant que le taux d&amp;#39;utilisation ?&lt;/h2&gt;
&lt;p&gt;Les files naissent du hasard : des arrivées en rafales et des tâches parfois lentes. En trafic dense, le temps d&amp;#39;attente croît avec la variabilité des deux, multipliée par un terme ρ/(1 − ρ).&lt;/p&gt;
&lt;p&gt;L&amp;#39;article de Kingman de 1961, &lt;a href=&quot;https://doi.org/10.1017/S0305004100036094&quot;&gt;The single server queue in heavy traffic&lt;/a&gt;, montre que lorsque l&amp;#39;intensité de trafic d&amp;#39;un serveur unique est proche de 1, la file est longue et le temps d&amp;#39;attente suit à peu près une loi exponentielle. Des notes de cours de la &lt;a href=&quot;https://www.win.tue.nl/~iadan/2V050/h10.pdf&quot;&gt;TU Eindhoven&lt;/a&gt; et du &lt;a href=&quot;https://serveng.technion.ac.il/files/Lectures/Lecture_GGQ&apos;s_FULL_Marked.pdf&quot;&gt;Technion&lt;/a&gt; en donnent une approximation de la moyenne (le Technion l&amp;#39;appelle approximation d&amp;#39;Allen-Cunneen ; elle est aussi largement connue sous le nom de formule de Kingman) :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Wq ≈ rho / (1 - rho) × (ca² + cs²) / 2 × S
ca, cs = coefficient of variation (std dev / mean)
         of arrival gaps and of service times
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wq est l&amp;#39;attente avant le début du service, et ca, cs sont les coefficients de variation. Des temps exponentiels ont c² = 1, ce qui redonne l&amp;#39;attente M/M/1 de 9S à 90 % d&amp;#39;utilisation. Un temps de service constant la divise par deux, à 4,5S ; cs² = 4, ce que peut produire un mélange de succès de cache et d&amp;#39;appels lents à la base de données, la porte à 22,5S. Un trafic synthétique régulier varie moins que la production, donc un test montre en général moins d&amp;#39;attente que les vrais pics.&lt;/p&gt;
&lt;h2&gt;Comment plusieurs serveurs (M/M/c) aident-ils ?&lt;/h2&gt;
&lt;p&gt;Plusieurs serveurs qui partagent une file absorbent bien mieux les rafales aléatoires que les mêmes serveurs avec une file chacun, si bien que chaque serveur peut être plus occupé pour la même attente.&lt;/p&gt;
&lt;p&gt;D&amp;#39;après les &lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.6.2.html&quot;&gt;formules M/M/m&lt;/a&gt; de Larson et Odoni, avec chaque serveur occupé à 90 %, W vaut 10S pour un serveur, 5,3S pour deux partageant une file et 3,0S pour quatre. Quatre instances derrière un répartiteur de charge qui choisit une instance libre se comportent comme le dernier cas ; quatre qui reçoivent chacune un quart aléatoire du trafic, comme des files M/M/1 séparées à 10S.&lt;/p&gt;
&lt;h2&gt;Quel lien avec la loi de Little ?&lt;/h2&gt;
&lt;p&gt;La loi de Little, L = λW, relie le nombre moyen de requêtes dans un système à leur taux d&amp;#39;arrivée et à leur temps de séjour, quelles que soient les lois. La théorie des files d&amp;#39;attente donne W, et la loi de Little en tire L.&lt;/p&gt;
&lt;p&gt;Sur la ligne 0,9, 45 requêtes par seconde avec W = 200 ms donnent en moyenne 9 requêtes dans le système. Notre &lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;article sur la loi de Little&lt;/a&gt; utilise la même loi pour dimensionner et vérifier des tests de charge.&lt;/p&gt;
&lt;h2&gt;Où ces modèles cessent-ils de s&amp;#39;appliquer en test de charge ?&lt;/h2&gt;
&lt;p&gt;Ils supposent un flux ouvert d&amp;#39;arrivées indépendantes et un régime stationnaire. Un test avec un nombre fixe d&amp;#39;utilisateurs virtuels est un système fermé, où les arrivées ralentissent quand les réponses ralentissent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tests fermés. Avec N utilisateurs virtuels, il y a au plus N requêtes dans le système, donc la cadence de requêtes baisse là où une file ouverte s&amp;#39;allongerait, et le &lt;a href=&quot;https://loadtest.app/fr/think-time-in-load-testing/&quot;&gt;temps de réflexion&lt;/a&gt; la réduit encore. Notre article sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique pourquoi cela masque la saturation.&lt;/li&gt;
&lt;li&gt;LoadFocus exécute des &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=queueing-theory&quot;&gt;scripts k6&lt;/a&gt;, mais les scénarios arrival-rate y tournent avec un nombre fixe d&amp;#39;utilisateurs, comme le signale son validateur de scripts. Lisez ces tests comme des tests fermés : après le coude, attendez-vous à une cadence de requêtes plate et à des temps de réponse qui montent.&lt;/li&gt;
&lt;li&gt;Régime stationnaire. La phase de chauffe, les caches et l&amp;#39;autoscaling changent le taux de service pendant le test, donc comparez des paliers tenus assez longtemps pour se stabiliser.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Faut-il écrire queueing theory ou queuing theory ?&lt;/strong&gt;
Les deux orthographes anglaises sont correctes et désignent le même domaine. L&amp;#39;article de Kingman de 1961 écrit « queueing time », tandis que la démonstration de Little, la même année, porte « Queuing Formula » dans son titre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La théorie des files d&amp;#39;attente exige-t-elle des arrivées de Poisson ?&lt;/strong&gt;
Seulement pour les résultats exacts du modèle M/M/1. Les approximations G/G/1 comme la formule de Kingman utilisent la moyenne et la variabilité des intervalles entre arrivées et des temps de service, et la loi de Little ne suppose rien sur les lois.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;Loi de Little en test de charge : dimensionner et vérifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/think-time-in-load-testing/&quot;&gt;Temps de réflexion en test de charge : bien le régler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>SLO vs SLA : la différence, les SLI et le budget d&apos;erreur</title><link>https://loadtest.app/fr/slo-vs-sla/</link><guid isPermaLink="true">https://loadtest.app/fr/slo-vs-sla/</guid><description>SLO vs SLA expliqué : qui fixe quoi, ce qu&apos;est un SLI, le rôle du budget d&apos;erreur, l&apos;indisponibilité tolérée à 99,9 % et comment tester un SLO sous charge.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;Un SLA (accord de niveau de service) est un contrat avec un client qui dit ce qui se passe quand un service n&amp;#39;atteint pas un niveau promis, le plus souvent un crédit de service. Un SLO (objectif de niveau de service) est la cible interne sur laquelle une équipe pilote le service ; le livre SRE conseille de la fixer plus stricte que le SLA pour que les problèmes soient réglés avant que le contrat ne soit enfreint. Un SLI (indicateur de niveau de service) est la mesure dans laquelle les deux sont exprimés, par exemple la part des requêtes qui réussissent.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SLI&lt;/th&gt;
&lt;th&gt;SLO&lt;/th&gt;
&lt;th&gt;SLA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Ce que c&amp;#39;est&lt;/td&gt;
&lt;td&gt;Une mesure&lt;/td&gt;
&lt;td&gt;Une cible pour un SLI&lt;/td&gt;
&lt;td&gt;Un contrat fondé sur des SLO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixé par&lt;/td&gt;
&lt;td&gt;L&amp;#39;ingénierie&lt;/td&gt;
&lt;td&gt;Le product owner et l&amp;#39;ingénierie&lt;/td&gt;
&lt;td&gt;Les équipes commerciales et juridiques&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;En cas d&amp;#39;échec&lt;/td&gt;
&lt;td&gt;Rien en soi&lt;/td&gt;
&lt;td&gt;Budget d&amp;#39;erreur consommé&lt;/td&gt;
&lt;td&gt;Crédits de service ou pénalités&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exemple&lt;/td&gt;
&lt;td&gt;Appels de paiement réussis&lt;/td&gt;
&lt;td&gt;99,95 % sur quatre semaines&lt;/td&gt;
&lt;td&gt;99,9 % par mois, sinon un crédit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Les exemples sont des illustrations ; les sources sont le livre SRE et le workbook SRE de Google ainsi que le SLA Amazon Compute, vérifiés le 1er novembre 2026.&lt;/p&gt;
&lt;h2&gt;Que signifient SLI, SLO et SLA ?&lt;/h2&gt;
&lt;p&gt;Service level indicator, service level objective et service level agreement : indicateur, objectif et accord de niveau de service. L&amp;#39;indicateur est ce que vous mesurez, l&amp;#39;objectif la valeur que vous visez, et l&amp;#39;accord ce que vous promettez à quelqu&amp;#39;un d&amp;#39;autre, avec des conséquences à la clé.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://sre.google/sre-book/service-level-objectives/&quot;&gt;chapitre « Service Level Objectives » du livre SRE&lt;/a&gt; définit un SLA comme « un contrat explicite ou implicite avec vos utilisateurs qui prévoit des conséquences si les SLO qu&amp;#39;il contient sont respectés (ou manqués) ». Le test du chapitre tient en une question : que se passe-t-il si les SLO ne sont pas atteints ? Sans conséquence explicite, vous avez presque certainement affaire à un SLO.&lt;/p&gt;
&lt;p&gt;Le chapitre ajoute que la plupart des gens pensent SLO quand ils disent SLA, et qu&amp;#39;une vraie violation de SLA peut finir en procès pour rupture de contrat. Quand une réunion tourne au débat SLA vs SLO, demandez donc d&amp;#39;abord si une conséquence, en général financière, est inscrite dans un contrat.&lt;/p&gt;
&lt;p&gt;Le livre SRE conseille de garder une marge de sécurité : « un SLO interne plus strict que le SLO annoncé aux utilisateurs vous laisse le temps de réagir aux problèmes chroniques avant qu&amp;#39;ils ne deviennent visibles de l&amp;#39;extérieur ». Son chapitre « Embracing Risk » applique la même idée à un contrat : un objectif externe de 99,9 % adossé à un objectif interne plus exigeant.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;un budget d&amp;#39;erreur ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est 100 % moins le SLO : la part des requêtes ou du temps qui peut échouer dans la fenêtre. Tant qu&amp;#39;il reste du budget, l&amp;#39;équipe continue de livrer ; une fois épuisé, le travail de fiabilité passe en premier.&lt;/p&gt;
&lt;p&gt;Le chapitre &lt;a href=&quot;https://sre.google/workbook/implementing-slos/&quot;&gt;« Implementing SLOs » du workbook SRE&lt;/a&gt; donne le calcul : avec un SLO de 99,9 %, un service qui reçoit 3 millions de requêtes sur quatre semaines peut en faire échouer 3 000, si bien qu&amp;#39;une panne de 1 500 erreurs consomme la moitié du budget. Le chapitre &lt;a href=&quot;https://sre.google/sre-book/embracing-risk/&quot;&gt;« Embracing Risk »&lt;/a&gt; du livre en explique le but : la gestion produit fixe le SLO, le monitoring mesure la disponibilité réelle, et l&amp;#39;écart est la marge de non-fiabilité qui reste pour le trimestre. Quand ce budget est épuisé, les mises en production sont arrêtées ou ralenties.&lt;/p&gt;
&lt;h2&gt;Combien d&amp;#39;indisponibilité permet 99,9 % ?&lt;/h2&gt;
&lt;p&gt;Environ 43 minutes sur une fenêtre de 30 jours. Chaque neuf supplémentaire divise la marge par dix, si bien que 99,99 % laisse à peine plus de 4 minutes.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SLO&lt;/th&gt;
&lt;th&gt;Budget d&amp;#39;erreur&lt;/th&gt;
&lt;th&gt;Indisponibilité sur 30 jours&lt;/th&gt;
&lt;th&gt;Échecs par million&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;99 %&lt;/td&gt;
&lt;td&gt;1 %&lt;/td&gt;
&lt;td&gt;7 h 12 min&lt;/td&gt;
&lt;td&gt;10 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,5 %&lt;/td&gt;
&lt;td&gt;0,5 %&lt;/td&gt;
&lt;td&gt;3 h 36 min&lt;/td&gt;
&lt;td&gt;5 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,9 %&lt;/td&gt;
&lt;td&gt;0,1 %&lt;/td&gt;
&lt;td&gt;43 min 12 s&lt;/td&gt;
&lt;td&gt;1 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,95 %&lt;/td&gt;
&lt;td&gt;0,05 %&lt;/td&gt;
&lt;td&gt;21 min 36 s&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,99 %&lt;/td&gt;
&lt;td&gt;0,01 %&lt;/td&gt;
&lt;td&gt;4 min 19 s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Multipliez les 43 200 minutes d&amp;#39;une fenêtre de 30 jours par le budget d&amp;#39;erreur. Gardez en tête l&amp;#39;avertissement du workbook : chaque neuf supplémentaire coûte plus cher alors que son intérêt pour les utilisateurs tend vers zéro.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble un vrai SLA ?&lt;/h2&gt;
&lt;p&gt;Il fixe un pourcentage mesuré, une période de facturation, un barème de crédits et ce qui ne compte pas. Le SLA Amazon Compute en est un exemple public et court.&lt;/p&gt;
&lt;p&gt;L&amp;#39;&lt;a href=&quot;https://aws.amazon.com/compute/sla/&quot;&gt;Amazon Compute Service Level Agreement&lt;/a&gt; (mis à jour le 25 mai 2022 ; vérifié le 1er novembre 2026) s&amp;#39;engage sur un Monthly Uptime Percentage d&amp;#39;au moins 99,99 % par région pour les instances EC2 réparties sur deux Availability Zones ou plus, et 99,5 % pour une instance seule. La disponibilité vaut 100 % moins la part des minutes pendant lesquelles EC2 était indisponible. Selon le Region-Level SLA, sous 99,99 %, le crédit vaut 10 % de la facture EC2 du mois dans la région, sous 99,0 % il vaut 30 %, et sous 95,0 % il vaut 100 % ; pour une instance seule, le palier à 10 % commence sous 99,5 %. Les crédits s&amp;#39;imputent sur les paiements futurs, doivent être réclamés via le support AWS et constituent le recours « seul et exclusif », sauf disposition contraire du contrat client.&lt;/p&gt;
&lt;p&gt;Rapporté au tableau d&amp;#39;indisponibilité, le palier à 10 % du Region-Level SLA couvre d&amp;#39;environ 4 minutes à 7 heures d&amp;#39;indisponibilité sur un mois de 30 jours. Un SLA plafonne ce que le fournisseur doit ; empêcher les pannes de nuire à vos utilisateurs, c&amp;#39;est le rôle de vos propres objectifs.&lt;/p&gt;
&lt;h2&gt;Comment choisir des SLI pour la latence et la disponibilité ?&lt;/h2&gt;
&lt;p&gt;Mesurez la latence en percentile et la disponibilité en événements réussis divisés par tous les événements, au plus près de l&amp;#39;utilisateur. Les moyennes et les mesures prises au seul serveur masquent les requêtes dont on se plaint.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latence.&lt;/strong&gt; Le livre SRE préfère les percentiles à la moyenne, car une moyenne peut rester plate pendant que les requêtes les plus lentes ralentissent nettement. Le workbook écrit les SLI de latence comme un ratio, par exemple les appels terminés en moins de 100 ms divisés par tous les appels. « 99 % des appels de paiement en moins de 400 ms » revient donc à « p99 du paiement sous 400 ms » sur la fenêtre, ce qui se reporte tel quel dans un test. Notre article sur la &lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;latence de queue&lt;/a&gt; explique pourquoi le p99 compte dès qu&amp;#39;une page appelle plusieurs services.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disponibilité.&lt;/strong&gt; La disponibilité temporelle compte les minutes de fonctionnement, comme le fait le SLA d&amp;#39;AWS. La disponibilité par requêtes compte les requêtes réussies : « Embracing Risk » décrit un service de 2,5 millions de requêtes par jour avec un objectif quotidien de 99,99 %, qui peut renvoyer 250 erreurs et tenir quand même son objectif.&lt;/p&gt;
&lt;h2&gt;Où les SLO dérapent-ils ?&lt;/h2&gt;
&lt;p&gt;Le plus souvent par excès d&amp;#39;objectifs, par des cibles à 100 % et par des indicateurs mesurés là où les utilisateurs ne sont pas. Chacun produit un chiffre sur lequel personne n&amp;#39;agit, ou un chiffre qui semble bon pendant que les utilisateurs souffrent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trop de SLO.&lt;/strong&gt; Le livre SRE conseille d&amp;#39;en avoir le moins possible : si citer un SLO ne permet jamais de gagner une discussion sur les priorités, il ne vaut probablement pas la peine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Des cibles à 100 %.&lt;/strong&gt; Le workbook juge que 100 % est la mauvaise cible : les composants tombent en panne, le changement est la première source de pannes, et un SLO à 100 % ne laisse que le temps de réagir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mesurer seulement au serveur.&lt;/strong&gt; Les métriques serveur ratent des problèmes que les utilisateurs ressentent, comme un script lent dans la page. Le workbook propose de mesurer au load balancer ou côté client.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quel rapport entre le test de charge et les SLO ?&lt;/h2&gt;
&lt;p&gt;Un SLO fournit au test de charge ses critères de réussite, et un test au pic attendu montre si le SLO de latence tiendra avant que ce trafic n&amp;#39;arrive. Le monitoring de production ne vous le dit qu&amp;#39;après coup.&lt;/p&gt;
&lt;p&gt;Le livre SRE note qu&amp;#39;un nombre plus élevé de requêtes par seconde (QPS) entraîne souvent des latences plus grandes et que les services présentent fréquemment une falaise de performance au-delà d&amp;#39;un certain seuil de charge. Un test de charge peut trouver cette falaise s&amp;#39;il tourne au pic attendu, avec un mélange de requêtes réaliste, et mesure le SLI qu&amp;#39;utilise le SLO. Fixez chaque seuil du test un peu plus strict que le SLO, comme le décrit notre guide des &lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;critères de réussite d&amp;#39;un test de charge&lt;/a&gt;. Une exécution dure quelques minutes et ne peut donc pas mesurer une disponibilité mensuelle.&lt;/p&gt;
&lt;p&gt;LoadFocus, qui publie ce site, juge les tests de charge sur des &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/pass-fail-thresholds?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=slo-vs-sla&quot;&gt;seuils de réussite&lt;/a&gt; enregistrés sur le test : Max P95 et Max P99 du temps de réponse, un taux d&amp;#39;erreur maximal et un débit minimal, pour les tests cloud, JMeter et k6. Son monitoring d&amp;#39;API propose des &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/api-monitoring/sla-slo-reports?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=slo-vs-sla&quot;&gt;rapports SLA et SLO&lt;/a&gt; qui fixent un objectif SLO par moniteur et affichent la disponibilité, le budget d&amp;#39;erreur consommé et un statut OK ou Dépassé.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Que signifie SLO ?&lt;/strong&gt;
Service level objective, ou objectif de niveau de service : une valeur cible pour un niveau de service mesuré, par exemple 99,9 % de requêtes réussies sur quatre semaines. Il est fixé en interne, par le produit et l&amp;#39;ingénierie, et n&amp;#39;entraîne en soi aucune pénalité contractuelle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Peut-on avoir un SLO sans SLA ?&lt;/strong&gt;
Oui. Le livre SRE cite la recherche Google comme un service important sans SLA public, qui est pourtant piloté avec des SLI et des SLO.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un SLO devrait-il valoir 100 % ?&lt;/strong&gt;
Non. Un objectif de 100 % ne laisse aucun budget d&amp;#39;erreur, si bien que chaque échec l&amp;#39;enfreint et qu&amp;#39;aucun changement n&amp;#39;est jamais sûr à livrer.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;Critères de réussite d&amp;#39;un test de charge : comment les fixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/apdex-score/&quot;&gt;Score Apdex : définition et méthode de calcul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>TPC-H : ce que mesure le benchmark et comment le lancer</title><link>https://loadtest.app/fr/tpc-h/</link><guid isPermaLink="true">https://loadtest.app/fr/tpc-h/</guid><description>TPC-H expliqué : 8 tables, 22 requêtes, facteur d&apos;échelle, QphH, tests de puissance et de débit, exécutions auditées ou non, et quand préférer TPC-DS.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;TPC-H est le benchmark d&amp;#39;aide à la décision du Transaction Processing Performance Council (TPC) : 22 requêtes métier et deux fonctions de rafraîchissement s&amp;#39;exécutent sur huit tables que le programme dbgen du TPC remplit selon un facteur d&amp;#39;échelle choisi, le facteur 1 correspondant à environ 1 Go. Sa métrique, QphH@Size, combine un test de puissance à un seul flux et un test de débit à plusieurs flux, et les résultats officiels ajoutent un prix par kQphH@Size. Seuls les résultats audités publiés sur tpc.org sont officiels ; tout chiffre de type TPC-H publié hors de tpc.org compte comme une charge dérivée selon les règles d&amp;#39;usage loyal du TPC et ne doit pas être comparé aux résultats officiels.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas exécuté le benchmark pour ce guide. Les faits proviennent de tpc.org, de la spécification en révision 3.0.1, que tpc.org désigne comme actuelle, et de la documentation de chaque outil, le tout vérifié le 1er novembre 2026. Les appréciations sont les nôtres.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;TPC-H&lt;/th&gt;
&lt;th&gt;TPC-C&lt;/th&gt;
&lt;th&gt;TPC-DS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Charge&lt;/td&gt;
&lt;td&gt;Aide à la décision : requêtes ad hoc plus mises à jour des données&lt;/td&gt;
&lt;td&gt;OLTP : les commandes d&amp;#39;un grossiste&lt;/td&gt;
&lt;td&gt;Aide à la décision : requêtes plus maintenance des données&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Périmètre&lt;/td&gt;
&lt;td&gt;8 tables, 22 requêtes, 2 fonctions de rafraîchissement&lt;/td&gt;
&lt;td&gt;9 types de tables, 5 types de transactions&lt;/td&gt;
&lt;td&gt;Schéma en flocon, 7 tables de faits, 99 requêtes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Métrique principale&lt;/td&gt;
&lt;td&gt;QphH@Size et $/kQphH@Size&lt;/td&gt;
&lt;td&gt;tpmC&lt;/td&gt;
&lt;td&gt;QphDS@SF et $/kQphDS@SF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version actuelle&lt;/td&gt;
&lt;td&gt;3.0.1&lt;/td&gt;
&lt;td&gt;5.11.0&lt;/td&gt;
&lt;td&gt;4.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Que mesure TPC-H ?&lt;/h2&gt;
&lt;p&gt;La vitesse à laquelle un système répond à des requêtes analytiques complexes sur un gros volume de données, pendant que de nouvelles ventes arrivent et que d&amp;#39;anciennes sont supprimées. Une seule spécification définit le schéma, les requêtes, les données et les règles.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.tpc.org/tpch/&quot;&gt;page TPC-H&lt;/a&gt; décrit une suite de requêtes ad hoc orientées métier accompagnées de modifications de données simultanées (vérifié le 1er novembre 2026). La &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf&quot;&gt;spécification&lt;/a&gt; définit huit tables : PART, PARTSUPP, LINEITEM, ORDERS, CUSTOMER, SUPPLIER, NATION et REGION. Toutes sauf les deux dernières grandissent avec le facteur d&amp;#39;échelle ; LINEITEM, la plus grande, compte environ 6 000 000 de lignes par unité. La fonction de rafraîchissement RF1 insère de nouvelles lignes dans ORDERS et LINEITEM, et RF2 supprime d&amp;#39;anciennes ventes (vérifié le 1er novembre 2026).&lt;/p&gt;
&lt;h2&gt;Comment le score TPC-H est-il calculé ?&lt;/h2&gt;
&lt;p&gt;Une exécution enchaîne un test de puissance puis un test de débit, et QphH@Size est la moyenne géométrique des deux résultats. La métrique de prix est le prix total du système divisé par QphH@Size, multiplié par 1 000.&lt;/p&gt;
&lt;p&gt;Dans le test de puissance, un flux de rafraîchissement exécute RF1, une session de requêtes unique exécute les 22 requêtes une fois, puis le flux de rafraîchissement exécute RF2. Power@Size vaut 3 600 fois le facteur d&amp;#39;échelle, divisé par la moyenne géométrique de ces 24 durées. Dans le test de débit, plusieurs flux de requêtes tournent à côté d&amp;#39;un flux de rafraîchissement : au moins 2 au facteur 1, jusqu&amp;#39;à 11 au facteur 100 000. Throughput@Size correspond aux requêtes par heure sur l&amp;#39;ensemble des flux, multipliées par le facteur d&amp;#39;échelle. Un test complet comporte deux exécutions, et le sponsor publie celle dont le QphH est le plus bas (le tout d&amp;#39;après la &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf&quot;&gt;spécification&lt;/a&gt;, vérifié le 1er novembre 2026).&lt;/p&gt;
&lt;p&gt;La moyenne géométrique donne le même poids à chaque requête : diviser par deux la durée d&amp;#39;une seule requête n&amp;#39;augmente Power que d&amp;#39;environ 3 %. Un résultat officiel utilise un facteur d&amp;#39;échelle pris dans une liste fixe : 1, 10, 30, 100 et ainsi de suite jusqu&amp;#39;à 100 000.&lt;/p&gt;
&lt;h2&gt;Qui publie les résultats TPC-H, et lesquels comptent ?&lt;/h2&gt;
&lt;p&gt;Les éditeurs qui parrainent un test publient des résultats audités sur tpc.org, et seuls ceux-là sont officiels. Toute autre exécution est une charge dérivée, soumise à ses propres règles.&lt;/p&gt;
&lt;p&gt;La spécification impose un audit indépendant par un auditeur certifié par le TPC. Le &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/Fair_Use_Quick_Reference_v1.0.0.pdf&quot;&gt;guide rapide sur l&amp;#39;usage loyal (fair use)&lt;/a&gt; du TPC n&amp;#39;autorise le nom du TPC à côté de résultats que pour les résultats officiels publiés. Tout le reste doit porter le préfixe « Derived from », ne peut pas utiliser la métrique du TPC, doit afficher un avertissement indiquant qu&amp;#39;il n&amp;#39;est pas comparable aux résultats publiés, devrait décrire son environnement et ses écarts, et ne peut pas être comparé aux résultats officiels (vérifié le 1er novembre 2026).&lt;/p&gt;
&lt;h2&gt;Comment lancer TPC-H vous-même ?&lt;/h2&gt;
&lt;p&gt;Générez les données et le texte des requêtes, chargez les tables, puis lancez le test de puissance suivi du test de débit. Vous pouvez utiliser les outils du TPC, un kit conçu pour une base de données précise ou un moteur doté d&amp;#39;un générateur intégré.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.tpc.org/tpc_documents_current_versions/current_specifications5.asp&quot;&gt;page des spécifications actuelles&lt;/a&gt; du TPC propose un paquet d&amp;#39;outils gratuit : vous vous inscrivez, acceptez une licence et recevez le lien par e-mail. Selon la spécification, DBGen doit produire les données et QGen le texte des requêtes (vérifié le 1er novembre 2026).&lt;/p&gt;
&lt;p&gt;Pour PostgreSQL, la &lt;a href=&quot;https://wiki.postgresql.org/wiki/TPC-H&quot;&gt;page TPC-H du wiki&lt;/a&gt; ne donne pas de procédure pas à pas et renvoie vers &lt;a href=&quot;https://wiki.postgresql.org/wiki/DBT-3&quot;&gt;DBT-3&lt;/a&gt;, un kit complet que la page DBT-3 du wiki présente comme une implémentation de la spécification conforme à l&amp;#39;usage loyal. &lt;strong&gt;HammerDB&lt;/strong&gt; fournit TPROC-H, que sa &lt;a href=&quot;https://www.hammerdb.com/docs/ch11s01.html&quot;&gt;documentation&lt;/a&gt; décrit comme une charge open source dérivée de TPC-H et non comparable aux résultats publiés. Il fonctionne sur PostgreSQL, MySQL, Oracle et d&amp;#39;autres moteurs, et la documentation recommande de comparer la &lt;a href=&quot;https://www.hammerdb.com/docs/ch11s02.html&quot;&gt;moyenne géométrique des durées de requêtes&lt;/a&gt; plutôt que de calculer un QphH (le tout vérifié le 1er novembre 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DuckDB&lt;/strong&gt; dispose d&amp;#39;une extension &lt;code&gt;tpch&lt;/code&gt; qui, d&amp;#39;après sa &lt;a href=&quot;https://duckdb.org/docs/stable/core_extensions/tpch&quot;&gt;documentation&lt;/a&gt;, implémente le générateur de données et les requêtes. Ces lignes génèrent le facteur 1, exécutent la requête 4 et listent les 22 requêtes :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CALL dbgen(sf = 1);
PRAGMA tpch(4);
FROM tpch_queries();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La même page prévient que les données diffèrent légèrement de la spécification, que chaque requête s&amp;#39;exécute avec des paramètres fixes et que &lt;code&gt;dbgen&lt;/code&gt; ne supprime pas les tables existantes. Pour des données entièrement conformes, elle renvoie vers &lt;code&gt;tpchgen-cli&lt;/code&gt; (vérifié le 1er novembre 2026).&lt;/p&gt;
&lt;h2&gt;Comment lire honnêtement des résultats TPC-H ?&lt;/h2&gt;
&lt;p&gt;Ne comparez des résultats qu&amp;#39;au même facteur d&amp;#39;échelle et dans la même version du benchmark, et lisez chaque métrique avec son suffixe de taille. Un graphique de durées de requêtes isolées ne montre ni le test de puissance ni le test de débit.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.tpc.org/tpch/results/tpch_results5.asp&quot;&gt;page des résultats&lt;/a&gt; regroupe les résultats par taille de base et porte trois mentions : les résultats des versions 2 et 3 ne sont pas comparables, le rapport prix/performance dans des devises différentes ne doit pas être comparé, et les comparaisons entre tailles de base sont trompeuses (vérifié le 1er novembre 2026). La spécification ajoute que des résultats avec des nombres de flux différents sont comparables à taille de base égale.&lt;/p&gt;
&lt;p&gt;Pour une exécution informelle, cherchez ce que demandent les règles d&amp;#39;usage loyal : matériel et mémoire, modifications du schéma ou du texte des requêtes, et présence ou non des fonctions de rafraîchissement. Un article qui chronomètre les 22 requêtes une seule fois, cache chaud, sans flux de rafraîchissement, ne couvre que le volet requêtes d&amp;#39;un test de puissance, même si une telle exécution reste utile pour suivre vos propres régressions. Sur le lien entre cadence de requêtes et temps de réponse, voir &lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;débit vs latence&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Quand utiliser autre chose que TPC-H ?&lt;/h2&gt;
&lt;p&gt;Quand la charge est transactionnelle, quand vous voulez un benchmark analytique plus récent, ou quand la question porte sur ce que vivent les utilisateurs. Le benchmark modélise une charge analytique, sans transactions courtes ni couche applicative.&lt;/p&gt;
&lt;p&gt;Choisissez &lt;strong&gt;TPC-DS&lt;/strong&gt; pour un test d&amp;#39;aide à la décision plus large : sa &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-DS_v4.0.0.pdf&quot;&gt;spécification en version 4.0.0&lt;/a&gt; utilise un schéma en flocon avec sept tables de faits et 99 requêtes, et sa &lt;a href=&quot;https://www.tpc.org/tpcds/&quot;&gt;page de présentation&lt;/a&gt; indique que les résultats de la version 4 ne sont pas comparables aux versions précédentes. Choisissez &lt;strong&gt;TPC-C&lt;/strong&gt;, ou le TPROC-C de HammerDB, pour de l&amp;#39;OLTP de type saisie de commandes : la &lt;a href=&quot;https://www.tpc.org/tpcc/&quot;&gt;page TPC-C&lt;/a&gt; décrit cinq types de transactions mesurés en tpmC (le tout vérifié le 1er novembre 2026). Pour un contrôle rapide d&amp;#39;une seule base, &lt;a href=&quot;https://loadtest.app/fr/pgbench/&quot;&gt;pgbench&lt;/a&gt; couvre PostgreSQL et &lt;a href=&quot;https://loadtest.app/fr/sysbench/&quot;&gt;sysbench&lt;/a&gt; couvre MySQL.&lt;/p&gt;
&lt;p&gt;LoadFocus, qui publie ce site, n&amp;#39;exécute pas TPC-H ; ses tests visent des endpoints web et API. LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tpc-h&quot;&gt;exécute des plans de test JMeter et des scripts k6&lt;/a&gt; depuis 25 régions cloud, sans pilote JDBC ni module SQL, et ne peut donc pas se connecter à la base de données. Pour ce travail, choisissez un outil de benchmark de base de données comme l&amp;#39;extension de DuckDB, DBT-3 ou HammerDB plutôt que LoadFocus, et utilisez LoadFocus pour la couche web ou API placée devant la base, en partant de son &lt;a href=&quot;https://loadfocus.com/fr-fr/templates/load-testing-for-database-query-performance?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tpc-h&quot;&gt;modèle pour les endpoints derrière les requêtes lourdes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre TPC-H et TPC-DS ?&lt;/strong&gt;
Ce sont deux benchmarks d&amp;#39;aide à la décision du TPC. TPC-H utilise 8 tables et 22 requêtes et publie QphH@Size, tandis que TPC-DS utilise un schéma en flocon avec sept tables de faits et 99 requêtes et publie QphDS@SF.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que signifie QphH@Size dans TPC-H ?&lt;/strong&gt;
C&amp;#39;est la métrique composite de requêtes par heure : la moyenne géométrique des résultats du test de puissance et du test de débit pour une taille de base donnée. Le suffixe indique cette taille, par exemple QphH@1000GB, et des résultats obtenus à des tailles différentes ne doivent pas être comparés.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter TPC-H ?&lt;/strong&gt;
Non. LoadFocus exécute des plans de test JMeter et des scripts k6 visant des endpoints web et API et n&amp;#39;a pas de connexion SQL : utilisez un outil de benchmark de base de données pour TPC-H et LoadFocus pour la couche applicative placée devant la base.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/pgbench/&quot;&gt;pgbench : benchmark et test de charge de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/sysbench/&quot;&gt;Utiliser sysbench : benchmarks CPU, disque et MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/ycsb/&quot;&gt;YCSB : charges de travail A-F, exécution et limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/redis-benchmark/&quot;&gt;redis-benchmark : l&amp;#39;utiliser et lire ses résultats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>pgbench : benchmark et test de charge de PostgreSQL</title><link>https://loadtest.app/fr/pgbench/</link><guid isPermaLink="true">https://loadtest.app/fr/pgbench/</guid><description>pgbench expliqué : initialiser avec -s, lancer avec -c, -j et -T, écrire ses scripts, limiter le débit avec -R et lire tps, latence et échecs.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;pgbench est le programme de benchmark livré avec PostgreSQL : il exécute la même transaction SQL encore et encore dans plusieurs sessions de base de données simultanées et rapporte les transactions par seconde et la latence. Vous créez ses tables de test avec &lt;code&gt;pgbench -i -s 50 mydb&lt;/code&gt;, puis une commande comme &lt;code&gt;pgbench -c 10 -j 2 -T 300 mydb&lt;/code&gt; lance dix clients sur deux threads pendant cinq minutes. Il mesure la base de données seule, et ne dit donc rien de ce que vivent les utilisateurs à travers l&amp;#39;application placée devant.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas exécuté pgbench pour ce guide. Les faits proviennent de la page pgbench de la documentation de PostgreSQL 18, la version que postgresql.org désigne comme actuelle, vérifiés le 31 octobre 2026, et les appréciations sont les nôtres.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Effet&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt; / &lt;code&gt;-s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Créer les tables de test / facteur d&amp;#39;échelle (100 000 comptes par unité)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clients, c&amp;#39;est-à-dire sessions de base de données simultanées (1 par défaut)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-j&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Threads de travail dans pgbench (1 par défaut)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-T&lt;/code&gt; / &lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Durée en secondes, ou nombre de transactions par client (10 par défaut)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-b&lt;/code&gt; / &lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Script intégré ou fichier à vous, avec un &lt;code&gt;@poids&lt;/code&gt; facultatif&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rapport de progression toutes les N secondes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-R&lt;/code&gt; / &lt;code&gt;-L&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Débit visé en tps / limite de latence en ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-r&lt;/code&gt; / &lt;code&gt;-l&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Latences par instruction / une ligne de journal par transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Que mesure pgbench ?&lt;/h2&gt;
&lt;p&gt;Il exécute un script de transaction encore et encore dans un nombre fixé de sessions de base de données, puis rapporte le taux moyen de transactions et la latence. Le script par défaut s&amp;#39;inspire librement du benchmark bancaire TPC-B.&lt;/p&gt;
&lt;p&gt;D&amp;#39;après la &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;documentation de pgbench&lt;/a&gt;, le scénario par défaut est inspiré de TPC-B sans être vraiment TPC-B, d&amp;#39;où son nom : la sortie l&amp;#39;appelle &lt;code&gt;TPC-B (sort of)&lt;/code&gt; (vérifié le 31 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment préparer une base pour pgbench ?&lt;/h2&gt;
&lt;p&gt;Lancez &lt;code&gt;pgbench -i&lt;/code&gt; sur une base existante, avec &lt;code&gt;-s&lt;/code&gt; pour le facteur d&amp;#39;échelle. La commande crée quatre tables et supprime toute table existante portant le même nom : donnez-lui une base à part.&lt;/p&gt;
&lt;p&gt;Au facteur 1, &lt;code&gt;pgbench_branches&lt;/code&gt; contient une ligne, &lt;code&gt;pgbench_tellers&lt;/code&gt; 10, &lt;code&gt;pgbench_accounts&lt;/code&gt; 100 000 et &lt;code&gt;pgbench_history&lt;/code&gt; aucune, et &lt;code&gt;-s&lt;/code&gt; multiplie ces lignes : &lt;code&gt;-s 100&lt;/code&gt; donne 10 000 000 de lignes dans &lt;code&gt;pgbench_accounts&lt;/code&gt;. La documentation n&amp;#39;indique aucune taille sur disque, mesurez-la donc après l&amp;#39;initialisation (vérifié le 31 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quels scripts intégrés pgbench propose-t-il ?&lt;/h2&gt;
&lt;p&gt;Trois : &lt;code&gt;tpcb-like&lt;/code&gt; (par défaut), &lt;code&gt;simple-update&lt;/code&gt; et &lt;code&gt;select-only&lt;/code&gt;. Vous en choisissez un avec &lt;code&gt;-b&lt;/code&gt;, ou avec les raccourcis &lt;code&gt;-N&lt;/code&gt; et &lt;code&gt;-S&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Le script par défaut envoie sept commandes par transaction : &lt;code&gt;BEGIN&lt;/code&gt;, un update et un select sur un compte au hasard, des updates sur &lt;code&gt;pgbench_tellers&lt;/code&gt; et &lt;code&gt;pgbench_branches&lt;/code&gt;, un insert dans &lt;code&gt;pgbench_history&lt;/code&gt;, puis &lt;code&gt;END&lt;/code&gt;. &lt;code&gt;simple-update&lt;/code&gt; retire les deux updates sur les petites tables, ce qui y évite la contention et, selon la documentation, éloigne encore le test de TPC-B. &lt;code&gt;select-only&lt;/code&gt; n&amp;#39;envoie que le select.&lt;/p&gt;
&lt;h2&gt;Comment écrire un script pgbench personnalisé ?&lt;/h2&gt;
&lt;p&gt;Mettez votre SQL dans un fichier, définissez des variables avec &lt;code&gt;\set&lt;/code&gt; et les fonctions aléatoires, et passez le fichier avec &lt;code&gt;-f&lt;/code&gt;. Chaque exécution du fichier compte comme une transaction.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;\set aid random(1, 100000 * :scale)
\set delta random(-5000, 5000)
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta
  WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
END;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un poids après &lt;code&gt;@&lt;/code&gt; fixe la fréquence de choix de chaque script : &lt;code&gt;-f update.sql@9 -b select-only@1&lt;/code&gt; choisit le fichier environ neuf fois sur dix. La documentation liste aussi &lt;code&gt;random_exponential&lt;/code&gt;, &lt;code&gt;random_gaussian&lt;/code&gt; et &lt;code&gt;random_zipfian&lt;/code&gt;, qui permettent de rendre quelques lignes très sollicitées. &lt;code&gt;\sleep&lt;/code&gt; ajoute une pause, l&amp;#39;équivalent côté base de données du &lt;a href=&quot;https://loadtest.app/fr/think-time-in-load-testing/&quot;&gt;temps de réflexion&lt;/a&gt;. Si vous n&amp;#39;exécutez que vos propres fichiers, passez le facteur d&amp;#39;échelle de la base avec &lt;code&gt;-s&lt;/code&gt;, sinon &lt;code&gt;:scale&lt;/code&gt; reste à 1 et le script ci-dessus ne touche que les 100 000 premiers comptes. Avec vos propres tables, omettez &lt;code&gt;-i&lt;/code&gt; et ajoutez &lt;code&gt;-n&lt;/code&gt; pour que pgbench ne lance pas de VACUUM sur les tables standard (vérifié le 31 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quelles options font de pgbench un test de charge ?&lt;/h2&gt;
&lt;p&gt;La concurrence vient de &lt;code&gt;-c&lt;/code&gt; et &lt;code&gt;-j&lt;/code&gt;, la durée de &lt;code&gt;-T&lt;/code&gt; et la forme de la charge de &lt;code&gt;-R&lt;/code&gt;. Sans &lt;code&gt;-R&lt;/code&gt;, chaque client lance sa transaction suivante dès que la précédente se termine.&lt;/p&gt;
&lt;p&gt;Ce comportement par défaut correspond à un modèle de charge fermé, expliqué dans notre article sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt;. Avec &lt;code&gt;-R&lt;/code&gt;, pgbench lance les transactions selon un calendrier à distribution de Poisson qui avance à partir du démarrage du client, quel que soit le sort des transactions précédentes. La latence rapportée compte alors à partir de chaque départ prévu et inclut donc le retard sur le calendrier (schedule lag), dont la moyenne et le maximum sont affichés à part : c&amp;#39;est la correction que décrit notre article sur la &lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;. Le nombre de clients reste fixe ; si le retard ne cesse de grandir, le système ne tient pas ce débit avec les clients et threads choisis : baissez &lt;code&gt;-R&lt;/code&gt; ou ajoutez des clients.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--latency-limit&lt;/code&gt; (&lt;code&gt;-L&lt;/code&gt;) compte comme en retard les transactions qui dépassent une limite en millisecondes ; avec &lt;code&gt;-R&lt;/code&gt;, pgbench saute en plus les transactions déjà trop en retard sur le calendrier et les rapporte comme ignorées. &lt;code&gt;-M prepared&lt;/code&gt; utilise des requêtes préparées, plus rapides que les autres modes selon la documentation (vérifié le 31 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment lire la sortie de pgbench ?&lt;/h2&gt;
&lt;p&gt;Le résumé liste les réglages, les transactions traitées et en échec, la latence moyenne, le temps de connexion initial et le tps. La forme ci-dessous vient de la documentation, sans les chiffres :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;transaction type: &amp;lt;builtin: TPC-B (sort of)&amp;gt;
number of transactions actually processed: ...
number of failed transactions: ... (...%)
latency average = ... ms
latency stddev = ... ms   (only with -P, -R or -L)
initial connection time = ... ms
tps = ... (without initial connection time)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les transactions en échec sont des erreurs de sérialisation ou des deadlocks, que &lt;code&gt;--max-tries&lt;/code&gt; peut relancer. Les autres erreurs SQL interrompent le client concerné et donnent un code de sortie 2. Le résumé ne donne aucun percentile : pour la &lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;latence de queue&lt;/a&gt;, journalisez chaque transaction avec &lt;code&gt;-l&lt;/code&gt;, qui enregistre sa durée en microsecondes, et calculez vous-même le p95 ou le p99.&lt;/p&gt;
&lt;p&gt;Sans &lt;code&gt;-P&lt;/code&gt;, &lt;code&gt;-R&lt;/code&gt; ou &lt;code&gt;-L&lt;/code&gt;, la latence moyenne du résumé n&amp;#39;est pas mesurée : pgbench la déduit de la durée du test et du nombre de clients, soit la &lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;loi de Little&lt;/a&gt; appliquée à l&amp;#39;envers, échecs compris. Ajoutez &lt;code&gt;-P&lt;/code&gt; quand la latence compte.&lt;/p&gt;
&lt;h2&gt;Comment obtenir des chiffres pgbench fiables ?&lt;/h2&gt;
&lt;p&gt;Faites durer chaque exécution plusieurs minutes, répétez-la, gardez un facteur d&amp;#39;échelle au moins égal au nombre de clients et surveillez le VACUUM. Si pgbench devient lui-même le goulot d&amp;#39;étranglement, déplacez-le sur une autre machine.&lt;/p&gt;
&lt;p&gt;La première consigne de la section « Good Practices » de la documentation met en garde contre tout test qui ne dure que quelques secondes, et ajoute que des chiffres reproductibles peuvent demander des heures (vérifié le 31 octobre 2026). Avec le script par défaut, un facteur d&amp;#39;échelle inférieur au nombre de clients mesure surtout la contention des updates, car &lt;code&gt;pgbench_branches&lt;/code&gt; n&amp;#39;a que &lt;code&gt;-s&lt;/code&gt; lignes et chaque transaction en modifie une. Les lignes mortes et l&amp;#39;autovacuum font varier les résultats d&amp;#39;une exécution à l&amp;#39;autre. Avec beaucoup de sessions, pgbench peut saturer sa propre machine : lancez-le sur une machine séparée avec une faible latence réseau, ou répartissez plusieurs instances sur plusieurs machines.&lt;/p&gt;
&lt;h2&gt;Quand pgbench n&amp;#39;est-il pas le bon outil ?&lt;/h2&gt;
&lt;p&gt;Quand la question porte sur les utilisateurs, sur une autre base de données ou sur un mélange OLTP standard. pgbench mesure PostgreSQL seul, sans votre pool de connexions, votre ORM, votre cache ni votre couche HTTP.&lt;/p&gt;
&lt;p&gt;Pour voir ce que vivent les utilisateurs, mettez sous charge la couche HTTP ou API placée devant. LoadFocus, qui publie ce site, n&amp;#39;exécute pas pgbench et ne peut pas se connecter directement à PostgreSQL : LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=pgbench&quot;&gt;exécute des plans de test JMeter et des scripts k6&lt;/a&gt; depuis 25 régions cloud contre des endpoints web et API, et son &lt;a href=&quot;https://loadfocus.com/fr-fr/templates/load-testing-for-database-query-performance?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=pgbench&quot;&gt;modèle pour les endpoints derrière les requêtes lourdes&lt;/a&gt; offre un point de départ.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;sysbench&lt;/strong&gt; pour MySQL : son &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;dépôt&lt;/a&gt; décrit un outil de benchmark scriptable et multithread, avec des tests de base de données de type OLTP. Choisissez &lt;strong&gt;HammerDB&lt;/strong&gt; pour un mélange de type TPC-C : sa &lt;a href=&quot;https://www.hammerdb.com/docs/ch03.html&quot;&gt;documentation&lt;/a&gt; décrit TPROC-C, une charge dérivée de TPC-C, qu&amp;#39;il exécute sur &lt;a href=&quot;https://www.hammerdb.com/&quot;&gt;PostgreSQL et d&amp;#39;autres moteurs&lt;/a&gt;. Choisissez &lt;strong&gt;JMeter&lt;/strong&gt; avec son &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html&quot;&gt;sampler JDBC Request&lt;/a&gt; pour mêler SQL et HTTP dans un même plan de test sur vos propres machines (le tout vérifié le 31 octobre 2026).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;À quoi sert l&amp;#39;option -s de pgbench ?&lt;/strong&gt;
Elle fixe le facteur d&amp;#39;échelle à l&amp;#39;initialisation. Chaque unité ajoute 100 000 lignes à pgbench_accounts, donc -s 100 crée 10 000 000 de lignes. Avec le script par défaut, gardez-le au moins égal à votre nombre de clients.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre -c et -j dans pgbench ?&lt;/strong&gt;
L&amp;#39;option -c fixe le nombre de clients simulés, chacun étant une session de base de données simultanée. L&amp;#39;option -j fixe le nombre de threads de travail de pgbench qui se partagent ces clients.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter pgbench ?&lt;/strong&gt;
Non. LoadFocus exécute des plans de test JMeter et des scripts k6 et n&amp;#39;a pas de connexion directe à PostgreSQL : avec lui, vous mettez sous charge la couche web ou API placée devant la base de données.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;Coordinated omission : ce que c&amp;#39;est et comment l&amp;#39;éviter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;Loi de Little en test de charge : dimensionner et vérifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/sysbench/&quot;&gt;Utiliser sysbench : benchmarks CPU, disque et MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/ycsb/&quot;&gt;YCSB : charges de travail A-F, exécution et limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/redis-benchmark/&quot;&gt;redis-benchmark : l&amp;#39;utiliser et lire ses résultats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tpc-h/&quot;&gt;TPC-H : ce que mesure le benchmark et comment le lancer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>redis-benchmark : l&apos;utiliser et lire ses résultats</title><link>https://loadtest.app/fr/redis-benchmark/</link><guid isPermaLink="true">https://loadtest.app/fr/redis-benchmark/</guid><description>Utiliser redis-benchmark : options clés, lire le débit et la latence affichés, l&apos;effet du pipelining et du nombre de clients, et l&apos;écart avec votre app.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;redis-benchmark est l&amp;#39;utilitaire de benchmark livré avec Redis : il ouvre un certain nombre de connexions clientes (50 par défaut), envoie un nombre fixe de commandes (100 000 par défaut) et indique, pour chaque test, les requêtes par seconde et la latence. Lancez &lt;code&gt;redis-benchmark -q -n 100000&lt;/code&gt; contre un serveur en marche, limitez-le avec &lt;code&gt;-t&lt;/code&gt; aux commandes qui vous intéressent, et lisez le résultat comme la vitesse d&amp;#39;une seule instance Redis face à des commandes synthétiques. Votre application ajoute son propre chemin réseau, sa bibliothèque cliente et son mélange de commandes : attendez-vous à d&amp;#39;autres chiffres.&lt;/p&gt;
&lt;p&gt;Nous l&amp;#39;avons exécuté le 31 octobre 2026 sur un portable Apple M1 Max, serveur et client Redis 7.2.6 sur la même machine via loopback, sans persistance. Chaque ligne correspond à une exécution de 100 000 requêtes, avec les requêtes par seconde arrondies au millier ; le p50 est reproduit tel qu&amp;#39;affiché.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exécution&lt;/th&gt;
&lt;th&gt;Ce qui change&lt;/th&gt;
&lt;th&gt;Requêtes par seconde&lt;/th&gt;
&lt;th&gt;p50 (ms)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set,get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rien : 50 clients, valeurs de 3 octets&lt;/td&gt;
&lt;td&gt;SET 113 000, GET 118 000&lt;/td&gt;
&lt;td&gt;0,367 ; 0,351&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set,get -P 16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16 commandes par aller-retour&lt;/td&gt;
&lt;td&gt;SET 1 010 000, GET 1 190 000&lt;/td&gt;
&lt;td&gt;0,711 ; 0,583&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set,get -c 200&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;200 clients&lt;/td&gt;
&lt;td&gt;SET 117 000, GET 123 000&lt;/td&gt;
&lt;td&gt;1,135 ; 1,071&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set -d 1024&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Valeurs de 1 024 octets&lt;/td&gt;
&lt;td&gt;SET 114 000&lt;/td&gt;
&lt;td&gt;0,367&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set -r 100000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clés aléatoires parmi 100 000&lt;/td&gt;
&lt;td&gt;SET 116 000&lt;/td&gt;
&lt;td&gt;0,359&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;script load &amp;quot;...&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Une commande personnalisée&lt;/td&gt;
&lt;td&gt;106 000&lt;/td&gt;
&lt;td&gt;0,415&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Comment lancer redis-benchmark ?&lt;/h2&gt;
&lt;p&gt;Pointez l&amp;#39;outil vers un serveur en marche avec &lt;code&gt;-h&lt;/code&gt; et &lt;code&gt;-p&lt;/code&gt; ; sans option, il exécute sa série de tests par défaut contre 127.0.0.1:6379. Ajoutez &lt;code&gt;-t&lt;/code&gt; pour choisir les tests et &lt;code&gt;-q&lt;/code&gt; pour obtenir une ligne par test.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;redis-benchmark -h 10.0.0.12 -p 6379 -c 50 -n 100000 \
  -t set,get -q
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/benchmarks/&quot;&gt;page officielle sur le benchmark de Redis&lt;/a&gt; et la sortie &lt;code&gt;--help&lt;/code&gt; de la version 7.2.6 listent notamment ces options (vérifié le 31 octobre 2026) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt; connexions parallèles (50 par défaut) et &lt;code&gt;-n&lt;/code&gt; nombre total de requêtes (100 000 par défaut).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; taille des valeurs SET et GET en octets (3 par défaut).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-P&lt;/code&gt; commandes par pipeline (1 par défaut, sans pipelining).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt; une liste de tests séparés par des virgules ; &lt;code&gt;-q&lt;/code&gt; sortie réduite ; &lt;code&gt;--csv&lt;/code&gt; sortie CSV.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-r&lt;/code&gt; clés aléatoires dans un espace de clés de cette taille. Sans cette option, toutes les commandes utilisent la même clé.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-k 1&lt;/code&gt; garde les connexions ouvertes (par défaut), &lt;code&gt;-k 0&lt;/code&gt; se reconnecte.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--threads&lt;/code&gt; active le mode multithread ; &lt;code&gt;--cluster&lt;/code&gt; active le mode cluster, où &lt;code&gt;-c&lt;/code&gt; doit être au moins égal au nombre de nœuds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Comment lire la sortie de redis-benchmark ?&lt;/h2&gt;
&lt;p&gt;Avec &lt;code&gt;-q&lt;/code&gt;, vous obtenez une ligne par test : les requêtes par seconde et la latence médiane. Sans &lt;code&gt;-q&lt;/code&gt;, chaque test affiche ses réglages, une distribution des latences par percentile et un résumé avec la moyenne, le minimum, p50, p95, p99 et le maximum.&lt;/p&gt;
&lt;p&gt;L&amp;#39;en-tête affiche aussi les réglages &lt;code&gt;save&lt;/code&gt; et &lt;code&gt;appendonly&lt;/code&gt; du serveur, qui vous disent si la persistance faisait partie du test. Notre exécution GET complète a donné 119 617 requêtes par seconde, une moyenne de 0,352 ms, un p95 de 0,559 ms, un p99 de 0,623 ms et un maximum de 0,759 ms. Une requête qui appelle Redis de nombreuses fois a plus de chances de tomber sur un appel lent : regardez donc aussi le p99, comme l&amp;#39;explique notre article sur la &lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;latence de queue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--csv&lt;/code&gt; affiche le résumé sous forme d&amp;#39;une ligne par test. Répétez les exécutions avant de croire à un petit écart : deux exécutions du même test SET nous ont donné environ 113 000 et 125 000 requêtes par seconde.&lt;/p&gt;
&lt;h2&gt;Pourquoi le pipelining change-t-il autant les chiffres ?&lt;/h2&gt;
&lt;p&gt;Sans &lt;code&gt;-P&lt;/code&gt;, chaque client attend une réponse avant d&amp;#39;envoyer sa commande suivante, et chaque commande paie un aller-retour complet. Avec &lt;code&gt;-P 16&lt;/code&gt;, chaque client en envoie 16 d&amp;#39;un coup, et dans notre exécution SET est passé d&amp;#39;environ 113 000 à 1 010 000 requêtes par seconde, GET de 118 000 à 1 190 000.&lt;/p&gt;
&lt;p&gt;La page officielle juge le pipelining réaliste, puisque beaucoup d&amp;#39;applications Redis l&amp;#39;utilisent, et conseille une taille de pipeline proche de la moyenne que votre application peut réellement atteindre. Notre latence médiane a augmenté en même temps, à 0,711 et 0,583 ms.&lt;/p&gt;
&lt;h2&gt;Que se passe-t-il quand vous ajoutez des clients ?&lt;/h2&gt;
&lt;p&gt;Une fois le goulot d&amp;#39;étranglement saturé, des clients en plus n&amp;#39;ajoutent que de l&amp;#39;attente. Sur un seul portable, ce peut être le serveur ou le client de benchmark, qui n&amp;#39;a qu&amp;#39;un thread.&lt;/p&gt;
&lt;p&gt;En passant de 50 à 200 clients, le débit est resté presque stable (environ 117 000 requêtes SET et 123 000 GET par seconde) tandis que la latence médiane a à peu près triplé, à 1,135 et 1,071 ms. C&amp;#39;est la &lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;loi de Little&lt;/a&gt; à l&amp;#39;œuvre. Chaque client a au plus une commande en cours, donc &lt;code&gt;-c&lt;/code&gt; fixe combien il y en a dans le système, et si le débit ne peut pas croître, c&amp;#39;est le temps que chacune y passe qui croît. Dans notre exécution GET complète, 50 clients ÷ 119 617 requêtes par seconde donnent 0,42 ms par boucle de client, un peu au-dessus de la moyenne mesurée de 0,352 ms. Avec 200 clients, le même calcul donne 1,63 ms.&lt;/p&gt;
&lt;p&gt;L&amp;#39;outil suit donc aussi un modèle de charge fermé : quand Redis se bloque, les clients attendent, et les commandes que votre application aurait envoyées entre-temps n&amp;#39;apparaissent jamais. Ni la page officielle ni &lt;code&gt;--help&lt;/code&gt; ne listent d&amp;#39;option de cadence de requêtes fixe : lisez ses percentiles en gardant la &lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; en tête.&lt;/p&gt;
&lt;h2&gt;Comment mesurer votre propre commande ou un script Lua ?&lt;/h2&gt;
&lt;p&gt;Écrivez la commande après les options. L&amp;#39;outil n&amp;#39;exécute alors que cette commande et ignore &lt;code&gt;-t&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;redis-benchmark -n 100000 -q \
  script load &amp;quot;redis.call(&amp;#39;set&amp;#39;,&amp;#39;foo&amp;#39;,&amp;#39;bar&amp;#39;)&amp;quot;
redis-benchmark -r 10000 -n 10000 \
  eval &amp;#39;return redis.call(&amp;quot;ping&amp;quot;)&amp;#39; 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La première ligne est l&amp;#39;exemple de la page officielle ; sur notre portable, elle a tourné à environ 106 000 requêtes par seconde. &lt;code&gt;SCRIPT LOAD&lt;/code&gt; ne fait que charger le script : pour mesurer son exécution, utilisez &lt;code&gt;eval&lt;/code&gt;, comme dans la deuxième ligne tirée de &lt;code&gt;--help&lt;/code&gt;. Avec &lt;code&gt;-r&lt;/code&gt;, l&amp;#39;aide indique que &lt;code&gt;__rand_int__&lt;/code&gt; dans un argument devient un nombre aléatoire à 12 chiffres dans cette plage, et en mode cluster la clé doit contenir un &lt;code&gt;{tag}&lt;/code&gt; pour atteindre le bon nœud.&lt;/p&gt;
&lt;h2&gt;Pourquoi votre application voit-elle d&amp;#39;autres chiffres ?&lt;/h2&gt;
&lt;p&gt;Votre application mesure tout son chemin jusqu&amp;#39;à Redis : réseau, bibliothèque cliente, sérialisation et son propre mélange de commandes. La page officielle liste des pièges à vérifier avant de comparer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une boucle de commandes synchrones mesure surtout le réseau et la bibliothèque cliente.&lt;/li&gt;
&lt;li&gt;Avec client et serveur sur une même machine, c&amp;#39;est le CPU qui limite le benchmark. Les sockets de domaine Unix peuvent atteindre environ 50 % de débit en plus que la loopback TCP, sous Linux par exemple.&lt;/li&gt;
&lt;li&gt;Des chaînes de 4 Ko à 100 000 requêtes par seconde demandent environ 3,2 Gbit/s, plus que ce que porte un lien à 1 Gbit/s.&lt;/li&gt;
&lt;li&gt;Pour comparer Redis à une base transactionnelle, activez AOF et choisissez une politique fsync adaptée.&lt;/li&gt;
&lt;li&gt;Les portables font varier la fréquence de leur CPU, ce qui nuit à la reproductibilité.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INFO&lt;/code&gt; à intervalles réguliers pose sans doute peu de problèmes pendant une exécution, alors que &lt;code&gt;MONITOR&lt;/code&gt; ralentit nettement Redis.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Ces chiffres de portable reflètent-ils la vraie capacité de Redis ?&lt;/h2&gt;
&lt;p&gt;Non. Ils montrent un portable qui se parle à lui-même, sans réseau, avec des valeurs de 3 octets dans la plupart des cas, sans persistance et une exécution par ligne.&lt;/p&gt;
&lt;p&gt;Le tableau montre comment chaque option fait bouger les chiffres. La capacité dépend de votre serveur, de votre réseau, de la taille de vos valeurs et de vos réglages de persistance.&lt;/p&gt;
&lt;h2&gt;Quand redis-benchmark n&amp;#39;est-il pas le bon outil ?&lt;/h2&gt;
&lt;p&gt;Quand vous voulez savoir ce que ressentent les utilisateurs. Il envoie des commandes synthétiques à Redis seul, alors que le temps de réponse d&amp;#39;une page inclut aussi le code applicatif et ses autres appels.&lt;/p&gt;
&lt;p&gt;Pour cela, mettez sous charge l&amp;#39;application ou l&amp;#39;API qui utilise Redis et surveillez Redis pendant le test. LoadFocus, qui publie ce site, travaille à ce niveau : il &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=redis-benchmark&quot;&gt;exécute des plans de test JMeter et des scripts k6&lt;/a&gt; depuis 25 régions cloud contre votre application web ou votre API. Il n&amp;#39;exécute pas redis-benchmark.&lt;/p&gt;
&lt;p&gt;Pour mieux contrôler le trafic Redis, le dépôt de &lt;a href=&quot;https://github.com/redis/memtier_benchmark&quot;&gt;memtier_benchmark&lt;/a&gt; cite des clients multithread, un ratio lecture:écriture, des motifs de clés aléatoires ou séquentiels, Redis Cluster et TLS (vérifié le 31 octobre 2026).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;redis-benchmark est-il conçu pour faire paraître Redis rapide ?&lt;/strong&gt;
Non. La page officielle de Redis parle d&amp;#39;une idée reçue répandue : par défaut, l&amp;#39;outil garde au plus une requête en attente par connexion, sans pipelining, et un client qui utilise le pipelining peut générer plus de débit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment remplir une base Redis avec redis-benchmark ?&lt;/strong&gt;
Lancez uniquement le test SET avec des clés aléatoires, comme le montre l&amp;#39;aide de l&amp;#39;outil : &lt;code&gt;-t set -n 1000000 -r 100000000&lt;/code&gt; remplit environ un million de clés. Des clés aléatoires peuvent se répéter, le total final est donc un peu inférieur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter redis-benchmark ?&lt;/strong&gt;
Non. LoadFocus n&amp;#39;exécute pas redis-benchmark. Ses plans de test JMeter et ses scripts k6 visent l&amp;#39;application web ou l&amp;#39;API placée devant Redis.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;Loi de Little en test de charge : dimensionner et vérifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;Coordinated omission : ce que c&amp;#39;est et comment l&amp;#39;éviter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/http-benchmarking-tools/&quot;&gt;Outils de benchmark HTTP : wrk, hey, oha, ab et autres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/pgbench/&quot;&gt;pgbench : benchmark et test de charge de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/sysbench/&quot;&gt;Utiliser sysbench : benchmarks CPU, disque et MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/ycsb/&quot;&gt;YCSB : charges de travail A-F, exécution et limites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Utiliser sysbench : benchmarks CPU, disque et MySQL</title><link>https://loadtest.app/fr/sysbench/</link><guid isPermaLink="true">https://loadtest.app/fr/sysbench/</guid><description>Comment fonctionne sysbench : tests CPU, mémoire et E/S fichiers, scripts OLTP pour MySQL et PostgreSQL, options clés, lecture des résultats et limites.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;sysbench est un outil de benchmark open source et multithread, bâti sur LuaJIT, qui fournit des tests CPU, mémoire, E/S fichiers, threads et mutex, ainsi que des scripts OLTP pour MySQL et PostgreSQL. Les tests qui ont besoin de données suivent le même cycle : &lt;code&gt;prepare&lt;/code&gt; crée les fichiers ou les tables de test, &lt;code&gt;run&lt;/code&gt; lance le benchmark pendant une durée ou un nombre d&amp;#39;événements donné, et &lt;code&gt;cleanup&lt;/code&gt; supprime les données ; les tests CPU et mémoire n&amp;#39;ont besoin que de &lt;code&gt;run&lt;/code&gt;. Il mesure une machine ou un serveur de base de données, et ne peut donc pas vous dire comment votre application se comporte face à un vrai trafic d&amp;#39;utilisateurs.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas exécuté sysbench pour ce guide. Les faits proviennent de son README et de son code source sur la branche master de GitHub, vérifiés le 31 octobre 2026, et les conseils sont les nôtres.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sujet&lt;/th&gt;
&lt;th&gt;sysbench&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;GPLv2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Écrit en&lt;/td&gt;
&lt;td&gt;C, avec LuaJIT pour les scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dernière version&lt;/td&gt;
&lt;td&gt;1.0.20 (24 avril 2020)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dernier commit&lt;/td&gt;
&lt;td&gt;9 mars 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests intégrés&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cpu&lt;/code&gt;, &lt;code&gt;memory&lt;/code&gt;, &lt;code&gt;fileio&lt;/code&gt;, &lt;code&gt;threads&lt;/code&gt;, &lt;code&gt;mutex&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de base de données&lt;/td&gt;
&lt;td&gt;Huit scripts &lt;code&gt;oltp_*&lt;/code&gt;, &lt;code&gt;bulk_insert&lt;/code&gt;, deux &lt;code&gt;select_random_*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pilotes de base de données&lt;/td&gt;
&lt;td&gt;MySQL (par défaut), PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plateformes&lt;/td&gt;
&lt;td&gt;Linux, macOS ; Windows via WSL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;sysbench est-il encore maintenu ?&lt;/h2&gt;
&lt;p&gt;Peu. La dernière version, la 1.0.20, date d&amp;#39;avril 2020 ; la branche master a reçu depuis des commits occasionnels, dont aucun n&amp;#39;est sorti dans une version, le dernier en mars 2025.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://github.com/akopytov/sysbench/releases/tag/1.0.20&quot;&gt;version 1.0.20&lt;/a&gt; est datée du 24 avril 2020. L&amp;#39;&lt;a href=&quot;https://github.com/akopytov/sysbench/commits/master&quot;&gt;historique des commits&lt;/a&gt; montre des changements comme une distribution uniforme par défaut pour &lt;code&gt;--rand-type&lt;/code&gt; (2020), un LuaJIT upstream (2023) et la prise en charge des bibliothèques client MariaDB (2023), puis quatre commits de build le 9 mars 2025 (vérifié le 31 octobre 2026). Les dépôts de paquets cités dans le README sont mis à jour à chaque version : ces changements demandent donc une compilation depuis les sources.&lt;/p&gt;
&lt;h2&gt;Comment se déroule une exécution de sysbench ?&lt;/h2&gt;
&lt;p&gt;Vous indiquez un test et une commande : &lt;code&gt;sysbench [options] [testname] [command]&lt;/code&gt;. Le test est un test intégré, un script Lua fourni ou votre propre script, et la commande est en général &lt;code&gt;prepare&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;cleanup&lt;/code&gt; ou &lt;code&gt;help&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Selon le &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;README&lt;/a&gt;, &lt;code&gt;prepare&lt;/code&gt; crée les fichiers pour &lt;code&gt;fileio&lt;/code&gt; ou remplit la base pour les scripts OLTP, &lt;code&gt;cleanup&lt;/code&gt; supprime ces données, et &lt;code&gt;sysbench &amp;lt;testname&amp;gt; help&lt;/code&gt; liste les options d&amp;#39;un test. Un test de disque :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sysbench fileio --file-total-size=8G prepare
sysbench fileio --file-total-size=8G \
  --file-test-mode=rndrw --time=300 run
sysbench fileio --file-total-size=8G cleanup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/fileio/sb_fileio.c&quot;&gt;code source de fileio&lt;/a&gt; liste les modes &lt;code&gt;seqwr&lt;/code&gt;, &lt;code&gt;seqrewr&lt;/code&gt;, &lt;code&gt;seqrd&lt;/code&gt;, &lt;code&gt;rndrd&lt;/code&gt;, &lt;code&gt;rndwr&lt;/code&gt; et &lt;code&gt;rndrw&lt;/code&gt;, avec 2 Go de fichiers par défaut. Des fichiers qui tiennent en mémoire peuvent être servis par le cache de pages : prévoyez un volume supérieur à la RAM si c&amp;#39;est le disque que vous voulez mesurer.&lt;/p&gt;
&lt;h2&gt;Comment mesurer le CPU et la mémoire avec sysbench ?&lt;/h2&gt;
&lt;p&gt;Avec &lt;code&gt;sysbench cpu run&lt;/code&gt; et &lt;code&gt;sysbench memory run&lt;/code&gt;. Le test CPU indique des événements par seconde, un événement consistant à vérifier la primalité de chaque nombre jusqu&amp;#39;à une limite, et le test mémoire indique des opérations et des Mio transférés par seconde.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sysbench cpu --cpu-max-prime=20000 \
  --threads=4 --time=60 run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/cpu/sb_cpu.c&quot;&gt;test CPU&lt;/a&gt; fixe &lt;code&gt;--cpu-max-prime&lt;/code&gt; à 10000 par défaut, et le &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/memory/sb_memory.c&quot;&gt;test mémoire&lt;/a&gt; accepte une taille de bloc, une taille totale, des opérations de lecture ou d&amp;#39;écriture et un accès séquentiel ou aléatoire (vérifié le 31 octobre 2026). Ne comparez que des exécutions aux réglages identiques.&lt;/p&gt;
&lt;h2&gt;Comment tester MySQL ou PostgreSQL avec sysbench ?&lt;/h2&gt;
&lt;p&gt;Choisissez un des scripts OLTP fournis, remplissez les tables avec &lt;code&gt;prepare&lt;/code&gt;, lancez des transactions depuis plusieurs threads avec &lt;code&gt;run&lt;/code&gt;, puis supprimez les tables avec &lt;code&gt;cleanup&lt;/code&gt;. MySQL est le pilote par défaut ; PostgreSQL demande &lt;code&gt;--db-driver=pgsql&lt;/code&gt; et un build compilé avec le support de PostgreSQL.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sysbench oltp_read_write --mysql-host=10.0.0.5 \
  --mysql-user=sbtest --mysql-password=secret \
  --tables=10 --table-size=1000000 prepare
sysbench oltp_read_write --mysql-host=10.0.0.5 \
  --mysql-user=sbtest --mysql-password=secret \
  --tables=10 --table-size=1000000 \
  --threads=16 --time=300 --report-interval=10 run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/lua/oltp_common.lua&quot;&gt;script OLTP commun&lt;/a&gt; crée une table de 10 000 lignes si vous ne passez pas &lt;code&gt;--tables&lt;/code&gt; et &lt;code&gt;--table-size&lt;/code&gt;. Dans &lt;code&gt;oltp_read_write&lt;/code&gt;, chaque transaction exécute 10 lectures par clé, quatre requêtes sur des plages, deux mises à jour et une suppression suivie d&amp;#39;une insertion, entre &lt;code&gt;BEGIN&lt;/code&gt; et &lt;code&gt;COMMIT&lt;/code&gt; (vérifié le 31 octobre 2026). Prévoyez des données plus grandes que le buffer pool du serveur si vous voulez des lectures disque dans le résultat.&lt;/p&gt;
&lt;h2&gt;Quelles options de sysbench comptent le plus ?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;--threads&lt;/code&gt; et &lt;code&gt;--time&lt;/code&gt; fixent la taille et la durée d&amp;#39;une exécution, &lt;code&gt;--rate&lt;/code&gt; fixe un taux cible d&amp;#39;événements, et &lt;code&gt;--report-interval&lt;/code&gt;, &lt;code&gt;--percentile&lt;/code&gt; et &lt;code&gt;--histogram&lt;/code&gt; déterminent ce que vous voyez.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--threads&lt;/code&gt; : threads de travail, 1 par défaut.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--time&lt;/code&gt; : durée en secondes, 10 par défaut, 0 pour aucune limite. &lt;code&gt;--events&lt;/code&gt; plafonne le nombre d&amp;#39;événements, et les deux limites s&amp;#39;appliquent : associez-le à &lt;code&gt;--time=0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--warmup-time&lt;/code&gt; : tourne d&amp;#39;abord sans statistiques, pour que des caches froids ne faussent pas le résultat. Branche master uniquement : la version 1.0.20 ne l&amp;#39;a pas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rate&lt;/code&gt; : nombre moyen d&amp;#39;événements par seconde pour l&amp;#39;ensemble des threads ; 0, la valeur par défaut, signifie le plus vite possible.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--report-interval&lt;/code&gt; : des chiffres par intervalle toutes les N secondes, pour révéler les blocages.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--percentile&lt;/code&gt; : le percentile de latence affiché, 95 par défaut.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--histogram&lt;/code&gt; : un histogramme des latences en fin d&amp;#39;exécution, défini dans &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/sb_logger.c&quot;&gt;sb_logger.c&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;sysbench suit-il un modèle de charge fermé ou ouvert ?&lt;/h2&gt;
&lt;p&gt;Fermé par défaut : un nombre fixe de threads lancent chacun l&amp;#39;événement suivant dès que le précédent se termine, si bien qu&amp;#39;un serveur lent reçoit moins d&amp;#39;événements. Avec &lt;code&gt;--rate&lt;/code&gt;, les événements arrivent selon leur propre calendrier, ce qui se rapproche d&amp;#39;un modèle de charge ouvert.&lt;/p&gt;
&lt;p&gt;Notre article sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique pourquoi cela change ce que mesure un benchmark. En mode par défaut, un blocage retarde aussi les événements qui auraient démarré pendant ce temps, et ces retards n&amp;#39;apparaissent jamais dans les latences : c&amp;#39;est la &lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;. Le &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/sysbench.c&quot;&gt;fichier source principal&lt;/a&gt; montre que &lt;code&gt;--rate&lt;/code&gt; place les événements dans une file à des intervalles suivant une loi exponentielle, ajoute à la latence de chaque événement son temps d&amp;#39;attente dans la file, et s&amp;#39;arrête avec l&amp;#39;erreur &amp;quot;event queue is full&amp;quot; quand les threads ne suivent plus (vérifié le 31 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment lire les résultats de sysbench ?&lt;/h2&gt;
&lt;p&gt;Commencez par le débit : événements par seconde, ou transactions et requêtes par seconde pour les scripts OLTP. Lisez ensuite le bloc de latence en millisecondes : minimum, moyenne, maximum, le percentile choisi (p95 par défaut) et la somme.&lt;/p&gt;
&lt;p&gt;La version 1.0.20 affiche à la place de « Throughput » un bloc « General statistics » avec la durée totale et le nombre total d&amp;#39;événements. Les noms de champs viennent du &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/db_driver.c&quot;&gt;code du rapport base de données&lt;/a&gt; et du fichier source principal sur master, ici sans valeurs :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;SQL statistics:
    queries performed: read, write, other, total
    transactions, queries (N per sec.)
    ignored errors, reconnects (N per sec.)
Throughput:
    events/s (eps), time elapsed, total number of events
Latency (ms):
    min, avg, max, 95th percentile, sum
Threads fairness:
    events, execution time (avg/stddev)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un 95e percentile laisse de côté l&amp;#39;événement le plus lent sur vingt. Passez &lt;code&gt;--percentile=99&lt;/code&gt; ou ajoutez &lt;code&gt;--histogram&lt;/code&gt; quand la queue de distribution compte ; notre guide sur la &lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;latence de queue&lt;/a&gt; explique pourquoi.&lt;/p&gt;
&lt;h2&gt;Quand sysbench n&amp;#39;est-il pas le bon outil ?&lt;/h2&gt;
&lt;p&gt;Quand votre question porte sur votre application. Un score CPU montre à quelle vitesse une machine vérifie des nombres premiers, et une exécution OLTP mesure le serveur de base de données avec les tables et requêtes de sysbench, sans votre schéma, votre pool de connexions ni le chemin réseau.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choisissez &lt;strong&gt;pgbench&lt;/strong&gt; pour des tests propres à PostgreSQL : la &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;documentation de PostgreSQL&lt;/a&gt; décrit un scénario par défaut vaguement inspiré de TPC-B, ainsi que des fichiers de script personnalisés (vérifié le 31 octobre 2026).&lt;/li&gt;
&lt;li&gt;Choisissez &lt;strong&gt;HammerDB&lt;/strong&gt; pour des tests de type TPC-C : sa &lt;a href=&quot;https://www.hammerdb.com/document.html&quot;&gt;documentation&lt;/a&gt; couvre la charge TPROC-C, dérivée de TPC-C, pour SQL Server, Db2, Oracle, PostgreSQL, MariaDB et MySQL (vérifié le 31 octobre 2026).&lt;/li&gt;
&lt;li&gt;Choisissez &lt;strong&gt;JMeter&lt;/strong&gt; avec son sampler JDBC Request pour mêler SQL et HTTP dans un même plan de test ; le &lt;a href=&quot;https://jmeter.apache.org/usermanual/build-db-test-plan.html&quot;&gt;guide des plans de test de base de données&lt;/a&gt; indique que le &lt;code&gt;.jar&lt;/code&gt; du pilote va dans le dossier &lt;code&gt;lib&lt;/code&gt; de JMeter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LoadFocus, qui publie ce site, n&amp;#39;exécute pas sysbench et ne peut pas se connecter lui-même à MySQL ou PostgreSQL. LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=sysbench&quot;&gt;exécute des plans de test JMeter&lt;/a&gt; et des scripts k6 depuis 25 régions cloud contre la couche web ou API placée devant la base. Une combinaison utile : une exécution de sysbench pour dimensionner le serveur de base de données, puis un &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=sysbench&quot;&gt;test de charge de l&amp;#39;application&lt;/a&gt; pour voir si de vraies requêtes atteignent cette limite.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;sysbench est-il encore maintenu ?&lt;/strong&gt;
Peu. La dernière version est la 1.0.20 du 24 avril 2020. La branche master a reçu depuis des commits occasionnels, aucun dans une version, le plus récent le 9 mars 2025.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que signifie le 95e percentile dans les résultats de sysbench ?&lt;/strong&gt;
C&amp;#39;est la latence, en millisecondes, en dessous de laquelle 95 % des événements se sont terminés. 95 est la valeur par défaut de l&amp;#39;option &lt;code&gt;--percentile&lt;/code&gt;, et vous pouvez en choisir une autre, comme 99.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sysbench peut-il tester PostgreSQL ?&lt;/strong&gt;
Oui. Les scripts OLTP fournis tournent contre PostgreSQL avec &lt;code&gt;--db-driver=pgsql&lt;/code&gt; quand sysbench a été compilé avec le support de PostgreSQL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter sysbench ?&lt;/strong&gt;
Non. LoadFocus exécute des plans de test JMeter et des scripts k6 contre des sites web et des API depuis 25 régions cloud, et ne se connecte pas directement à MySQL ou PostgreSQL.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;Coordinated omission : ce que c&amp;#39;est et comment l&amp;#39;éviter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/http-benchmarking-tools/&quot;&gt;Outils de benchmark HTTP : wrk, hey, oha, ab et autres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/pgbench/&quot;&gt;pgbench : benchmark et test de charge de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/ycsb/&quot;&gt;YCSB : charges de travail A-F, exécution et limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/redis-benchmark/&quot;&gt;redis-benchmark : l&amp;#39;utiliser et lire ses résultats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tpc-h/&quot;&gt;TPC-H : ce que mesure le benchmark et comment le lancer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>YCSB : charges de travail A-F, exécution et limites</title><link>https://loadtest.app/fr/ycsb/</link><guid isPermaLink="true">https://loadtest.app/fr/ycsb/</guid><description>YCSB expliqué : ce que mesure le Yahoo! Cloud Serving Benchmark, les charges de travail A à F, chargement et exécution, sa sortie et ses limites.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;YCSB, le Yahoo! Cloud Serving Benchmark, est un outil open source écrit en Java qui charge des enregistrements synthétiques dans une base de données, puis y exécute un mélange fixe de lectures, de mises à jour, d&amp;#39;insertions et de scans en mesurant le débit et la latence de chaque opération. Ses six charges de travail de base (core workloads), de A à F, sont des mélanges standard : le même test peut donc tourner sur Cassandra, MongoDB, Redis, HBase et des dizaines d&amp;#39;autres bases grâce à des bindings. Il mesure la base de données seule et ne dit donc rien des vraies requêtes de votre application ni de la latence que voient vos utilisateurs.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas exécuté YCSB pour cet article. Les faits proviennent de son dépôt GitHub, de son wiki et de son code source, vérifiés le 31 octobre 2026, et les appréciations sont les nôtres.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Charge de travail&lt;/th&gt;
&lt;th&gt;Mélange d&amp;#39;opérations&lt;/th&gt;
&lt;th&gt;Distribution des clés&lt;/th&gt;
&lt;th&gt;Exemple donné par le wiki&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A : mises à jour intensives&lt;/td&gt;
&lt;td&gt;50 % lectures, 50 % mises à jour&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Stockage de sessions qui enregistre les actions récentes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B : surtout des lectures&lt;/td&gt;
&lt;td&gt;95 % lectures, 5 % mises à jour&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Ajout de tags sur des photos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C : lecture seule&lt;/td&gt;
&lt;td&gt;100 % lectures&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Cache de profils utilisateur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D : lecture des plus récents&lt;/td&gt;
&lt;td&gt;95 % lectures, 5 % insertions&lt;/td&gt;
&lt;td&gt;latest&lt;/td&gt;
&lt;td&gt;Statuts publiés par les utilisateurs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E : plages courtes&lt;/td&gt;
&lt;td&gt;95 % scans, 5 % insertions&lt;/td&gt;
&lt;td&gt;zipfian (scans de 100 enregistrements au plus)&lt;/td&gt;
&lt;td&gt;Fils de discussion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F : lecture-modification-écriture&lt;/td&gt;
&lt;td&gt;50 % lectures, 50 % lecture-modification-écriture&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Base d&amp;#39;utilisateurs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Les mélanges viennent des fichiers du &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/tree/master/workloads&quot;&gt;répertoire workloads&lt;/a&gt; et les exemples de la &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads&quot;&gt;page Core Workloads&lt;/a&gt; (vérifié le 31 octobre 2026). Chaque fichier ne contient que 1 000 enregistrements et 1 000 opérations : assez pour déboguer une installation, beaucoup trop peu pour un benchmark.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce que YCSB, et est-il encore maintenu ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est un générateur de charge accompagné de charges de travail standard pour comparer des bases clé-valeur et de type « cloud serving », publié en open source par Yahoo! en 2010 sous licence Apache 2.0. La dernière version date d&amp;#39;octobre 2019, et le code reçoit encore de petits commits.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Papers-and-Presentations&quot;&gt;page des publications&lt;/a&gt; cite l&amp;#39;article d&amp;#39;origine, « Benchmarking Cloud Serving Systems with YCSB », de Cooper, Silberstein, Tam, Ramakrishnan et Sears (ACM SoCC 2010). La &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/releases/tag/0.17.0&quot;&gt;version 0.17.0&lt;/a&gt; est datée du 6 octobre 2019 et aucun tag plus récent n&amp;#39;existe, alors que l&amp;#39;&lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/commits/master&quot;&gt;historique des commits&lt;/a&gt; montre du travail en 2026, comme une option pour continuer après un échec d&amp;#39;insertion et une modification du binding Cloud Spanner le 20 octobre (vérifié le 31 octobre 2026). Ces changements ne sont disponibles qu&amp;#39;en compilant depuis les sources, ce qui demande Maven 3.&lt;/p&gt;
&lt;h2&gt;Comment lancer un benchmark YCSB ?&lt;/h2&gt;
&lt;p&gt;En deux phases qui partagent les mêmes propriétés : &lt;code&gt;load&lt;/code&gt; insère &lt;code&gt;recordcount&lt;/code&gt; enregistrements, puis &lt;code&gt;run&lt;/code&gt; exécute &lt;code&gt;operationcount&lt;/code&gt; opérations selon le mélange de la charge de travail. Vous indiquez le binding de votre base et passez le fichier de la charge de travail avec &lt;code&gt;-P&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;bin/ycsb load mongodb -s -P workloads/workloada \
  -p recordcount=1000000 \
  -p mongodb.url=mongodb://db1:27017/ycsb
bin/ycsb run mongodb -s -P workloads/workloada \
  -p recordcount=1000000 -p operationcount=5000000 \
  -p mongodb.url=mongodb://db1:27017/ycsb \
  -threads 32 -target 20000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload&quot;&gt;page Running a Workload&lt;/a&gt; détaille les pièges courants (vérifié le 31 octobre 2026). Le client ne crée jamais de table : vous associez d&amp;#39;abord &lt;code&gt;usertable&lt;/code&gt; à ce dont votre base a besoin, par exemple une table dans MySQL ou un keyspace dans Cassandra. Les fichiers &lt;code&gt;-P&lt;/code&gt; placés plus loin écrasent les précédents, et &lt;code&gt;-p&lt;/code&gt; les écrase tous. La phase d&amp;#39;exécution doit recevoir le même &lt;code&gt;recordcount&lt;/code&gt; que le chargement, car elle choisit ses clés dans l&amp;#39;ensemble des données. &lt;code&gt;-s&lt;/code&gt; affiche une ligne d&amp;#39;état toutes les 10 secondes. Comme D et E insèrent des enregistrements, la page Core Workloads conseille de charger une fois avec le fichier de A, d&amp;#39;exécuter A, B, C, F et D, puis de supprimer les données et de recharger pour E.&lt;/p&gt;
&lt;h2&gt;Que règlent -threads et -target ?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;-threads&lt;/code&gt; fixe le nombre de threads clients qui envoient des opérations (un par défaut), et &lt;code&gt;-target&lt;/code&gt; plafonne le nombre total d&amp;#39;opérations par seconde. Sans cible, chaque thread envoie l&amp;#39;opération suivante dès que la précédente revient : une base plus lente reçoit donc tout simplement moins de charge.&lt;/p&gt;
&lt;p&gt;C&amp;#39;est un modèle de charge fermé, et notre article sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique ce qu&amp;#39;il masque. L&amp;#39;exemple du wiki, 10 threads pour une cible de 100 opérations par seconde, ne tient que tant que la latence moyenne reste sous 100 ms ; avec trop peu de threads, le débit atteint reste sous la cible. C&amp;#39;est la &lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;loi de Little&lt;/a&gt; : le nombre de threads divisé par la latence moyenne plafonne le débit. En lançant plusieurs cibles et en relevant la latence à chacune, vous obtenez la courbe décrite dans notre guide &lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;débit vs latence&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Comment lire la sortie de YCSB ?&lt;/h2&gt;
&lt;p&gt;À la fin de chaque phase, le client affiche un bloc &lt;code&gt;[OVERALL]&lt;/code&gt; avec la durée et le débit, puis un bloc par type d&amp;#39;opération avec le nombre d&amp;#39;opérations, les latences moyenne, minimale, maximale et par percentile, et un décompte par code de retour.&lt;/p&gt;
&lt;p&gt;Ces noms de champs viennent du code source de la 0.17.0 ; les valeurs sont des exemples fictifs :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[OVERALL], RunTime(ms), &amp;lt;total&amp;gt;
[OVERALL], Throughput(ops/sec), &amp;lt;rate&amp;gt;
[READ], Operations, &amp;lt;count&amp;gt;
[READ], AverageLatency(us), &amp;lt;value&amp;gt;
[READ], 95thPercentileLatency(us), &amp;lt;value&amp;gt;
[READ], 99thPercentileLatency(us), &amp;lt;value&amp;gt;
[READ], Return=OK, &amp;lt;count&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;L&amp;#39;exemple de sortie du wiki affiche des millisecondes, mais la mesure HdrHistogram par défaut, dans la 0.17.0 comme dans le code actuel, indique des microsecondes, &lt;code&gt;(us)&lt;/code&gt;. La &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Core-Properties&quot;&gt;page Core Properties&lt;/a&gt; et la version 0.17.0 fixent les percentiles par défaut à 95 et 99, modifiables avec &lt;code&gt;hdrhistogram.percentiles&lt;/code&gt; ; depuis avril 2025, la branche master ajoute 50, donc une compilation depuis les sources affiche aussi &lt;code&gt;50thPercentileLatency(us)&lt;/code&gt; (vérifié le 31 octobre 2026). Le &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB&quot;&gt;README&lt;/a&gt; oriente vers le P99 et au-delà, rappelle qu&amp;#39;on ne peut pas faire la moyenne de percentiles et conseille, avec plusieurs clients, d&amp;#39;enregistrer des fichiers d&amp;#39;histogramme HDR avec &lt;code&gt;hdrhistogram.fileoutput=true&lt;/code&gt; puis de les fusionner.&lt;/p&gt;
&lt;h2&gt;YCSB tient-il compte de la coordinated omission ?&lt;/h2&gt;
&lt;p&gt;Seulement si vous le demandez, et seulement avec &lt;code&gt;-target&lt;/code&gt;. Par défaut, chaque latence est mesurée à partir du moment où l&amp;#39;opération est réellement envoyée : un blocage qui retarde les opérations suivantes se voit donc à peine.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/blob/master/core/src/main/java/site/ycsb/measurements/Measurements.java&quot;&gt;code source des mesures&lt;/a&gt; prévoit une propriété &lt;code&gt;measurement.interval&lt;/code&gt; qui accepte &lt;code&gt;op&lt;/code&gt; (par défaut), &lt;code&gt;intended&lt;/code&gt; ou &lt;code&gt;both&lt;/code&gt; (vérifié le 31 octobre 2026). Avec une cible, chaque thread note le départ prévu de chaque opération ; &lt;code&gt;intended&lt;/code&gt; mesure la latence à partir de ce moment, et &lt;code&gt;both&lt;/code&gt; ajoute des blocs &lt;code&gt;Intended-&lt;/code&gt; comme &lt;code&gt;[Intended-READ]&lt;/code&gt; à côté des blocs habituels. Le wiki ne mentionne pas cette propriété : vérifiez le code de la version que vous compilez. Notre guide sur la &lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; explique pourquoi le départ prévu donne le chiffre honnête.&lt;/p&gt;
&lt;h2&gt;Quelles bases de données YCSB peut-il tester ?&lt;/h2&gt;
&lt;p&gt;Toute base qui dispose d&amp;#39;un binding. Le fichier de build de la branche master liste 46 modules de binding, parmi lesquels Cassandra, MongoDB, Redis, HBase, DynamoDB, Cloud Spanner, RocksDB et un binding JDBC générique.&lt;/p&gt;
&lt;p&gt;La liste figure dans le &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/blob/master/pom.xml&quot;&gt;pom.xml&lt;/a&gt;, et chaque répertoire de binding a son propre README avec les propriétés de connexion, comme &lt;code&gt;mongodb.url&lt;/code&gt; pour le &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/tree/master/mongodb&quot;&gt;binding MongoDB&lt;/a&gt; (vérifié le 31 octobre 2026). D&amp;#39;après la page Running a Workload, une seule machine cliente suffit pour des clusters d&amp;#39;une dizaine de machines ; au-delà, vous lancez plusieurs clients, et la page &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload-in-Parallel&quot;&gt;Running a Workload in Parallel&lt;/a&gt; répartit la charge entre eux avec &lt;code&gt;insertstart&lt;/code&gt; et &lt;code&gt;insertcount&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Quand YCSB n&amp;#39;est-il pas le bon outil ?&lt;/h2&gt;
&lt;p&gt;Quand votre question porte sur votre application. La charge de travail de base écrit des enregistrements synthétiques, 10 champs d&amp;#39;une longueur de 100 chacun par défaut, au moyen d&amp;#39;opérations simples sur des clés : elle ne peut donc pas montrer comment vos propres requêtes, vos index ou le code de votre API se comportent sous charge.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour l&amp;#39;OLTP relationnel, &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;pgbench&lt;/a&gt; exécute sur PostgreSQL un script inspiré de TPC-B et accepte vos propres scripts, et &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;sysbench&lt;/a&gt; fournit des benchmarks Lua de type OLTP (tous deux vérifiés le 31 octobre 2026).&lt;/li&gt;
&lt;li&gt;Pour la latence que voient les utilisateurs, mettez sous charge la couche HTTP ou API placée devant la base. LoadFocus, qui publie ce site, &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=ycsb&quot;&gt;exécute des plans de test JMeter et des scripts k6&lt;/a&gt; depuis 25 régions cloud sur des endpoints web et API. LoadFocus n&amp;#39;exécute pas YCSB.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quelles sont les charges de travail de base de YCSB ?&lt;/strong&gt;
Six mélanges standard : A compte 50 % de lectures et 50 % de mises à jour, B 95 % de lectures, C uniquement des lectures, D privilégie les enregistrements insérés le plus récemment, E fait des scans courts et F des lectures-modifications-écritures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre ycsb load et ycsb run ?&lt;/strong&gt;
La phase de chargement insère le nombre d&amp;#39;enregistrements fixé par &lt;code&gt;recordcount&lt;/code&gt;. La phase d&amp;#39;exécution lance ensuite &lt;code&gt;operationcount&lt;/code&gt; opérations selon le mélange de la charge de travail sur ces enregistrements et indique le débit et la latence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YCSB est-il encore maintenu ?&lt;/strong&gt;
La dernière version, la 0.17.0, est sortie le 6 octobre 2019. Le dépôt reçoit encore des commits de temps en temps, le plus récent le 20 octobre 2026 : les correctifs récents demandent donc de compiler depuis les sources.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des benchmarks YCSB ?&lt;/strong&gt;
Non. LoadFocus n&amp;#39;exécute pas YCSB. Ses plans de test JMeter et ses scripts k6 visent des endpoints web et API, c&amp;#39;est-à-dire la couche placée devant la base de données.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;Coordinated omission : ce que c&amp;#39;est et comment l&amp;#39;éviter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;Loi de Little en test de charge : dimensionner et vérifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/pgbench/&quot;&gt;pgbench : benchmark et test de charge de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/sysbench/&quot;&gt;Utiliser sysbench : benchmarks CPU, disque et MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/redis-benchmark/&quot;&gt;redis-benchmark : l&amp;#39;utiliser et lire ses résultats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tpc-h/&quot;&gt;TPC-H : ce que mesure le benchmark et comment le lancer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Test de charge NBomber : le framework .NET passé en revue</title><link>https://loadtest.app/fr/nbomber-load-testing/</link><guid isPermaLink="true">https://loadtest.app/fr/nbomber-load-testing/</guid><description>Test de charge NBomber passé en revue : scénarios C# et F#, simulations inject et constant, seuils, plugin HTTP, mode cluster et licence d&apos;entreprise.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;NBomber est un framework de test de charge pour .NET : vous écrivez chaque test comme un scénario C# ou F#, vous l&amp;#39;ajoutez à un projet ordinaire et vous le lancez comme n&amp;#39;importe quel programme. Le test de charge avec NBomber convient aux équipes qui développent déjà en .NET et veulent leurs tests de charge dans le même langage, le même dépôt et le même lanceur de tests. NBomber n&amp;#39;est gratuit que pour un usage personnel et académique ; une entreprise a besoin d&amp;#39;une licence payante, et ce seul point tranche plus d&amp;#39;évaluations que n&amp;#39;importe quelle fonctionnalité.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas exécuté NBomber pour cette revue. Les faits proviennent de la documentation, de la page de tarifs, du dépôt GitHub et du paquet NuGet de NBomber, vérifiés le 21 octobre 2026, et les appréciations sont les nôtres.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sujet&lt;/th&gt;
&lt;th&gt;NBomber&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;Gratuit pour un usage personnel et académique ; payant pour les organisations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prix pour une entreprise&lt;/td&gt;
&lt;td&gt;Business 1 500 $ par an, Enterprise 2 500 $ par an&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version actuelle&lt;/td&gt;
&lt;td&gt;6.7.1 (16 octobre 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environnement d&amp;#39;exécution&lt;/td&gt;
&lt;td&gt;.NET Standard 2.1, donc .NET Core 3.0 ou plus récent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests écrits en&lt;/td&gt;
&lt;td&gt;Scénarios C# ou F#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modèle de charge&lt;/td&gt;
&lt;td&gt;Inject (taux d&amp;#39;arrivée) ou copies constantes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contrôles de réussite&lt;/td&gt;
&lt;td&gt;Seuils pendant l&amp;#39;exécution, asserts sur les statistiques finales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Montée en échelle&lt;/td&gt;
&lt;td&gt;NBomber Cluster, licence Enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qui développe NBomber, et est-il gratuit ?&lt;/h2&gt;
&lt;p&gt;NBomber LLC le développe, avec le code source sur GitHub. Il est gratuit pour un usage personnel, de loisir et académique, et la page de licence dit clairement que NBomber n&amp;#39;est pas gratuit pour les organisations.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/getting-started/license/&quot;&gt;page de licence&lt;/a&gt; range les benchmarks, les tutoriels et les contenus de revue dans l&amp;#39;usage personnel. En entreprise, il faut une licence Business ou Enterprise, attribuée par organisation et non par poste de développeur, sans limite d&amp;#39;instances ni d&amp;#39;exécutions parallèles. La &lt;a href=&quot;https://nbomber.com/pricing&quot;&gt;page de tarifs&lt;/a&gt; indique 1 500 $ par an pour Business et 2 500 $ par an pour Enterprise, toutes deux avec une garantie de remboursement de 30 jours. La clé de licence se passe au lanceur avec &lt;code&gt;.WithLicense(...)&lt;/code&gt; ou un argument &lt;code&gt;--license&lt;/code&gt;, et NBomber a besoin d&amp;#39;un accès à internet pour la valider, une validation hors ligne étant possible sur demande par e-mail (vérifié le 21 octobre 2026).&lt;/p&gt;
&lt;p&gt;La dernière version est la &lt;a href=&quot;https://github.com/PragmaticFlow/NBomber/releases/tag/v6.7.1&quot;&gt;v6.7.1&lt;/a&gt;, publiée le 16 octobre 2026, quatre jours après la 6.7.0 (vérifié le 21 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment fonctionne un scénario NBomber ?&lt;/h2&gt;
&lt;p&gt;Un scénario, c&amp;#39;est un nom et une fonction asynchrone que NBomber chronomètre à chaque appel. Vous y attachez des simulations de charge et des seuils, vous l&amp;#39;enregistrez auprès de &lt;code&gt;NBomberRunner&lt;/code&gt; et vous lancez le programme.&lt;/p&gt;
&lt;p&gt;Ce test saute le warm-up, fait monter le taux d&amp;#39;arrivée à 50 nouvelles copies du scénario par seconde en deux minutes, le maintient dix minutes et se termine avec le code de sortie 1 si 1 % ou plus des requêtes ont échoué. Il utilise le plugin &lt;code&gt;NBomber.Http&lt;/code&gt; pour la requête :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var http = Http.CreateDefaultClient();

var scenario = Scenario.Create(&amp;quot;browse&amp;quot;, async context =&amp;gt;
{
    var request = Http.CreateRequest(&amp;quot;GET&amp;quot;,
        &amp;quot;https://staging.example.com/products&amp;quot;);
    return await Http.Send(http, request);
})
.WithoutWarmUp()
.WithLoadSimulations(
    Simulation.RampingInject(rate: 50,
        interval: TimeSpan.FromSeconds(1),
        during: TimeSpan.FromMinutes(2)),
    Simulation.Inject(rate: 50,
        interval: TimeSpan.FromSeconds(1),
        during: TimeSpan.FromMinutes(10)))
.WithThresholds(
    Threshold.Create(s =&amp;gt; s.Fail.Request.Percent &amp;lt; 1));

var result = NBomberRunner
    .RegisterScenarios(scenario).Run();
return result.Thresholds.Any(t =&amp;gt; t.IsFailed) ? 1 : 0;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/protocols/http/http-client/&quot;&gt;page du client HTTP&lt;/a&gt; recommande &lt;code&gt;Http.CreateDefaultClient()&lt;/code&gt; plutôt qu&amp;#39;un simple &lt;code&gt;new HttpClient()&lt;/code&gt; et indique que le plugin suit les codes de statut et les données transférées (vérifié le 21 octobre 2026). Un seuil seul ne fait que consigner l&amp;#39;échec dans le rapport : c&amp;#39;est la dernière ligne qui en fait un code de sortie lisible par un pipeline. Sans &lt;code&gt;.WithoutWarmUp()&lt;/code&gt;, NBomber lance d&amp;#39;abord un warm-up de 30 secondes avec les simulations du scénario, d&amp;#39;après la &lt;a href=&quot;https://nbomber.com/docs/nbomber/scenario/&quot;&gt;page des scénarios&lt;/a&gt; (vérifié le 21 octobre 2026). Comme le scénario est du C# ordinaire, tout ce qu&amp;#39;une bibliothèque .NET peut appeler se teste en charge de la même façon.&lt;/p&gt;
&lt;h2&gt;Quels modèles de charge NBomber propose-t-il ?&lt;/h2&gt;
&lt;p&gt;Les deux. Les simulations inject lancent de nouvelles copies à un rythme fixé, quoi que fassent les copies précédentes, ce qui donne un modèle de charge ouvert ; les simulations constant maintiennent un nombre fixe de copies, ce qui donne un modèle fermé.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/nbomber/load-simulation/&quot;&gt;page des simulations de charge&lt;/a&gt; les énumère (vérifié le 21 octobre 2026) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ouvertes :&lt;/strong&gt; &lt;code&gt;Inject&lt;/code&gt;, &lt;code&gt;RampingInject&lt;/code&gt;, &lt;code&gt;InjectRandom&lt;/code&gt; et &lt;code&gt;IterationsForInject&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fermées :&lt;/strong&gt; &lt;code&gt;KeepConstant&lt;/code&gt;, &lt;code&gt;RampingConstant&lt;/code&gt; et &lt;code&gt;IterationsForConstant&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temporisation :&lt;/strong&gt; &lt;code&gt;Pause&lt;/code&gt;, qui retarde le démarrage d&amp;#39;un scénario ou le suspend pendant une durée donnée.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notre article sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique lequel correspond à votre trafic. Un site public se comporte en général comme le modèle ouvert, un groupe fixe de clients internes plutôt comme le modèle fermé.&lt;/p&gt;
&lt;h2&gt;Comment fonctionnent les seuils et les contrôles de réussite ?&lt;/h2&gt;
&lt;p&gt;Les seuils évalués pendant l&amp;#39;exécution contrôlent les statistiques en cours, toutes les 5 secondes par défaut, et apparaissent dans le rapport HTML. Les asserts, écrits avec xUnit ou NUnit, contrôlent les statistiques finales après l&amp;#39;exécution, et un assert en échec termine l&amp;#39;exécution avec un statut d&amp;#39;échec.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/nbomber/asserts_and_thresholds/&quot;&gt;page des seuils&lt;/a&gt; montre des contrôles sur le pourcentage d&amp;#39;erreurs, les codes de statut, les percentiles de latence (p50, p75, p95, p99 et maximum), les requêtes par seconde et les octets transférés. Par défaut, un seuil n&amp;#39;arrête pas le test ; &lt;code&gt;abortWhenErrorCount&lt;/code&gt; l&amp;#39;arrête après un nombre donné de contrôles en échec (vérifié le 21 octobre 2026). La page n&amp;#39;indique pas de code de sortie, c&amp;#39;est pourquoi l&amp;#39;exemple ci-dessus en renvoie un à partir du résultat. Notre guide des &lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;critères de réussite d&amp;#39;un test de charge&lt;/a&gt; aide à choisir les limites.&lt;/p&gt;
&lt;h2&gt;Quels protocoles NBomber peut-il tester ?&lt;/h2&gt;
&lt;p&gt;Tout protocole qu&amp;#39;une bibliothèque .NET sait parler, car NBomber ne fait que chronométrer le code que vous lui donnez. Des plugins prêts à l&amp;#39;emploi couvrent HTTP, WebSockets, MQTT et AMQP, plus une option WebBrowser.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/getting-started/overview/&quot;&gt;page de présentation&lt;/a&gt; décrit le framework comme indépendant du protocole, et la page de tarifs inclut ces plugins dans toutes les formules, y compris la gratuite. Cela couvre aussi les bases de données et les files de messages que vous appelez avec leurs propres clients .NET (vérifié le 21 octobre 2026). La contrepartie : en dehors des plugins, c&amp;#39;est à vous d&amp;#39;écrire et de maintenir le code client.&lt;/p&gt;
&lt;h2&gt;Comment répartir un test NBomber sur plusieurs machines ?&lt;/h2&gt;
&lt;p&gt;Avec NBomber Cluster : un Coordinator orchestre l&amp;#39;exécution et des Agents exécutent les scénarios, le tout via un broker de messages NATS. Cluster fait partie de la licence Enterprise.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/cluster/overview/&quot;&gt;présentation du cluster&lt;/a&gt; décrit les rôles, et la page de licence précise que les développeurs peuvent l&amp;#39;essayer en local avec un Local Dev Cluster avant d&amp;#39;acheter ; la &lt;a href=&quot;https://nbomber.com/docs/cluster/local-dev-cluster/&quot;&gt;page du Local Dev Cluster&lt;/a&gt; le limite à 1 Coordinator et 2 Agents et arrête chaque exécution au bout d&amp;#39;une minute (vérifié le 21 octobre 2026). L&amp;#39;intégration Kubernetes de NBomber Studio, elle aussi réservée à Enterprise, met en place NATS et les pods Agent à votre place. Sans Cluster, un processus NBomber tourne sur une seule machine ; la &lt;a href=&quot;https://nbomber.com/docs/getting-started/system-requirements/&quot;&gt;page de configuration requise&lt;/a&gt; conseille 4 à 8 cœurs CPU pour une charge élevée.&lt;/p&gt;
&lt;p&gt;LoadFocus, qui publie ce site, n&amp;#39;exécute pas de tests NBomber. LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=nbomber-load-testing&quot;&gt;exécute des plans de test JMeter et des scripts k6&lt;/a&gt; depuis 25 régions cloud.&lt;/p&gt;
&lt;h2&gt;Quels sont les points forts et les limites de NBomber ?&lt;/h2&gt;
&lt;p&gt;Il est solide pour les équipes .NET : les tests sont du code C# ou F#, n&amp;#39;importe quel client .NET devient un test de charge et les deux modèles de charge sont intégrés. Ses limites sont la licence d&amp;#39;entreprise, un écosystème à un seul langage et des exécutions distribuées payantes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les tests vivent à côté du code de l&amp;#39;application, avec le même IDE, les mêmes paquets et les mêmes revues de code.&lt;/li&gt;
&lt;li&gt;Les seuils sont intégrés, et les asserts tournent dans les tests xUnit ou NUnit que vous avez déjà.&lt;/li&gt;
&lt;li&gt;L&amp;#39;usage commercial demande une licence, même pour un seul développeur.&lt;/li&gt;
&lt;li&gt;Les exécutions distribuées demandent Enterprise et un broker NATS.&lt;/li&gt;
&lt;li&gt;Des testeurs sans culture .NET devront d&amp;#39;abord apprendre C# ou F#.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quand choisir plutôt k6, Gatling ou JMeter ?&lt;/h2&gt;
&lt;p&gt;Choisissez un autre outil si votre équipe n&amp;#39;écrit pas en .NET, ou si le coût de la licence ne convient pas.&lt;/p&gt;
&lt;p&gt;Choisissez &lt;strong&gt;k6&lt;/strong&gt; pour des scripts JavaScript et un outil open source sans frais de licence en entreprise : son &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;dépôt&lt;/a&gt; est sous AGPL-3.0 (vérifié le 21 octobre 2026). LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=nbomber-load-testing&quot;&gt;exécute des scripts k6&lt;/a&gt; depuis 25 régions cloud, mais lance les scénarios arrival-rate avec un nombre fixe d&amp;#39;utilisateurs. Choisissez &lt;strong&gt;Gatling&lt;/strong&gt; pour un outil orienté code sur la JVM ; notre &lt;a href=&quot;https://loadtest.app/fr/gatling-load-testing/&quot;&gt;revue de Gatling&lt;/a&gt; le couvre. Choisissez &lt;strong&gt;JMeter&lt;/strong&gt; si vos testeurs préfèrent une interface graphique ou si vous avez besoin de samplers JDBC, JMS ou LDAP sans extension. Le panorama des &lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;outils de test de charge open source&lt;/a&gt; les compare côte à côte.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NBomber est-il gratuit pour un usage commercial ?&lt;/strong&gt;
Non. NBomber n&amp;#39;est gratuit que pour un usage personnel et académique. Une entreprise a besoin d&amp;#39;une licence Business à 1 500 $ par an ou d&amp;#39;une licence Enterprise à 2 500 $ par an.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelles versions de .NET NBomber prend-il en charge ?&lt;/strong&gt;
Il cible .NET Standard 2.1, il tourne donc sur .NET Core 3.0 et toutes les versions de .NET suivantes. La documentation recommande .NET 10.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des tests NBomber ?&lt;/strong&gt;
Non. LoadFocus exécute des plans de test JMeter et des scripts k6. Pour faire tourner NBomber sur plusieurs machines, utilisez NBomber Cluster, qui demande une licence Enterprise.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-load-testing/&quot;&gt;Test de charge Gatling : l&amp;#39;outil JVM passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;Outils de test de charge open source : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;Critères de réussite d&amp;#39;un test de charge : comment les fixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tsung-load-testing/&quot;&gt;Test de charge Tsung : l&amp;#39;outil Erlang passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Test de charge Tsung : l&apos;outil Erlang passé en revue</title><link>https://loadtest.app/fr/tsung-load-testing/</link><guid isPermaLink="true">https://loadtest.app/fr/tsung-load-testing/</guid><description>Test de charge Tsung passé en revue : scénarios XML, phases d&apos;arrivée, plugins HTTP, XMPP, bases de données et MQTT, clients distribués, version de 2023.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Tsung est un outil de test de charge open source écrit en Erlang, qui décrit chaque test dans un fichier XML et peut répartir la charge sur de nombreuses machines clientes. Le test de charge avec Tsung garde du sens pour des protocoles que peu d&amp;#39;outils couvrent, comme XMPP, LDAP ou PostgreSQL au niveau du protocole, et pour un très grand nombre d&amp;#39;utilisateurs sur du matériel modeste. La dernière version de Tsung date de mars 2023 : pour de nouveaux tests HTTP ou d&amp;#39;API, la plupart des équipes seront mieux servies par k6, Gatling ou JMeter.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas exécuté Tsung pour cette revue. Les faits proviennent de la documentation et du dépôt GitHub de Tsung, vérifiés le 21 octobre 2026, et les appréciations sont les nôtres.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sujet&lt;/th&gt;
&lt;th&gt;Tsung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;GPL-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Écrit en&lt;/td&gt;
&lt;td&gt;Erlang (nécessite Erlang/OTP R16B03 ou plus récent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dernière version&lt;/td&gt;
&lt;td&gt;1.8.0 (2 mars 2023)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests écrits en&lt;/td&gt;
&lt;td&gt;Fichiers de configuration XML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modèle de charge&lt;/td&gt;
&lt;td&gt;Nouveaux utilisateurs par phase d&amp;#39;arrivée (ouvert)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocoles&lt;/td&gt;
&lt;td&gt;HTTP, WebDAV, XMPP, PostgreSQL, MySQL, LDAP, WebSocket, AMQP, MQTT, TCP/UDP bruts (en partie expérimentaux)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Montée en échelle&lt;/td&gt;
&lt;td&gt;Machines clientes via SSH sans mot de passe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rapports&lt;/td&gt;
&lt;td&gt;Tableau de bord en direct sur le port 8091, rapport HTML avec &lt;code&gt;tsung_stats.pl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qui maintient Tsung, et le projet est-il encore actif ?&lt;/h2&gt;
&lt;p&gt;ProcessOne héberge le projet sur GitHub sous GPL-2.0. Il est maintenu mais calme : la dernière version, la 1.8.0, date de mars 2023, et depuis il ne reçoit que des pull requests fusionnées de temps en temps.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/processone/tsung&quot;&gt;dépôt&lt;/a&gt; affiche un dernier commit le 2 mars 2026, une pull request qui remplace des appels dépréciés, et le &lt;a href=&quot;https://github.com/processone/tsung/releases/tag/v1.8.0&quot;&gt;tag v1.8.0&lt;/a&gt; est daté du 2 mars 2023 (vérifié le 21 octobre 2026). La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/&quot;&gt;documentation&lt;/a&gt; porte encore le titre 1.7.0 : vérifiez le dépôt quand un détail paraît daté. Un projet calme veut aussi dire moins de réponses quand quelque chose se passe mal.&lt;/p&gt;
&lt;h2&gt;Comment fonctionne un test Tsung ?&lt;/h2&gt;
&lt;p&gt;Un test est un fichier XML en quatre parties principales : les machines clientes, les serveurs cibles, les phases de charge et les sessions utilisateur. Chaque nouvel utilisateur choisit une session selon sa probabilité et exécute ses requêtes dans l&amp;#39;ordre.&lt;/p&gt;
&lt;p&gt;Cet extrait lance cinq nouveaux utilisateurs par seconde pendant dix minutes ; chacun charge une liste de produits, marque une pause d&amp;#39;environ deux secondes puis envoie une requête POST au panier :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;load&amp;gt;
  &amp;lt;arrivalphase phase=&amp;quot;1&amp;quot; duration=&amp;quot;10&amp;quot; unit=&amp;quot;minute&amp;quot;&amp;gt;
    &amp;lt;users arrivalrate=&amp;quot;5&amp;quot; unit=&amp;quot;second&amp;quot;/&amp;gt;
  &amp;lt;/arrivalphase&amp;gt;
&amp;lt;/load&amp;gt;
&amp;lt;sessions&amp;gt;
  &amp;lt;session name=&amp;quot;browse&amp;quot; probability=&amp;quot;100&amp;quot;
           type=&amp;quot;ts_http&amp;quot;&amp;gt;
    &amp;lt;request&amp;gt;&amp;lt;http url=&amp;quot;/products&amp;quot; method=&amp;quot;GET&amp;quot;/&amp;gt;&amp;lt;/request&amp;gt;
    &amp;lt;thinktime value=&amp;quot;2&amp;quot; random=&amp;quot;true&amp;quot;/&amp;gt;
    &amp;lt;request&amp;gt;&amp;lt;http url=&amp;quot;/cart&amp;quot; method=&amp;quot;POST&amp;quot;
                   contents=&amp;quot;sku=A-100&amp;quot;/&amp;gt;&amp;lt;/request&amp;gt;
  &amp;lt;/session&amp;gt;
&amp;lt;/sessions&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-sessions.html&quot;&gt;page des sessions&lt;/a&gt; indique que les probabilités des sessions doivent totaliser 100 (ou, depuis la 1.5.0, que l&amp;#39;on peut utiliser des poids), et qu&amp;#39;un temps de réflexion aléatoire suit une loi exponentielle autour de sa valeur, sauf si vous donnez une plage &lt;code&gt;min&lt;/code&gt; et &lt;code&gt;max&lt;/code&gt; (vérifié le 21 octobre 2026). Pour HTTP et PostgreSQL, un enregistreur proxy transforme une session de navigateur ou de client en ce XML.&lt;/p&gt;
&lt;h2&gt;Quel modèle de charge Tsung utilise-t-il ?&lt;/h2&gt;
&lt;p&gt;Un modèle de charge ouvert. Chaque phase d&amp;#39;arrivée lance de nouveaux utilisateurs à intervalle ou à taux fixé, quoi que fassent les utilisateurs déjà en cours, et une phase se termine quand son temps est écoulé, même si ses sessions ne sont pas finies.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-load.html&quot;&gt;page de la charge&lt;/a&gt; liste les réglages : &lt;code&gt;interarrival&lt;/code&gt; ou &lt;code&gt;arrivalrate&lt;/code&gt; par phase, &lt;code&gt;maxnumber&lt;/code&gt; pour plafonner les utilisateurs lancés par une phase, un attribut &lt;code&gt;duration&lt;/code&gt; sur l&amp;#39;ensemble de la charge pour arrêter le test à heure fixe, et &lt;code&gt;wait_all_sessions_end&lt;/code&gt; pour que la phase suivante attende la fin des utilisateurs en cours (vérifié le 21 octobre 2026). Nos articles sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; et sur le &lt;a href=&quot;https://loadtest.app/fr/think-time-in-load-testing/&quot;&gt;temps de réflexion&lt;/a&gt; expliquent comment ces choix changent ce que mesure un test.&lt;/p&gt;
&lt;h2&gt;Quels protocoles Tsung peut-il tester ?&lt;/h2&gt;
&lt;p&gt;Plus que la plupart des outils de test de charge : HTTP (y compris SOAP), WebDAV, XMPP, PostgreSQL, MySQL, LDAP, WebSocket, AMQP, MQTT, ainsi que TCP, UDP ou SSL bruts. La documentation qualifie d&amp;#39;expérimentaux les plugins MySQL, WebSocket, AMQP et MQTT, avec AMQP 0.9.1 et MQTT 3.1 seulement.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/features.html&quot;&gt;page des fonctionnalités&lt;/a&gt; décrit chaque plugin (vérifié le 21 octobre 2026). Sur XMPP et PostgreSQL, Tsung a longtemps eu peu de concurrents : il parle lui-même le protocole, vous testez donc le serveur et non une bibliothèque cliente. Pour les applications temps réel, notre panorama des &lt;a href=&quot;https://loadtest.app/fr/websocket-load-testing-tools/&quot;&gt;outils de test de charge WebSocket&lt;/a&gt; place Tsung à côté d&amp;#39;options plus récentes.&lt;/p&gt;
&lt;h2&gt;Comment répartir un test Tsung sur plusieurs machines ?&lt;/h2&gt;
&lt;p&gt;Vous listez les machines clientes dans le XML, et le contrôleur y lance la charge via SSH sans mot de passe, ou via rsh. Chaque client peut recevoir un poids, une limite d&amp;#39;utilisateurs et un nombre de CPU.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-client-server.html&quot;&gt;page clients et serveur&lt;/a&gt; explique que Tsung fait tourner une machine virtuelle Erlang par CPU déclaré avec &lt;code&gt;cpu&lt;/code&gt; sur chaque client (un seul par défaut) et en démarre une nouvelle quand une VM atteint &lt;code&gt;maxusers&lt;/code&gt;. Il peut aussi récupérer ses machines clientes auprès d&amp;#39;un ordonnanceur de lots comme PBS, LSF ou OAR. La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/installation.html&quot;&gt;page d&amp;#39;installation&lt;/a&gt; demande Erlang/OTP R16B03 ou plus récent, plus, en option, Perl 5 et gnuplot, ou Python et matplotlib, pour les graphiques (vérifié le 21 octobre 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, qui publie ce site, n&amp;#39;exécute pas de fichiers Tsung. LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tsung-load-testing&quot;&gt;exécute des plans de test JMeter&lt;/a&gt; et des scripts k6 depuis 25 régions cloud.&lt;/p&gt;
&lt;h2&gt;Comment lire les résultats de Tsung ?&lt;/h2&gt;
&lt;p&gt;De deux façons : avec un tableau de bord en direct servi par le contrôleur sur le port 8091, et avec un rapport HTML généré après l&amp;#39;exécution par le script &lt;code&gt;tsung_stats.pl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/reports.html&quot;&gt;page des rapports&lt;/a&gt; indique que le tableau de bord existe depuis la 1.6.0, montre l&amp;#39;état courant, construit les graphiques pendant le test et s&amp;#39;arrête à la fin du test, sauf si vous lancez Tsung avec &lt;code&gt;-k&lt;/code&gt; (vérifié le 21 octobre 2026). Le rapport couvre les temps de réponse et de connexion, les transactions, les requêtes par seconde et les codes d&amp;#39;erreur, et peut inclure les mesures CPU, mémoire et réseau des serveurs, collectées par des agents Erlang, SNMP ou munin. La documentation ne décrit pas de seuil de réussite : un pipeline CI doit analyser lui-même les résultats ; notre guide des &lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;critères de réussite d&amp;#39;un test de charge&lt;/a&gt; dit quoi vérifier.&lt;/p&gt;
&lt;h2&gt;Quels sont les points forts et les limites de Tsung ?&lt;/h2&gt;
&lt;p&gt;Il est solide sur l&amp;#39;étendue des protocoles, les phases d&amp;#39;arrivée ouvertes et le nombre d&amp;#39;utilisateurs par machine, que la documentation chiffre en milliers par CPU. Ses limites sont un historique de versions calme, des scripts uniquement en XML et aucun contrôle de réussite intégré.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tests XMPP, LDAP et bases de données au niveau du protocole, sans écrire de code client.&lt;/li&gt;
&lt;li&gt;Répartition par simple SSH, sans broker ni service supplémentaire.&lt;/li&gt;
&lt;li&gt;Supervision des serveurs dans le même rapport.&lt;/li&gt;
&lt;li&gt;Toute logique au-delà du XML passe par Erlang, que peu d&amp;#39;équipes écrivent.&lt;/li&gt;
&lt;li&gt;Erlang doit être installé sur le contrôleur et sur chaque client.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quand choisir plutôt k6, Gatling ou JMeter ?&lt;/h2&gt;
&lt;p&gt;Choisissez un autre outil si vous testez du HTTP ou des API et voulez un projet actif, avec des scripts dans un langage répandu.&lt;/p&gt;
&lt;p&gt;Choisissez &lt;strong&gt;k6&lt;/strong&gt; pour des scripts JavaScript avec des &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;seuils&lt;/a&gt; intégrés au script et un projet actif (vérifié le 21 octobre 2026). Choisissez &lt;strong&gt;Gatling&lt;/strong&gt; pour des simulations orientées code sur la JVM ; notre &lt;a href=&quot;https://loadtest.app/fr/gatling-load-testing/&quot;&gt;revue de Gatling&lt;/a&gt; le couvre. Choisissez &lt;strong&gt;JMeter&lt;/strong&gt; si vos testeurs veulent une interface graphique ou si vous avez besoin de samplers JDBC, JMS ou LDAP avec un large écosystème de plugins. LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tsung-load-testing&quot;&gt;exécute JMeter et k6&lt;/a&gt; depuis 25 régions cloud, et le panorama des &lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;outils de test de charge open source&lt;/a&gt; compare ces outils côte à côte.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tsung est-il encore maintenu ?&lt;/strong&gt;
Oui, mais discrètement. La dernière version, la 1.8.0, est sortie le 2 mars 2023, et le dépôt reçoit encore de temps en temps des changements fusionnés, le dernier en mars 2026.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quels protocoles Tsung prend-il en charge ?&lt;/strong&gt;
HTTP et SOAP, WebDAV, XMPP, PostgreSQL, LDAP et TCP, UDP ou SSL bruts, plus MySQL, WebSocket, AMQP et MQTT, que la documentation qualifie d&amp;#39;expérimentaux.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des tests Tsung ?&lt;/strong&gt;
Non. LoadFocus exécute des plans de test JMeter et des scripts k6. Pour répartir un test Tsung sur plusieurs machines, listez-les comme clients dans le fichier XML.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/websocket-load-testing-tools/&quot;&gt;Outils de test de charge WebSocket : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;Outils de test de charge open source : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-load-testing/&quot;&gt;Test de charge Gatling : l&amp;#39;outil JVM passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/nbomber-load-testing/&quot;&gt;Test de charge NBomber : le framework .NET passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/pgbench/&quot;&gt;pgbench : benchmark et test de charge de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/sysbench/&quot;&gt;Utiliser sysbench : benchmarks CPU, disque et MySQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Test de charge Artillery : l&apos;outil Node.js passé en revue</title><link>https://loadtest.app/fr/artillery-load-testing/</link><guid isPermaLink="true">https://loadtest.app/fr/artillery-load-testing/</guid><description>Test de charge Artillery passé en revue : scripts YAML et TypeScript, phases d&apos;arrivée, Playwright, contrôles ensure, exécutions AWS et Azure, et tarifs.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Artillery est un outil de test de charge open source qui tourne sur Node.js et décrit chaque test dans un fichier YAML, TypeScript ou JavaScript. Le test de charge avec Artillery convient aux équipes qui vivent dans l&amp;#39;écosystème JavaScript, qui veulent faire arriver de nouveaux utilisateurs à un rythme fixé ou qui veulent des tests navigateur avec Playwright dans le même outil. Les équipes qui veulent un binaire unique sans runtime seront mieux servies par k6, et celles qui ont besoin de nombreux protocoles prêts à l&amp;#39;emploi par JMeter.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas exécuté Artillery pour cette revue. Les faits proviennent de la documentation, du dépôt, du paquet npm et de la page de tarifs d&amp;#39;Artillery, vérifiés le 19 octobre 2026, et les appréciations sont les nôtres.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sujet&lt;/th&gt;
&lt;th&gt;Artillery&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;MPL-2.0 ; certains modules Azure sous BSL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Node.js, dernière LTS (le paquet exige 22.18.0 ou plus)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version actuelle&lt;/td&gt;
&lt;td&gt;2.0.34 (14 août 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests écrits en&lt;/td&gt;
&lt;td&gt;YAML, TypeScript ou JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modèle de charge&lt;/td&gt;
&lt;td&gt;Nouveaux utilisateurs virtuels par seconde, par phases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moteurs intégrés&lt;/td&gt;
&lt;td&gt;HTTP, WebSocket, Socket.IO, Playwright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contrôles de réussite&lt;/td&gt;
&lt;td&gt;Plugin &lt;code&gt;ensure&lt;/code&gt;, code de sortie non nul&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Montée en charge&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run-lambda&lt;/code&gt;, &lt;code&gt;run-fargate&lt;/code&gt;, &lt;code&gt;run-aci&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rapports hébergés&lt;/td&gt;
&lt;td&gt;Artillery Cloud, facultatif, avec offre gratuite&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qui développe Artillery, et sous quelle licence ?&lt;/h2&gt;
&lt;p&gt;Artillery Software Inc. le maintient sur GitHub. L&amp;#39;essentiel du code est sous MPL-2.0, qui autorise l&amp;#39;usage commercial ; certains modules propres à Azure sont sous Business Source License.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;README du dépôt&lt;/a&gt; autorise l&amp;#39;usage d&amp;#39;Artillery sur Azure pour l&amp;#39;évaluation et les preuves de concept, et exige une licence commerciale pour un usage commercial ou en production sur Azure. La dernière version est la &lt;a href=&quot;https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.34&quot;&gt;2.0.34&lt;/a&gt;, publiée sur npm le 14 août 2026, et ses métadonnées demandent Node.js 22.18.0 ou plus ; le &lt;a href=&quot;https://www.artillery.io/docs/get-started/get-artillery&quot;&gt;guide d&amp;#39;installation&lt;/a&gt; recommande la dernière version LTS (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment fonctionne un script de test Artillery ?&lt;/h2&gt;
&lt;p&gt;Un script a deux parties : &lt;code&gt;config&lt;/code&gt;, qui fixe la cible, les phases de charge et les plugins, et &lt;code&gt;scenarios&lt;/code&gt;, qui liste ce que fait chaque utilisateur virtuel. Vous pouvez l&amp;#39;écrire en YAML ou exporter &lt;code&gt;config&lt;/code&gt; et &lt;code&gt;scenarios&lt;/code&gt; depuis un fichier TypeScript ou JavaScript.&lt;/p&gt;
&lt;p&gt;Ce test monte de 5 à 50 nouveaux utilisateurs par seconde en deux minutes, tient 50 par seconde pendant dix minutes et échoue si le 99e percentile du temps de réponse atteint 800 ms :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  target: https://staging.example.com
  phases:
    - duration: 120
      arrivalRate: 5
      rampTo: 50
      name: ramp
    - duration: 600
      arrivalRate: 50
      name: sustain
  plugins:
    ensure:
      thresholds:
        - http.response_time.p99: 800
scenarios:
  - name: browse and add to cart
    flow:
      - get:
          url: /products
      - think: 2
      - post:
          url: /cart
          json:
            sku: A-100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;D&amp;#39;après la &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;référence des scripts de test&lt;/a&gt;, les quatre types de phase sont un taux d&amp;#39;arrivée constant, une rampe linéaire avec &lt;code&gt;rampTo&lt;/code&gt;, un &lt;code&gt;arrivalCount&lt;/code&gt; fixe réparti sur une période et une &lt;code&gt;pause&lt;/code&gt;. Le code personnalisé chargé par &lt;code&gt;config.processor&lt;/code&gt; peut être un module TypeScript en local et sur Fargate, pas sur Lambda (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quel modèle de charge Artillery utilise-t-il ?&lt;/h2&gt;
&lt;p&gt;Artillery lance de nouveaux utilisateurs virtuels au rythme que vous fixez, que les précédents aient terminé ou non. C&amp;#39;est un modèle de charge ouvert, qui maintient les arrivées même quand le système ralentit.&lt;/p&gt;
&lt;p&gt;Chaque nouvel utilisateur choisit un scénario, l&amp;#39;exécute et repart, donc un système lent accumule des utilisateurs comme le ferait un vrai trafic. &lt;code&gt;maxVusers&lt;/code&gt; plafonne le nombre d&amp;#39;utilisateurs simultanés d&amp;#39;une phase si vous devez protéger le générateur de charge. Notre article sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique la différence, et la &lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;loi de Little&lt;/a&gt; montre comment le taux d&amp;#39;arrivée et le temps de réponse fixent le nombre d&amp;#39;utilisateurs simultanés.&lt;/p&gt;
&lt;h2&gt;Quels protocoles et navigateurs peut-il tester ?&lt;/h2&gt;
&lt;p&gt;HTTP est le moteur par défaut, et WebSocket, Socket.IO et Playwright sont intégrés. gRPC et AWS Kinesis demandent des moteurs installés à part.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;page des moteurs&lt;/a&gt; décrit le principe : chaque scénario tourne sur un moteur, et vous pouvez écrire le vôtre. Sur npm, &lt;code&gt;artillery-engine-grpc&lt;/code&gt; en est à la 0.0.9 et &lt;code&gt;artillery-engine-kinesis&lt;/code&gt; à la 1.1.1, tous deux sous MPL-2.0. Le &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/playwright&quot;&gt;moteur Playwright&lt;/a&gt; exécute votre code Playwright dans de vrais navigateurs headless et publie des Web Vitals comme TTFB, FCP et LCP par page. La documentation prévient qu&amp;#39;un navigateur séparé par utilisateur, au lieu d&amp;#39;un contexte de navigateur, demande beaucoup plus de CPU et de mémoire (vérifié le 19 octobre 2026). Notre panorama des &lt;a href=&quot;https://loadtest.app/fr/websocket-load-testing-tools/&quot;&gt;outils de test de charge WebSocket&lt;/a&gt; place Artillery à côté d&amp;#39;autres options pour les applications temps réel.&lt;/p&gt;
&lt;h2&gt;Comment s&amp;#39;intègre-t-il à la CI ?&lt;/h2&gt;
&lt;p&gt;Le plugin &lt;code&gt;ensure&lt;/code&gt; transforme des métriques en contrôles de réussite, et un contrôle en échec fait sortir Artillery avec un code non nul. Cela suffit à n&amp;#39;importe quel système de CI pour faire échouer le build.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;référence d&amp;#39;ensure&lt;/a&gt; propose deux types de contrôle : &lt;code&gt;thresholds&lt;/code&gt;, où une métrique doit rester sous une valeur, et &lt;code&gt;conditions&lt;/code&gt;, qui combinent des métriques dans une expression comme &lt;code&gt;http.response_time.p95 &amp;lt; 250 and http.request_rate &amp;gt; 1000&lt;/code&gt;. Une condition marquée &lt;code&gt;strict: false&lt;/code&gt; signale sans faire échouer. Le &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/apdex&quot;&gt;plugin apdex&lt;/a&gt; ajoute un score Apdex aux tests HTTP, avec un seuil par défaut de 500 ms (vérifié le 19 octobre 2026) ; notre article sur le &lt;a href=&quot;https://loadtest.app/fr/apdex-score/&quot;&gt;score Apdex&lt;/a&gt; explique comment le lire. Pour un fichier de workflow, voir notre guide du &lt;a href=&quot;https://loadtest.app/fr/load-testing-in-github-actions/&quot;&gt;test de charge dans GitHub Actions&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Comment faire monter un test Artillery en charge ?&lt;/h2&gt;
&lt;p&gt;Depuis la ligne de commande, sur votre propre compte cloud : &lt;code&gt;run-lambda&lt;/code&gt; et &lt;code&gt;run-fargate&lt;/code&gt; sur AWS, &lt;code&gt;run-aci&lt;/code&gt; sur Azure Container Instances. Artillery crée les ressources nécessaires à l&amp;#39;exécution et supprime ensuite les ressources temporaires.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-fargate&quot;&gt;guide Fargate&lt;/a&gt; liste les ressources et les permissions IAM en jeu. Le &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-lambda&quot;&gt;guide Lambda&lt;/a&gt; en donne les limites : un test ne peut pas durer plus de 15 minutes, un test lancé ne peut pas être arrêté, et les hooks &lt;code&gt;before&lt;/code&gt; et &lt;code&gt;after&lt;/code&gt; tournent une fois par worker. Le &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/azure-aci&quot;&gt;guide Azure&lt;/a&gt; demande Artillery 2.0.19 ou plus et, hors évaluation, un abonnement (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, qui publie ce site, n&amp;#39;exécute pas de scripts Artillery. LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=artillery-load-testing&quot;&gt;exécute des plans de test JMeter et des scripts k6&lt;/a&gt; depuis 25 régions cloud : pour Artillery, les commandes ci-dessus restent le moyen de monter en charge.&lt;/p&gt;
&lt;h2&gt;Combien coûte Artillery Cloud ?&lt;/h2&gt;
&lt;p&gt;Le tableau de bord est facultatif : les résultats n&amp;#39;y arrivent que si vous lancez avec &lt;code&gt;--record&lt;/code&gt; et une clé d&amp;#39;API. Les offres vont d&amp;#39;une formule gratuite à 499 $ par mois.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.artillery.io/pricing&quot;&gt;page de tarifs&lt;/a&gt; indique (vérifié le 19 octobre 2026) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free :&lt;/strong&gt; 30 rapports par mois, 1 mois de conservation, 2 membres, tests distribués jusqu&amp;#39;à 5 workers et 30 minutes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team, 199 $ par mois :&lt;/strong&gt; 1 000 rapports, 6 mois, 8 membres, jusqu&amp;#39;à 25 workers et 2 heures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business, 499 $ par mois :&lt;/strong&gt; 2 500 rapports, 18 mois, sans limite de membres, de workers ni de durée.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le SSO entreprise, les journaux d&amp;#39;audit et les SLA de support commencent à 1 199 $ par mois, et la facturation annuelle fait économiser 20 %.&lt;/p&gt;
&lt;h2&gt;Que fait bien Artillery, et où sont ses limites ?&lt;/h2&gt;
&lt;p&gt;Il excelle sur la charge à taux d&amp;#39;arrivée, les scripts courts et lisibles et les tests navigateur avec Playwright. Il est moins à l&amp;#39;aise quand il faut un binaire unique, de nombreux protocoles sans extension ou Azure sans licence.&lt;/p&gt;
&lt;p&gt;En tant qu&amp;#39;outil Node.js, il peut utiliser n&amp;#39;importe quel module npm dans des fonctions personnalisées, au prix d&amp;#39;un runtime de plus sur chaque machine de test. Limites que la documentation énonce elle-même :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les exécutions Lambda s&amp;#39;arrêtent à 15 minutes et ne peuvent pas être annulées.&lt;/li&gt;
&lt;li&gt;Le code personnalisé en TypeScript (&lt;code&gt;config.processor&lt;/code&gt;) ne tourne pas sur Lambda.&lt;/li&gt;
&lt;li&gt;gRPC et Kinesis sont des moteurs séparés.&lt;/li&gt;
&lt;li&gt;L&amp;#39;usage en production sur Azure exige une licence commerciale.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quand choisir plutôt k6, JMeter ou Locust ?&lt;/h2&gt;
&lt;p&gt;Choisissez un autre outil quand son runtime, ses protocoles ou son langage conviennent mieux à votre équipe.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;k6&lt;/strong&gt; si vous voulez un binaire Go sans Node.js à gérer et des seuils dans le script. Notre comparatif &lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; met les deux côte à côte. LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=artillery-load-testing&quot;&gt;exécute des scripts k6&lt;/a&gt; depuis 25 régions cloud, mais fait tourner les scénarios arrival-rate avec un nombre fixe d&amp;#39;utilisateurs ; pour tenir un taux d&amp;#39;arrivée, lancez-les avec k6 lui-même.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;JMeter&lt;/strong&gt; si vous avez besoin de JDBC, JMS, LDAP ou FTP prêts à l&amp;#39;emploi, ou si vos testeurs construisent leurs tests dans une interface graphique.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;Locust&lt;/strong&gt; si votre équipe écrit en Python ; notre &lt;a href=&quot;https://loadtest.app/fr/locust-load-testing/&quot;&gt;revue de Locust&lt;/a&gt; le présente. Le panorama des &lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;outils de test de charge open source&lt;/a&gt; les met tous côte à côte.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Artillery est-il gratuit pour un usage commercial ?&lt;/strong&gt;
La CLI est en majeure partie sous MPL-2.0, qui autorise l&amp;#39;usage commercial. L&amp;#39;exception est Azure : un usage commercial ou en production de ses modules Azure exige une licence commerciale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery peut-il exécuter des tests navigateur ?&lt;/strong&gt;
Oui. Son moteur Playwright intégré exécute votre code Playwright dans des navigateurs headless et publie des Web Vitals pour chaque page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des scripts Artillery ?&lt;/strong&gt;
Non. LoadFocus exécute des plans de test JMeter et des scripts k6. Pour faire monter un test Artillery en charge, utilisez &lt;code&gt;run-lambda&lt;/code&gt;, &lt;code&gt;run-fargate&lt;/code&gt; ou &lt;code&gt;run-aci&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery : quel outil de test de charge choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;Outils de test de charge open source : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/websocket-load-testing-tools/&quot;&gt;Outils de test de charge WebSocket : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/apdex-score/&quot;&gt;Score Apdex : définition et méthode de calcul&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Score Apdex : définition et méthode de calcul</title><link>https://loadtest.app/fr/apdex-score/</link><guid isPermaLink="true">https://loadtest.app/fr/apdex-score/</guid><description>Le score Apdex expliqué : la formule, le choix du seuil T, un exemple chiffré et comment JMeter, Artillery et LoadFocus le calculent en test de charge.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;Un score Apdex est un nombre entre 0 et 1 qui indique la part des requêtes assez rapides pour les personnes qui les attendent. Vous choisissez un temps cible T : les réponses jusqu&amp;#39;à T comptent entièrement, celles jusqu&amp;#39;à quatre fois T comptent pour moitié, et les plus lentes comptent zéro. Un résultat de 1 signifie que chaque requête a atteint la cible, et 0 que chacune était trop lente.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zone&lt;/th&gt;
&lt;th&gt;Temps de réponse&lt;/th&gt;
&lt;th&gt;Poids dans le score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Satisfait (satisfied)&lt;/td&gt;
&lt;td&gt;jusqu&amp;#39;à T&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tolérant (tolerating)&lt;/td&gt;
&lt;td&gt;au-delà de T, jusqu&amp;#39;à 4T&lt;/td&gt;
&lt;td&gt;0,5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frustré (frustrated)&lt;/td&gt;
&lt;td&gt;au-delà de 4T&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Les faits ci-dessous viennent de la documentation et du code source des outils, vérifiés le 19 octobre 2026.&lt;/p&gt;
&lt;h2&gt;Comment calculer un score Apdex ?&lt;/h2&gt;
&lt;p&gt;Additionnez les requêtes satisfaites et la moitié des requêtes tolérées, puis divisez par le total. Le résultat tombe toujours entre 0 et 1.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Apdex(T) = (satisfied + tolerating / 2) / total
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.newrelic.com/docs/apm/new-relic-apm/apdex/apdex-measuring-user-satisfaction/&quot;&gt;documentation Apdex de New Relic&lt;/a&gt; déroule un exemple avec T fixé à 500 ms : sur 200 requêtes, 170 se terminent en 500 ms au plus, 20 prennent entre 500 ms et 2 secondes, et 10 échouent ou prennent plus longtemps. Cela donne (170 + 20 / 2) / 200 = 0,90 (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;p&gt;Un second exemple montre l&amp;#39;intérêt du score en test de charge. Une exécution envoie 10 000 requêtes avec T = 300 ms : 8 200 se terminent en 300 ms, 1 300 entre 300 ms et 1,2 seconde, et 500 prennent plus longtemps. L&amp;#39;Apdex vaut (8 200 + 650) / 10 000 = 0,885. La même exécution peut très bien afficher une moyenne de 280 ms, qui semble correcte seule et masque les 500 requêtes de plus d&amp;#39;une seconde.&lt;/p&gt;
&lt;h2&gt;D&amp;#39;où vient l&amp;#39;Apdex ?&lt;/h2&gt;
&lt;p&gt;Apdex, pour Application Performance Index, est un standard ouvert né d&amp;#39;un groupe d&amp;#39;entreprises, l&amp;#39;Apdex Alliance. Peter Sevcik, de NetForecast, a fondé l&amp;#39;Alliance en 2004.&lt;/p&gt;
&lt;p&gt;L&amp;#39;&lt;a href=&quot;https://en.wikipedia.org/wiki/Apdex&quot;&gt;article Wikipédia sur l&amp;#39;Apdex&lt;/a&gt; cite l&amp;#39;article de Sevcik de 2005 et donne la règle des 4T. L&amp;#39;&lt;a href=&quot;https://www.apdex.org/&quot;&gt;Apdex Users Group&lt;/a&gt; indique aujourd&amp;#39;hui que les règles des seuils T et F « sont devenues flexibles » (vérifié le 19 octobre 2026), et les outils profitent de cette liberté.&lt;/p&gt;
&lt;h2&gt;Comment JMeter, Artillery et LoadFocus le calculent-ils ?&lt;/h2&gt;
&lt;p&gt;Tous trois partent de T = 500 ms. Ils diffèrent sur la fin de la zone tolérée et sur le sort des requêtes en échec, si bien qu&amp;#39;une même exécution peut donner trois valeurs un peu différentes.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;T par défaut&lt;/th&gt;
&lt;th&gt;Toléré jusqu&amp;#39;à&lt;/th&gt;
&lt;th&gt;Requêtes en échec&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tableau de bord HTML de JMeter&lt;/td&gt;
&lt;td&gt;500 ms&lt;/td&gt;
&lt;td&gt;1 500 ms&lt;/td&gt;
&lt;td&gt;comptées comme frustrées&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugin &lt;code&gt;apdex&lt;/code&gt; d&amp;#39;Artillery&lt;/td&gt;
&lt;td&gt;500 ms&lt;/td&gt;
&lt;td&gt;4T (2 000 ms)&lt;/td&gt;
&lt;td&gt;seules les réponses sont notées&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page de résultats LoadFocus&lt;/td&gt;
&lt;td&gt;500 ms, fixe&lt;/td&gt;
&lt;td&gt;4T (2 000 ms)&lt;/td&gt;
&lt;td&gt;classées selon le temps de réponse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New Relic APM&lt;/td&gt;
&lt;td&gt;réglé par application&lt;/td&gt;
&lt;td&gt;4T&lt;/td&gt;
&lt;td&gt;erreurs serveur frustrées&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;rapport de tableau de bord&lt;/a&gt; contient un tableau APDEX par transaction. Ses valeurs par défaut sont &lt;code&gt;jmeter.reportgenerator.apdex_satisfied_threshold=500&lt;/code&gt; et &lt;code&gt;apdex_tolerated_threshold=1500&lt;/code&gt; : la zone tolérée s&amp;#39;arrête donc à 3T tant que vous n&amp;#39;y touchez pas, et &lt;code&gt;apdex_per_transaction&lt;/code&gt; fixe des seuils propres à chaque sampler. Dans &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/src/core/src/main/java/org/apache/jmeter/report/processor/ApdexSummaryConsumer.java&quot;&gt;&lt;code&gt;ApdexSummaryConsumer&lt;/code&gt;&lt;/a&gt;, un échantillon en échec s&amp;#39;ajoute au total et jamais aux satisfaits ou aux tolérés, donc chaque échec fait baisser le score (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery.&lt;/strong&gt; Le &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/apdex&quot;&gt;plugin apdex&lt;/a&gt; ne fonctionne qu&amp;#39;avec le moteur HTTP et publie les compteurs &lt;code&gt;apdex.satisfied&lt;/code&gt;, &lt;code&gt;apdex.tolerated&lt;/code&gt; et &lt;code&gt;apdex.frustrated&lt;/code&gt;. Son code dans &lt;a href=&quot;https://github.com/artilleryio/artillery/tree/main/packages/artillery-plugin-apdex&quot;&gt;artillery-plugin-apdex 1.24.0&lt;/a&gt; classe chaque réponse selon son temps total par rapport à T et 4T, puis affiche le score avec une étiquette : excellent à partir de 0,94, good à partir de 0,85, fair à partir de 0,70, poor à partir de 0,49, unacceptable en dessous. Une requête qui ne reçoit jamais de réponse n&amp;#39;est jamais classée (vérifié le 19 octobre 2026). Notre &lt;a href=&quot;https://loadtest.app/fr/artillery-load-testing/&quot;&gt;revue d&amp;#39;Artillery&lt;/a&gt; présente l&amp;#39;outil lui-même.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus&lt;/strong&gt;, qui publie ce site, affiche le score Apdex dans l&amp;#39;onglet Insights d&amp;#39;un résultat de test de charge, à côté d&amp;#39;un &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=apdex-score&quot;&gt;histogramme des temps de réponse&lt;/a&gt;. T est fixé à 500 ms et la zone tolérée s&amp;#39;arrête à 2 000 ms ; T n&amp;#39;est pas modifiable. Chaque échantillon est classé selon son temps de réponse, et les parts satisfaite, tolérée et frustrée s&amp;#39;affichent à côté du score.&lt;/p&gt;
&lt;h2&gt;Comment choisir le seuil T ?&lt;/h2&gt;
&lt;p&gt;Choisissez T d&amp;#39;après ce qu&amp;#39;attendent les utilisateurs de cette page ou de cet endpoint, et réglez-le par transaction quand votre outil le permet. Un seul T pour toute une application mélange un endpoint de recherche rapide et un export de rapport lent dans un même chiffre.&lt;/p&gt;
&lt;p&gt;Quelques règles pratiques :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Partez d&amp;#39;un objectif réel.&lt;/strong&gt; Si vous avez déjà un objectif de latence comme « 95 % des appels de paiement sous 400 ms », T = 400 ms fait raconter la même histoire à l&amp;#39;Apdex et à l&amp;#39;objectif.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gardez le même T d&amp;#39;une exécution à l&amp;#39;autre.&lt;/strong&gt; Un Apdex ne se compare qu&amp;#39;à un Apdex mesuré au même T. Écrivez Apdex(0.4) ou « Apdex à T = 400 ms » pour éviter les comparaisons entre seuils différents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alignez aussi la zone tolérée.&lt;/strong&gt; Le réglage par défaut de JMeter s&amp;#39;arrête à 3T et les autres à 4T. Avant de comparer un rapport JMeter avec un autre outil, réglez &lt;code&gt;apdex_tolerated_threshold&lt;/code&gt; sur quatre fois T.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;N&amp;#39;ajustez pas T pour faire passer une version.&lt;/strong&gt; Déplacer T après une mauvaise exécution change la règle graduée, et la tendance que vous suiviez disparaît.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;un bon score Apdex ?&lt;/h2&gt;
&lt;p&gt;Le plugin d&amp;#39;Artillery qualifie de &lt;code&gt;excellent&lt;/code&gt; 0,94 et plus, de &lt;code&gt;good&lt;/code&gt; 0,85 à 0,94, et de &lt;code&gt;poor&lt;/code&gt; ou pire tout ce qui passe sous 0,70. Ces étiquettes n&amp;#39;ont de sens que si T a été choisi honnêtement.&lt;/p&gt;
&lt;p&gt;Un Apdex de 0,95 à T = 2 secondes peut décrire un service plus lent qu&amp;#39;un 0,80 à T = 200 ms. Quand vous fixez un critère de mise en production, écrivez le seuil et le score ensemble (« Apdex(0.5) d&amp;#39;au moins 0,9 ») et vérifiez-le à côté d&amp;#39;une limite de percentile, car les deux repèrent des problèmes différents.&lt;/p&gt;
&lt;h2&gt;Que cache l&amp;#39;Apdex ?&lt;/h2&gt;
&lt;p&gt;Il réduit toute la distribution des temps de réponse à trois cases, il ne peut donc pas dire à quel point les requêtes frustrées étaient lentes. Une requête à 2,1 secondes et une autre à 30 secondes font baisser le score exactement autant.&lt;/p&gt;
&lt;p&gt;C&amp;#39;est pourquoi il fonctionne mieux accompagné d&amp;#39;autres chiffres :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Les percentiles&lt;/strong&gt; montrent la lenteur des requêtes lentes. Notre guide sur la &lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;latence de queue&lt;/a&gt; explique pourquoi le 99e percentile compte dès qu&amp;#39;une page appelle plusieurs services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le taux d&amp;#39;erreur&lt;/strong&gt; repère les échecs que votre outil ne note peut-être pas. Artillery ne note jamais les requêtes sans réponse et New Relic compte les erreurs serveur comme frustrées : lisez le nombre d&amp;#39;erreurs à part.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La taille de l&amp;#39;échantillon&lt;/strong&gt; compte : New Relic précise que sous environ 100 requêtes par minute, le score est instable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le biais de mesure&lt;/strong&gt; existe aussi. Un générateur de charge qui attend les réponses lentes envoie moins de requêtes pendant les périodes lentes, et l&amp;#39;Apdex paraît meilleur que la réalité ; voir la &lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Comment utiliser l&amp;#39;Apdex dans un test de charge ?&lt;/h2&gt;
&lt;p&gt;Servez-vous-en comme résumé pour ceux qui ne liront pas un histogramme, et gardez la décision de réussite ou d&amp;#39;échec sur des limites explicites.&lt;/p&gt;
&lt;p&gt;Une routine qui fonctionne :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fixez T pour chaque transaction clé d&amp;#39;après votre objectif de latence.&lt;/li&gt;
&lt;li&gt;Lancez le test et notez l&amp;#39;Apdex à ce T, ainsi que les 95e et 99e percentiles et le taux d&amp;#39;erreur.&lt;/li&gt;
&lt;li&gt;Comparez l&amp;#39;Apdex avec l&amp;#39;exécution précédente au même T. Une baisse de 0,93 à 0,86 est un signal clair, même pour quelqu&amp;#39;un d&amp;#39;extérieur à l&amp;#39;équipe.&lt;/li&gt;
&lt;li&gt;Faites échouer le build sur les limites de percentile et d&amp;#39;erreur, comme décrit dans notre guide sur les &lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;critères de réussite d&amp;#39;un test de charge&lt;/a&gt;, et publiez l&amp;#39;Apdex à côté.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Un score Apdex plus élevé est-il meilleur ?&lt;/strong&gt;
Oui. 1,0 signifie que chaque requête s&amp;#39;est terminée en T au plus, et 0 que chacune a dépassé la limite tolérable ou a été comptée comme frustrée.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quel est le seuil Apdex par défaut dans JMeter ?&lt;/strong&gt;
Le tableau de bord HTML utilise 500 ms pour satisfait et 1 500 ms pour toléré. Modifiez-les avec &lt;code&gt;jmeter.reportgenerator.apdex_satisfied_threshold&lt;/code&gt; et &lt;code&gt;apdex_tolerated_threshold&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&amp;#39;Apdex tient-il compte des erreurs ?&lt;/strong&gt;
Cela dépend de l&amp;#39;outil. JMeter compte les échantillons en échec comme frustrés et New Relic fait de même avec les erreurs serveur, alors que le plugin d&amp;#39;Artillery ne note que les requêtes qui ont reçu une réponse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Peut-on comparer les scores Apdex de deux outils ?&lt;/strong&gt;
Seulement si T, la limite tolérable et le traitement des erreurs sont identiques. Sinon, comparez plutôt les percentiles et les taux d&amp;#39;erreur sous-jacents.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;Critères de réussite d&amp;#39;un test de charge : comment les fixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;Coordinated omission : ce que c&amp;#39;est et comment l&amp;#39;éviter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/artillery-load-testing/&quot;&gt;Test de charge Artillery : l&amp;#39;outil Node.js passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/slo-vs-sla/&quot;&gt;SLO vs SLA : la différence, les SLI et le budget d&amp;#39;erreur&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Azure Load Testing : le service de Microsoft passé en revue</title><link>https://loadtest.app/fr/azure-load-testing/</link><guid isPermaLink="true">https://loadtest.app/fr/azure-load-testing/</guid><description>Azure Load Testing passé en revue : tests JMeter et Locust, tests rapides par URL, moteurs et limites, régions, endpoints privés, prix par VUH et CI.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Azure Load Testing est le service managé de Microsoft pour exécuter des tests JMeter et Locust à grande échelle depuis Azure, facturé à l&amp;#39;heure d&amp;#39;utilisateur virtuel. Il convient bien quand le système testé tourne sur Azure, car il peut récupérer les métriques serveur d&amp;#39;Azure Monitor et atteindre des endpoints privés dans un réseau virtuel. Les équipes qui écrivent des scripts k6, qui n&amp;#39;ont pas d&amp;#39;abonnement Azure ou qui testent depuis l&amp;#39;extérieur des régions Azure trouveront d&amp;#39;autres services plus simples.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas exécuté Azure Load Testing pour cette revue. Les faits proviennent de la documentation et de la page de tarifs de Microsoft, vérifiées le 19 octobre 2026, et les appréciations sont les nôtres.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sujet&lt;/th&gt;
&lt;th&gt;Azure Load Testing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Service managé du hub Azure App Testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frameworks de test&lt;/td&gt;
&lt;td&gt;Apache JMeter et Locust uniquement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Option sans code&lt;/td&gt;
&lt;td&gt;Test rapide par URL, jusqu&amp;#39;à cinq requêtes HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Échelle par exécution&lt;/td&gt;
&lt;td&gt;Jusqu&amp;#39;à 400 instances de moteur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test le plus long&lt;/td&gt;
&lt;td&gt;24 heures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Origine de la charge&lt;/td&gt;
&lt;td&gt;Région de la ressource, ou jusqu&amp;#39;à 5 régions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoints privés&lt;/td&gt;
&lt;td&gt;Oui, par injection dans un réseau virtuel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prix&lt;/td&gt;
&lt;td&gt;0,15 $ par heure d&amp;#39;utilisateur virtuel, 0,06 $ après 10 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conservation&lt;/td&gt;
&lt;td&gt;6 mois ; métriques client 365 jours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;Azure Load Testing ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est un service entièrement managé qui exécute votre test de charge sur les moteurs de test de Microsoft, si bien que vous ne construisez ni ne maintenez jamais de générateurs de charge. Vous créez une ressource de test de charge dans une région Azure, vous y ajoutez des tests et vous lancez les exécutions depuis le portail, l&amp;#39;Azure CLI ou un pipeline.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/overview-what-is-azure-load-testing&quot;&gt;page de présentation&lt;/a&gt; précise que l&amp;#39;application testée peut se trouver n&amp;#39;importe où : dans Azure, sur site ou dans un autre cloud. Microsoft range désormais le service dans le hub Azure App Testing, à côté de Playwright Workspaces ; le &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/quickstart-create-run-load-test-with-locust&quot;&gt;démarrage rapide Locust&lt;/a&gt; crée la ressource depuis ce hub (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quels types de tests et quels outils prend-il en charge ?&lt;/h2&gt;
&lt;p&gt;Trois entrées : un test rapide par URL, un script JMeter téléversé ou un script Locust téléversé. La documentation indique clairement qu&amp;#39;aucun autre framework de test n&amp;#39;est pris en charge.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/quickstart-create-and-run-load-test&quot;&gt;test rapide&lt;/a&gt; accepte jusqu&amp;#39;à cinq requêtes HTTP et un nombre cible d&amp;#39;utilisateurs virtuels ou de requêtes par seconde. Chaque moteur gère jusqu&amp;#39;à 250 utilisateurs virtuels, donc 400 utilisateurs tournent sur deux moteurs de 200 chacun.&lt;/p&gt;
&lt;p&gt;Avec &lt;strong&gt;JMeter&lt;/strong&gt;, vous pouvez utiliser des plugins de jmeter-plugins.org ou téléverser les vôtres, et la présentation affirme que tous les protocoles pris en charge par JMeter fonctionnent, comme une connexion à une base de données ou une file de messages. Avec &lt;strong&gt;Locust&lt;/strong&gt;, vous pouvez ajouter des plugins Locust et d&amp;#39;autres bibliothèques Python. La documentation de Locust renvoie elle-même vers le service comme &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;option hébergée&lt;/a&gt;, et notre &lt;a href=&quot;https://loadtest.app/fr/locust-load-testing/&quot;&gt;revue de Locust&lt;/a&gt; présente l&amp;#39;outil lui-même. Les scripts k6, Gatling et Artillery ne tournent pas ici (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment fonctionnent moteurs, utilisateurs virtuels et limites ?&lt;/h2&gt;
&lt;p&gt;Vous faites monter un test en charge en ajoutant des instances de moteur. Pour JMeter, la charge totale est le nombre d&amp;#39;utilisateurs du plan de test multiplié par le nombre de moteurs ; pour Locust, vous fixez le total d&amp;#39;utilisateurs et choisissez combien de moteurs les génèrent.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/concept-load-testing-concepts&quot;&gt;page des concepts&lt;/a&gt; donne les deux formules, et la &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/resource-limits-quotas-capacity&quot;&gt;page des limites du service&lt;/a&gt; fixe les plafonds par région et par abonnement (vérifié le 19 octobre 2026) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instances de moteur par exécution : 1 à 400 par défaut selon l&amp;#39;offre, 400 au maximum.&lt;/li&gt;
&lt;li&gt;Instances de moteur simultanées : 5 à 400 par défaut, jusqu&amp;#39;à 1 000 sur demande.&lt;/li&gt;
&lt;li&gt;Durée de test : 3 à 24 heures par défaut, 24 heures au maximum.&lt;/li&gt;
&lt;li&gt;Critères d&amp;#39;échec : jusqu&amp;#39;à 50 par test.&lt;/li&gt;
&lt;li&gt;Conservation : métriques serveur 90 jours, métriques client 365 jours, résultats et journaux 6 mois.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Relever une limite par défaut passe par une demande au support ; rien ne dépasse les maximums indiqués.&lt;/p&gt;
&lt;h2&gt;Peut-il tester des endpoints privés et générer de la charge depuis plusieurs régions ?&lt;/h2&gt;
&lt;p&gt;Oui aux deux, avec une réserve : les deux ne se combinent pas. La charge multirégion ne fonctionne que vers des endpoints publics.&lt;/p&gt;
&lt;p&gt;Par défaut, les moteurs tournent dans la région de votre ressource de test de charge. Le &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-generate-load-from-multiple-regions&quot;&gt;guide multirégion&lt;/a&gt; permet de choisir jusqu&amp;#39;à 5 régions par test et d&amp;#39;y répartir la charge, et il bascule alors le test en trafic public. Pour les services sans endpoint public, l&amp;#39;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-test-private-endpoint&quot;&gt;injection dans un réseau virtuel&lt;/a&gt; place les moteurs dans le réseau qui héberge l&amp;#39;application (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Que montrent les résultats et les métriques serveur ?&lt;/h2&gt;
&lt;p&gt;Le tableau de bord affiche en direct les métriques côté client pendant l&amp;#39;exécution, comme les utilisateurs virtuels, le temps de réponse et les requêtes par seconde. Pour les applications hébergées sur Azure, il ajoute les métriques côté serveur d&amp;#39;Azure Monitor, d&amp;#39;Application Insights et de Container Insights sur la même chronologie.&lt;/p&gt;
&lt;p&gt;Ce couplage est le principal atout du service : vous voyez la base de données ou le conteneur qui sature au moment où les temps de réponse montent, sans monter un tableau de bord séparé. Le &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-monitor-server-side-metrics&quot;&gt;guide des métriques serveur&lt;/a&gt; en décrit les étapes. Les exécutions passées restent comparables côte à côte, et vous pouvez télécharger les résultats pour d&amp;#39;autres outils.&lt;/p&gt;
&lt;h2&gt;Comment fonctionnent les critères de réussite et la CI ?&lt;/h2&gt;
&lt;p&gt;Vous définissez des critères d&amp;#39;échec sur des métriques client ou serveur, et l&amp;#39;exécution est marquée en échec dès que l&amp;#39;un d&amp;#39;eux est dépassé. Les pipelines d&amp;#39;Azure DevOps, de GitHub Actions ou de tout outil de CI capable d&amp;#39;appeler l&amp;#39;Azure CLI peuvent lancer un test et faire dépendre la suite de ce résultat.&lt;/p&gt;
&lt;p&gt;Selon le &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-define-test-criteria&quot;&gt;guide des critères d&amp;#39;échec&lt;/a&gt;, un critère est un agrégat d&amp;#39;une métrique client, comme le temps de réponse moyen ou le pourcentage d&amp;#39;erreurs, comparé à un seuil, soit pour tout le test, soit pour une requête nommée. Les métriques serveur exigent que l&amp;#39;identité managée de la ressource puisse les lire. L&amp;#39;arrêt automatique stoppe une exécution quand le taux d&amp;#39;erreur dépasse une limite, pour qu&amp;#39;une mauvaise URL ne continue pas à coûter. Le &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-configure-load-test-cicd&quot;&gt;guide CI/CD&lt;/a&gt; couvre GitHub Actions et Azure Pipelines (vérifié le 19 octobre 2026). Notre guide sur les &lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;critères de réussite d&amp;#39;un test de charge&lt;/a&gt; explique comment choisir les limites.&lt;/p&gt;
&lt;h2&gt;Combien coûte Azure Load Testing ?&lt;/h2&gt;
&lt;p&gt;Vous payez à l&amp;#39;heure d&amp;#39;utilisateur virtuel (VUH) : 0,15 $ par VUH pour les 10 000 premières, puis 0,06 $ par VUH, au même tarif dans toutes les régions de la page de tarifs. Depuis le 1er mars 2026, il existe aussi un minimum facturé par exécution.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://azure.microsoft.com/en-us/pricing/details/load-testing/&quot;&gt;page de tarifs&lt;/a&gt; définit une VUH comme le nombre d&amp;#39;utilisateurs virtuels multiplié par les minutes, divisé par 60, compté toutes les 10 secondes ; 1 000 utilisateurs pendant 30 minutes font 500 VUH, soit 75 $ au tarif du premier palier. Le minimum est de 10 utilisateurs virtuels par moteur pendant la durée de l&amp;#39;exécution, avec au moins 10 minutes. Une exécution de 3 heures avec 5 utilisateurs sur un moteur est donc facturée 30 VUH au lieu de 15 (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quand choisir autre chose ?&lt;/h2&gt;
&lt;p&gt;Choisissez une autre option quand vos scripts, votre cloud ou votre budget vous orientent ailleurs.&lt;/p&gt;
&lt;p&gt;Notre panorama des &lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;outils de test de charge open source&lt;/a&gt; présente les outils que vous pouvez faire tourner vous-même.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;LoadFocus&lt;/strong&gt;, qui publie ce site, si vous voulez exécuter des &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=azure-load-testing&quot;&gt;plans de test JMeter et des scripts k6&lt;/a&gt; depuis 25 régions cloud sans abonnement Azure. LoadFocus n&amp;#39;exécute pas Locust et fait tourner les scénarios k6 arrival-rate avec un nombre fixe d&amp;#39;utilisateurs.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;Grafana Cloud k6&lt;/strong&gt; ou le &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; si vos tests sont écrits pour k6, qu&amp;#39;Azure Load Testing ne sait pas exécuter (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;Locust auto-hébergé&lt;/strong&gt; si vous disposez déjà de Kubernetes ou de machines libres : son &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;mode distribué&lt;/a&gt; est gratuit, et vous ne payez que le matériel.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Azure Load Testing prend-il en charge k6 ?&lt;/strong&gt;
Non. Il exécute des tests Apache JMeter et Locust, ainsi que des tests rapides par URL qu&amp;#39;il transforme lui-même en script. Les scripts k6 demandent un autre service ou votre propre infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Puis-je utiliser Azure Load Testing pour une application qui n&amp;#39;est pas hébergée sur Azure ?&lt;/strong&gt;
Oui. Les moteurs de test peuvent viser n&amp;#39;importe quel endpoint public. Les métriques serveur ne sont collectées que pour les ressources Azure ; pour un autre hébergement, lisez les métriques serveur dans votre propre monitoring.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Existe-t-il une offre gratuite ?&lt;/strong&gt;
La page de tarifs n&amp;#39;indique pour le test de charge que des prix à l&amp;#39;heure, avec un minimum par exécution. Les nouveaux comptes Azure reçoivent un crédit de 200 $ pour leurs 30 premiers jours, d&amp;#39;après la même page.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-load-testing/&quot;&gt;Test de charge Locust : l&amp;#39;outil Python passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;Outils de test de charge open source : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;Critères de réussite d&amp;#39;un test de charge : comment les fixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-vs-jmeter/&quot;&gt;Locust vs JMeter : scripts Python ou plans de test JMeter ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-testing-in-github-actions/&quot;&gt;Test de charge dans GitHub Actions : guide pratique&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Latence de queue : définition et mesure sous charge</title><link>https://loadtest.app/fr/tail-latency/</link><guid isPermaLink="true">https://loadtest.app/fr/tail-latency/</guid><description>La latence de queue expliquée : pourquoi le 1 % de requêtes le plus lent compte, comment le fan-out l&apos;aggrave, ses causes et la mesure du p99 en test.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;La latence de queue est le temps de réponse des quelques requêtes les plus lentes, généralement exprimé par le 99e ou le 99,9e percentile. Elle compte parce qu&amp;#39;une action d&amp;#39;utilisateur attend souvent de nombreuses requêtes : un retard qui touche 1 requête sur 100 peut alors atteindre la plupart de vos utilisateurs. Un test de charge qui n&amp;#39;affiche que la moyenne ou la médiane ne la montre pas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Appels backend par page&lt;/th&gt;
&lt;th&gt;Part des pages qui subissent au moins un appel lent (1 sur 100)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1,0 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4,9 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;9,6 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;18,2 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;39,5 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;63,4 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Le tableau suppose que chaque appel est lent avec 1 % de probabilité, indépendamment des autres : la part vaut &lt;code&gt;1 - 0.99^n&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;appelle-t-on la queue ?&lt;/h2&gt;
&lt;p&gt;La queue est la partie de la distribution des temps de réponse située au-delà d&amp;#39;un percentile élevé, le plus souvent p99 et p99,9. La médiane décrit une requête typique, la queue décrit les requêtes dont les gens se plaignent.&lt;/p&gt;
&lt;p&gt;Un percentile est un seuil : p99 = 800 ms signifie que 99 % des requêtes ont pris 800 ms ou moins et 1 % plus longtemps. Sur un histogramme des temps de réponse, la queue se trouve à droite de ce seuil, souvent sous la forme d&amp;#39;une longue traîne fine loin du pic principal. Notre guide &lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;débit vs latence&lt;/a&gt; explique comment les outils de test de charge mesurent la latence et les percentiles.&lt;/p&gt;
&lt;h2&gt;Pourquoi la latence de queue compte-t-elle autant ?&lt;/h2&gt;
&lt;p&gt;Parce que les requêtes se multiplient. Une page ou un appel d&amp;#39;API qui se répartit sur de nombreux services ne se termine que lorsque le plus lent a répondu, et la queue de chaque service devient l&amp;#39;expérience habituelle de l&amp;#39;ensemble.&lt;/p&gt;
&lt;p&gt;La référence est « The Tail at Scale » de Jeffrey Dean et Luiz André Barroso, publié dans Communications of the ACM en 2013 (&lt;a href=&quot;https://www.barroso.org/publications/TheTailAtScale.pdf&quot;&gt;PDF de l&amp;#39;article&lt;/a&gt;, vérifié le 19 octobre 2026). Leur exemple : un serveur qui répond d&amp;#39;habitude en 10 ms mais met une seconde au 99e percentile. Si une requête touche un seul de ces serveurs, 1 requête d&amp;#39;utilisateur sur 100 est lente. Si elle doit rassembler les réponses de 100 serveurs en parallèle, 63 % des requêtes d&amp;#39;utilisateurs dépassent une seconde. Même avec un seul appel lent sur 10 000, un service de 2 000 serveurs voit près d&amp;#39;une requête sur cinq dépasser une seconde.&lt;/p&gt;
&lt;p&gt;Ils citent aussi des mesures d&amp;#39;un vrai service de Google : le 99e percentile d&amp;#39;une seule requête feuille était de 10 ms, mais il atteignait 140 ms pour que toutes les requêtes feuilles se terminent, et l&amp;#39;attente des 5 % les plus lentes en représentait la moitié.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui cause la latence de queue ?&lt;/h2&gt;
&lt;p&gt;Le plus souvent, des interférences dues à d&amp;#39;autres tâches sur la machine ou dans le réseau. La même requête est rapide la plupart du temps et lente quand il se passe autre chose.&lt;/p&gt;
&lt;p&gt;Dean et Barroso citent les suspects habituels :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ressources partagées :&lt;/strong&gt; d&amp;#39;autres tâches sur la même machine qui se disputent les cœurs CPU, les caches du processeur, la bande passante mémoire ou réseau.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Démons en arrière-plan&lt;/strong&gt; qui se réveillent et prennent une part de la machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tâches de maintenance&lt;/strong&gt; comme le compactage de journaux ou le garbage collection des environnements managés.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Files d&amp;#39;attente&lt;/strong&gt; dans les serveurs et les commutateurs réseau, qui amplifient toutes les autres sources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limites de puissance et de température&lt;/strong&gt; qui ralentissent un CPU après un pic de travail.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En test de charge, la même liste prend la forme de pauses GC dans des services JVM ou Node.js, d&amp;#39;un pool de connexions épuisé, d&amp;#39;une requête SQL lente que seules certaines requêtes déclenchent, de caches froids après un déploiement et de nouvelles tentatives après un timeout. Une queue qui grandit avec la charge indique des files d&amp;#39;attente ; une queue présente même à faible charge indique quelque chose de périodique, comme le GC ou une tâche planifiée.&lt;/p&gt;
&lt;h2&gt;Comment mesurer la latence de queue dans un test de charge ?&lt;/h2&gt;
&lt;p&gt;Collectez assez d&amp;#39;échantillons, demandez à votre outil les bons percentiles et ne faites jamais la moyenne de percentiles entre machines ou fenêtres de temps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assez d&amp;#39;échantillons.&lt;/strong&gt; Le p99 dépend du 1 % de requêtes le plus lent : une exécution de 500 requêtes le fait donc reposer sur 5 d&amp;#39;entre elles. Pour un p99 stable, il faut des milliers de requêtes par transaction, et des dizaines de milliers pour le p99,9. Les tests de fumée courts sont utiles pour repérer des erreurs et peu fiables pour juger la queue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les bons percentiles.&lt;/strong&gt; Les réglages par défaut s&amp;#39;arrêtent souvent avant la queue. Dans k6, &lt;code&gt;summaryTrendStats&lt;/code&gt; vaut par défaut &lt;code&gt;avg,min,med,max,p(90),p(95)&lt;/code&gt;, donc le p99 n&amp;#39;apparaît que si vous l&amp;#39;ajoutez (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/k6-options/reference/&quot;&gt;référence des options k6&lt;/a&gt;, vérifiée le 19 octobre 2026) :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;k6 run --summary-trend-stats=&amp;quot;med,p(95),p(99),p(99.9),max&amp;quot; \
  script.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;L&amp;#39;&lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Aggregate_Report&quot;&gt;Aggregate Report&lt;/a&gt; de JMeter affiche les lignes 90 %, 95 % et 99 %, et les propriétés &lt;code&gt;aggregate_rpt_pct1&lt;/code&gt; à &lt;code&gt;aggregate_rpt_pct3&lt;/code&gt; changent les percentiles affichés (vérifié le 19 octobre 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pas de moyenne de percentiles.&lt;/strong&gt; Le p99 d&amp;#39;une exécution entière n&amp;#39;est ni la moyenne des p99 de chaque minute ni celle des p99 de chaque générateur de charge. Fusionnez les échantillons bruts ou un histogramme, puis calculez le percentile une seule fois. L&amp;#39;article sur la &lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; présente HdrHistogram, l&amp;#39;outil habituel pour cela, et un second piège : un générateur qui attend les réponses lentes envoie moins de requêtes pendant que le système ralentit, ce qui masque justement la queue que vous cherchez.&lt;/p&gt;
&lt;p&gt;LoadFocus, qui publie ce site, affiche pour chaque exécution des tuiles P95 et P99, un &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tail-latency&quot;&gt;histogramme des temps de réponse&lt;/a&gt; construit à partir des échantillons individuels et les requêtes les plus lentes : une longue traîne à droite du pic se voit d&amp;#39;un coup d&amp;#39;œil.&lt;/p&gt;
&lt;h2&gt;Comment fixer une limite de réussite sur la queue ?&lt;/h2&gt;
&lt;p&gt;Placez une limite sur le p99 pour chaque transaction clé, à côté d&amp;#39;une limite de p95 et d&amp;#39;une limite de taux d&amp;#39;erreur. Fondez-la sur les besoins des utilisateurs de cette transaction, et faites durer l&amp;#39;exécution assez longtemps pour que le p99 soit stable.&lt;/p&gt;
&lt;p&gt;Un jeu raisonnable pour une API de paiement pourrait être : p95 sous 400 ms, p99 sous 1 200 ms, erreurs sous 0,5 %. Dans k6, ce sont des seuils sur &lt;code&gt;http_req_duration&lt;/code&gt; comme &lt;code&gt;p(99)&amp;lt;1200&lt;/code&gt;, et un seuil franchi fait sortir k6 avec un code différent de zéro (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;seuils k6&lt;/a&gt;, vérifié le 19 octobre 2026). LoadFocus propose un champ &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/pass-fail-thresholds?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tail-latency&quot;&gt;Max P99 response time&lt;/a&gt; à côté de Max P95 pour les tests cloud, JMeter et k6, et chaque exécution reçoit alors un PASS ou un FAIL. Notre guide sur les &lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;critères de réussite d&amp;#39;un test de charge&lt;/a&gt; couvre le reste du jeu.&lt;/p&gt;
&lt;p&gt;Si vous publiez aussi un &lt;a href=&quot;https://loadtest.app/fr/apdex-score/&quot;&gt;score Apdex&lt;/a&gt;, rappelez-vous qu&amp;#39;il range toute requête au-delà de quatre fois T dans une seule case et ne distingue donc pas une queue à 2 secondes d&amp;#39;une queue à 30 secondes. Le p99, si.&lt;/p&gt;
&lt;h2&gt;Comment réduire la latence de queue ?&lt;/h2&gt;
&lt;p&gt;Supprimez les sources de variabilité quand c&amp;#39;est possible, et concevez les appelants pour qu&amp;#39;un appel lent ne bloque pas toute la réponse.&lt;/p&gt;
&lt;p&gt;Les correctifs courants, à peu près du moins coûteux au plus lourd :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Régler le GC et la taille des pools&lt;/strong&gt; pour que les pauses et l&amp;#39;attente d&amp;#39;une connexion libre restent courtes sous charge.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Garder de la marge.&lt;/strong&gt; Les files d&amp;#39;attente explosent près de la saturation, donc de la capacité libre raccourcit la queue ; le guide &lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;débit vs latence&lt;/a&gt; montre comment trouver le coude.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixer des timeouts et limiter les nouvelles tentatives&lt;/strong&gt; pour qu&amp;#39;un appel bloqué échoue vite au lieu d&amp;#39;accumuler la file derrière lui.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Utiliser des requêtes couvertes (hedged requests)&lt;/strong&gt; pour les lectures idempotentes : envoyer une seconde copie à un autre réplica si le premier n&amp;#39;a pas répondu à temps. Dean et Barroso décrivent l&amp;#39;envoi de la copie seulement après la latence attendue du 95e percentile, ce qui limite la charge supplémentaire à environ 5 %. Dans un de leurs tests, une copie envoyée après 10 ms a fait passer le 99,9e percentile de 1 800 ms à 74 ms, avec seulement 2 % de requêtes en plus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Réduire le fan-out.&lt;/strong&gt; Moins d&amp;#39;appels backend par page signifie moins de risques de tomber dans la queue, comme le montre le tableau du début.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Après chaque changement, relancez le même test avec le même profil de charge et comparez p99 et p99,9 d&amp;#39;une exécution à l&amp;#39;autre.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;La latence de queue est-elle la même chose que le p99 ?&lt;/strong&gt;
Le p99 est la façon la plus courante de l&amp;#39;exprimer, et la queue désigne toute l&amp;#39;extrémité lente de la distribution. Suivez aussi le p99,9 et le maximum quand l&amp;#39;exécution compte assez de requêtes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pourquoi mon p99 est-il tellement plus élevé que ma moyenne ?&lt;/strong&gt;
Parce que quelques requêtes lentes bougent à peine la moyenne et définissent entièrement le p99. Un grand écart est normal ; un écart qui grandit avec la charge signale en général des files d&amp;#39;attente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combien de requêtes faut-il pour mesurer le p99 ?&lt;/strong&gt;
Au minimum quelques milliers par transaction, pour que le p99 repose sur des dizaines de requêtes lentes. Pour le p99,9, prévoyez des dizaines de milliers.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;Coordinated omission : ce que c&amp;#39;est et comment l&amp;#39;éviter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/apdex-score/&quot;&gt;Score Apdex : définition et méthode de calcul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;Critères de réussite d&amp;#39;un test de charge : comment les fixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;Loi de Little en test de charge : dimensionner et vérifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/ycsb/&quot;&gt;YCSB : charges de travail A-F, exécution et limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/slo-vs-sla/&quot;&gt;SLO vs SLA : la différence, les SLI et le budget d&amp;#39;erreur&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Test de charge gRPC : outils, mise en place et mesures</title><link>https://loadtest.app/fr/grpc-load-testing/</link><guid isPermaLink="true">https://loadtest.app/fr/grpc-load-testing/</guid><description>Le test de charge gRPC expliqué : quels outils parlent gRPC nativement, comment écrire un test k6 ou ghz, et pourquoi un échec revient en HTTP 200.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;Un test de charge gRPC demande un outil qui parle HTTP/2 et Protocol Buffers : k6 et ghz le font d&amp;#39;origine, JMeter a besoin d&amp;#39;un plugin, la prise en charge de gRPC dans Gatling est limitée dans son édition gratuite, et avec Locust vous devez intégrer vous-même un client gRPC. Comptez les résultats par statut gRPC, pas par statut HTTP, car les appels en échec arrivent quand même en HTTP 200, et vérifiez que la charge atteint chaque backend.&lt;/p&gt;
&lt;p&gt;Aucun test gRPC n&amp;#39;a été exécuté pour cet article. Les faits sur les outils viennent de la documentation et des dépôts de chaque projet, vérifiés le 16 octobre 2026 ; les faits sur LoadFocus viennent de son code.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Prise en charge de gRPC&lt;/th&gt;
&lt;th&gt;Lit l&amp;#39;API depuis&lt;/th&gt;
&lt;th&gt;Contrôle de la cadence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;Intégré (&lt;code&gt;k6/net/grpc&lt;/code&gt;), appels unaires et streams&lt;/td&gt;
&lt;td&gt;Fichiers &lt;code&gt;.proto&lt;/code&gt; ou réflexion serveur&lt;/td&gt;
&lt;td&gt;Exécuteurs arrival-rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ghz&lt;/td&gt;
&lt;td&gt;Outil en ligne de commande dédié à gRPC&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.proto&lt;/code&gt;, protoset ou réflexion serveur&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--rps&lt;/code&gt; et plannings de charge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Plugin tiers (jmeter-grpc-request)&lt;/td&gt;
&lt;td&gt;Un dossier de fichiers &lt;code&gt;.proto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Thread Groups et timers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Composant gRPC séparé ; édition gratuite limitée à 5 utilisateurs, 5 minutes&lt;/td&gt;
&lt;td&gt;Code généré depuis les &lt;code&gt;.proto&lt;/code&gt; avec protoc&lt;/td&gt;
&lt;td&gt;Profils d&amp;#39;injection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Pas de client intégré ; en envelopper un et remonter les appels&lt;/td&gt;
&lt;td&gt;Votre client gRPC Python&lt;/td&gt;
&lt;td&gt;Temps d&amp;#39;attente, &lt;code&gt;constant_throughput&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Pourquoi gRPC demande-t-il un autre test de charge que REST ?&lt;/h2&gt;
&lt;p&gt;gRPC passe par HTTP/2, envoie des Protocol Buffers binaires au lieu de JSON, place le résultat d&amp;#39;un appel dans un trailer plutôt que dans le statut HTTP, et multiplexe de nombreux appels sur une seule connexion. Chacun de ces points change la façon d&amp;#39;écrire le test ou d&amp;#39;en lire les résultats.&lt;/p&gt;
&lt;p&gt;L&amp;#39;&lt;a href=&quot;https://grpc.io/blog/grpc-load-balancing/&quot;&gt;article sur la répartition de charge gRPC&lt;/a&gt; énumère les caractéristiques de HTTP/2 qui comptent ici : un protocole binaire, de nombreuses requêtes multiplexées sur une connexion et la compression des en-têtes, avec par-dessus des messages Protobuf fortement typés (vérifié le 16 octobre 2026). Un outil qui n&amp;#39;envoie que du JSON sur HTTP/1.1 ne peut pas appeler une méthode gRPC : vérifiez d&amp;#39;abord la prise en charge du protocole.&lt;/p&gt;
&lt;h2&gt;Quel outil choisir ?&lt;/h2&gt;
&lt;p&gt;Prenez k6 si vous voulez des scénarios, des checks et des seuils écrits en code ; prenez ghz pour un benchmark rapide d&amp;#39;une méthode en ligne de commande. Tournez-vous vers JMeter, Gatling ou Locust quand votre équipe y fait déjà tout le reste.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;k6.&lt;/strong&gt; Le &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/&quot;&gt;module k6/net/grpc&lt;/a&gt; charge les définitions Protobuf, se connecte, fait des appels unaires avec &lt;code&gt;invoke&lt;/code&gt; et ouvre des streams. Il rapporte &lt;code&gt;grpc_req_duration&lt;/code&gt; et le nombre de messages des streams dans ses &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;métriques&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ghz.&lt;/strong&gt; Un outil de benchmark en ligne de commande réservé à gRPC. Ses &lt;a href=&quot;https://ghz.sh/docs/options&quot;&gt;options&lt;/a&gt; incluent &lt;code&gt;--rps&lt;/code&gt;, &lt;code&gt;--concurrency&lt;/code&gt;, &lt;code&gt;--total&lt;/code&gt; et &lt;code&gt;--duration&lt;/code&gt;, et si vous ne passez ni &lt;code&gt;--proto&lt;/code&gt; ni &lt;code&gt;--protoset&lt;/code&gt;, il tente la réflexion serveur. La dernière &lt;a href=&quot;https://github.com/bojand/ghz/releases&quot;&gt;version&lt;/a&gt; est v0.121.0 (vérifié le 16 octobre 2026).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Le cœur de JMeter n&amp;#39;a pas de sampler gRPC ; le &lt;a href=&quot;https://github.com/zalopay-oss/jmeter-grpc-request&quot;&gt;plugin jmeter-grpc-request&lt;/a&gt; en ajoute un qui lit un dossier de fichiers &lt;code&gt;.proto&lt;/code&gt;, sans génération de code (dernier tag v1.2.6, vérifié le 16 octobre 2026).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; Le &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README de Gatling&lt;/a&gt; place gRPC, MQTT et GraphQL sous la Gatling Enterprise Component License, limités en Community Edition à 5 utilisateurs simultanés et à des tests de 5 minutes (vérifié le 16 octobre 2026). Son &lt;a href=&quot;https://docs.gatling.io/reference/script/grpc/setup/&quot;&gt;guide de mise en place gRPC&lt;/a&gt; génère du code à partir de vos fichiers &lt;code&gt;.proto&lt;/code&gt; avec protoc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Locust.&lt;/strong&gt; Sa documentation sur le &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;test d&amp;#39;autres systèmes&lt;/a&gt; inclut un exemple gRPC : vous enveloppez un client gRPC pour que chaque appel soit remonté à Locust, et &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;constant_throughput&lt;/code&gt;&lt;/a&gt; cadence une tâche à un nombre maximal d&amp;#39;exécutions par seconde.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Choisissez ghz plutôt que k6 quand vous voulez seulement savoir comment une méthode se comporte à une cadence donnée, sans écrire de script. Choisissez plutôt Locust quand votre équipe écrit en Python et que le test demande une logique plus simple à y écrire.&lt;/p&gt;
&lt;h2&gt;Comment écrire un test de charge gRPC avec k6 ?&lt;/h2&gt;
&lt;p&gt;Chargez le fichier &lt;code&gt;.proto&lt;/code&gt; dans le code d&amp;#39;initialisation, puis, à chaque itération, connectez-vous, appelez la méthode et vérifiez le statut gRPC. La structure suit l&amp;#39;exemple de la documentation de k6.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check } from &amp;#39;k6&amp;#39;;

const client = new grpc.Client();
client.load([&amp;#39;protos&amp;#39;], &amp;#39;hello.proto&amp;#39;);

export const options = { vus: 20, duration: &amp;#39;1m&amp;#39; };

export default () =&amp;gt; {
  client.connect(&amp;#39;grpc.example.com:443&amp;#39;);
  const res = client.invoke(&amp;#39;hello.Greeter/SayHello&amp;#39;, {
    name: &amp;#39;load test&amp;#39;,
  });
  check(res, {
    &amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK,
  });
  client.close();
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/client/client-invoke/&quot;&gt;page de &lt;code&gt;invoke&lt;/code&gt;&lt;/a&gt; suit la même séquence : chargement, connexion, appel, vérification et fermeture. &lt;code&gt;connect&lt;/code&gt; utilise TLS sauf si vous passez &lt;code&gt;plaintext: true&lt;/code&gt;, et avec &lt;code&gt;reflect: true&lt;/code&gt; il demande son API au serveur au lieu de lire un fichier &lt;code&gt;.proto&lt;/code&gt; (&lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/client/client-connect/&quot;&gt;paramètres de connexion&lt;/a&gt;). Pour tenir une cadence de requêtes plutôt qu&amp;#39;un nombre d&amp;#39;utilisateurs, exécutez la fonction dans un scénario arrival-rate.&lt;/p&gt;
&lt;h2&gt;Comment faire un benchmark rapide avec ghz ?&lt;/h2&gt;
&lt;p&gt;Indiquez à ghz la méthode, un corps de requête et une cadence ou un niveau de concurrence, et il affiche un histogramme de latence, des percentiles et un décompte par code de statut. Il convient pour un premier aperçu d&amp;#39;une méthode.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ghz --insecure --proto ./hello.proto \
  --call hello.Greeter.SayHello \
  -d &amp;#39;{&amp;quot;name&amp;quot;:&amp;quot;load test&amp;quot;}&amp;#39; \
  --rps 200 -c 50 -z 1m \
  localhost:50051
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;--rps&lt;/code&gt; fixe la cadence visée, répartie entre les workers, &lt;code&gt;-c&lt;/code&gt; le nombre de workers, et &lt;code&gt;-z&lt;/code&gt; la durée. Retirez &lt;code&gt;--proto&lt;/code&gt; pour laisser ghz utiliser la réflexion serveur, si le serveur l&amp;#39;active. La &lt;a href=&quot;https://ghz.sh/docs/output&quot;&gt;page sur la sortie de ghz&lt;/a&gt; montre un exemple de rapport.&lt;/p&gt;
&lt;h2&gt;Que mesurer dans un test de charge gRPC ?&lt;/h2&gt;
&lt;p&gt;Mesurez les percentiles de latence des appels, le débit et le nombre de chaque code de statut gRPC. Un taux de réussite au niveau HTTP peut afficher 100 % alors que des appels échouent, car le résultat voyage dans le trailer &lt;code&gt;grpc-status&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://raw.githubusercontent.com/grpc/grpc/master/doc/PROTOCOL-HTTP2.md&quot;&gt;spécification gRPC sur HTTP/2&lt;/a&gt; fixe le statut HTTP à &lt;code&gt;:status 200&lt;/code&gt; et transporte le résultat de l&amp;#39;appel dans des trailers, sous la forme &lt;code&gt;grpc-status&lt;/code&gt; et &lt;code&gt;grpc-message&lt;/code&gt;. La &lt;a href=&quot;https://grpc.github.io/grpc/core/md_doc_statuscodes.html&quot;&gt;liste des codes de statut&lt;/a&gt; contient ceux qui comptent le plus sous charge :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DEADLINE_EXCEEDED&lt;/code&gt; (4) : l&amp;#39;échéance a expiré avant la fin de l&amp;#39;appel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RESOURCE_EXHAUSTED&lt;/code&gt; (8) : un quota ou une ressource est épuisé.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INTERNAL&lt;/code&gt; (13) : un invariant interne est rompu, un code réservé aux erreurs graves.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UNAVAILABLE&lt;/code&gt; (14) : en général passager ; réessayer avec un backoff peut suffire, mais pas toujours sans risque pour les appels non idempotents.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comptez chacun par palier de charge. Les erreurs d&amp;#39;échéance peuvent grimper alors que les appels réussis semblent encore rapides, parce que les appels lents sont coupés à l&amp;#39;échéance au lieu d&amp;#39;être enregistrés comme lents. Notre guide des &lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;critères de réussite d&amp;#39;un test de charge&lt;/a&gt; montre comment transformer ces décomptes en seuils.&lt;/p&gt;
&lt;h2&gt;Pourquoi toute la charge tombe-t-elle sur un seul serveur ?&lt;/h2&gt;
&lt;p&gt;Parce que gRPC multiplexe de nombreux appels sur une connexion de longue durée, un répartiteur qui travaille par connexion envoie chaque appel de celle-ci au même backend. Un générateur de charge avec peu de connexions peut alors saturer un serveur pendant que les autres restent inactifs.&lt;/p&gt;
&lt;p&gt;L&amp;#39;article sur la répartition de charge gRPC explique le mécanisme. Un répartiteur au niveau transport (L3/L4) termine la connexion TCP et en ouvre une autre vers un backend choisi, en copiant les trames HTTP/2 et gRPC entre les deux ; un répartiteur au niveau applicatif (L7) analyse HTTP/2 et peut répartir les streams d&amp;#39;une même connexion cliente entre plusieurs backends. Si vos clients de production passent par un répartiteur L7 ou répartissent côté client, testez par le même chemin et surveillez le CPU et le nombre de requêtes de chaque backend pendant l&amp;#39;exécution.&lt;/p&gt;
&lt;h2&gt;Peut-on lancer des tests de charge gRPC sur LoadFocus ?&lt;/h2&gt;
&lt;p&gt;Pas d&amp;#39;une façon que ses rapports montreraient. LoadFocus exécute la version standard de k6 v0.57.0, qui inclut le module gRPC, mais son agent k6 ne transmet aux résultats que les mesures des requêtes HTTP : les appels gRPC généreraient de la charge sans apparaître dans ses graphiques ni dans ses décomptes d&amp;#39;erreurs.&lt;/p&gt;
&lt;p&gt;Deux autres limites s&amp;#39;ajoutent. L&amp;#39;import de fichiers k6 accepte les fichiers &lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.ts&lt;/code&gt;, &lt;code&gt;.csv&lt;/code&gt;, &lt;code&gt;.txt&lt;/code&gt;, &lt;code&gt;.json&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt; et &lt;code&gt;.properties&lt;/code&gt;, pas les fichiers &lt;code&gt;.proto&lt;/code&gt;, donc un script devrait se connecter avec &lt;code&gt;reflect: true&lt;/code&gt;. Et la voie JMeter est fermée : les agents JMeter de LoadFocus embarquent JMeter 5.6.2 avec des plugins préinstallés qui ne comprennent pas de sampler gRPC, et l&amp;#39;import JMeter n&amp;#39;accepte pas de fichiers JAR de plugin. Pour gRPC, lancez k6 ou ghz sur vos propres machines, et utilisez les &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=grpc-load-testing&quot;&gt;scripts k6&lt;/a&gt; sur LoadFocus pour la partie HTTP du même système, où il génère la charge depuis 25 régions.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Peut-on tester en charge des appels gRPC en streaming ?&lt;/strong&gt;
Oui, avec k6 et ghz. Le module gRPC de k6 a une classe &lt;code&gt;Stream&lt;/code&gt; avec &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;end&lt;/code&gt; et des gestionnaires d&amp;#39;événements, et ghz a des options pour les intervalles et les durées de streaming. Mesurez les messages envoyés et reçus en plus de la latence des appels.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faut-il le fichier .proto pour tester en charge un service gRPC ?&lt;/strong&gt;
Pas si le serveur active la réflexion. k6 peut se connecter avec &lt;code&gt;reflect: true&lt;/code&gt;, et ghz se rabat sur la réflexion quand vous ne passez ni &lt;code&gt;--proto&lt;/code&gt; ni &lt;code&gt;--protoset&lt;/code&gt;. Sans réflexion, il vous faut le fichier &lt;code&gt;.proto&lt;/code&gt; ou un protoset compilé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pourquoi mes erreurs gRPC n&amp;#39;apparaissent-elles pas comme des requêtes en échec ?&lt;/strong&gt;
Parce que le statut HTTP d&amp;#39;un appel gRPC vaut 200 même quand l&amp;#39;appel échoue. Le résultat se trouve dans le trailer &lt;code&gt;grpc-status&lt;/code&gt; : vérifiez cette valeur dans votre script et comptez chaque code séparément.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/websocket-load-testing-tools/&quot;&gt;Outils de test de charge WebSocket : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/how-to-load-test-a-graphql-api/&quot;&gt;Test de charge d&amp;#39;une API GraphQL : guide pratique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-k6/&quot;&gt;Gatling vs k6 : simulations JVM ou un seul binaire Go ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/http-benchmarking-tools/&quot;&gt;Outils de benchmark HTTP : wrk, hey, oha, ab et autres&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Débit vs latence : comment ils interagissent sous charge</title><link>https://loadtest.app/fr/throughput-vs-latency/</link><guid isPermaLink="true">https://loadtest.app/fr/throughput-vs-latency/</guid><description>Débit vs latence : ce que mesure chacun, pourquoi la Latency de JMeter n&apos;est pas le temps de réponse, et pourquoi la latence grimpe si le débit plafonne.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;Le débit (throughput) est la quantité de travail qu&amp;#39;un système termine par unité de temps, par exemple des requêtes par seconde. La latence est le temps que prend une unité de travail, par exemple 120 millisecondes pour une requête. Sous une charge légère, les deux s&amp;#39;influencent à peine ; quand la charge approche la capacité du système, le débit cesse de monter et la latence se met à grimper, et trouver ce point est précisément le rôle d&amp;#39;un test de charge.&lt;/p&gt;
&lt;p&gt;L&amp;#39;exemple chiffré ci-dessous est un simple calcul, sans test derrière. Les définitions des outils viennent de la documentation de chaque projet, vérifiée le 16 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Débit&lt;/th&gt;
&lt;th&gt;Latence&lt;/th&gt;
&lt;th&gt;Bande passante&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Question posée&lt;/td&gt;
&lt;td&gt;Combien se termine par seconde ?&lt;/td&gt;
&lt;td&gt;Combien de temps prend une unité ?&lt;/td&gt;
&lt;td&gt;Combien la liaison pourrait-elle porter ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unité habituelle&lt;/td&gt;
&lt;td&gt;requêtes ou transactions par seconde&lt;/td&gt;
&lt;td&gt;millisecondes&lt;/td&gt;
&lt;td&gt;mégabits par seconde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dans k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http_reqs&lt;/code&gt; (nombre et taux)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http_req_duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pas une cible de test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dans JMeter&lt;/td&gt;
&lt;td&gt;Throughput&lt;/td&gt;
&lt;td&gt;Elapsed time (et une « Latency » distincte)&lt;/td&gt;
&lt;td&gt;pas une cible de test&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelle est la différence entre débit et latence ?&lt;/h2&gt;
&lt;p&gt;Le débit compte le travail terminé dans le temps ; la latence mesure le temps que prend une unité de travail. Un système peut avoir une faible latence et un faible débit, ou un débit élevé et une latence élevée : il faut donc les deux chiffres pour le décrire.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/glossary.html&quot;&gt;glossaire de JMeter&lt;/a&gt; calcule le débit comme le nombre de requêtes divisé par le temps total, du début du premier échantillon à la fin du dernier, pauses entre échantillons comprises, puisqu&amp;#39;il doit représenter la charge sur le serveur (vérifié le 16 octobre 2026). Le débit est donc une propriété de toute l&amp;#39;exécution, alors que la latence appartient à chaque requête et se lit mieux comme une distribution : médiane, p95, p99.&lt;/p&gt;
&lt;h2&gt;La bande passante est-elle la même chose que le débit ?&lt;/h2&gt;
&lt;p&gt;Non. La bande passante est la quantité maximale de données qu&amp;#39;une liaison réseau pourrait porter ; le débit est ce qui passe réellement. En test de charge, le débit désigne en général des requêtes terminées, et la bande passante ne compte que lorsque de gros volumes de données remplissent la liaison avant que l&amp;#39;application n&amp;#39;atteigne sa capacité.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://aws.amazon.com/compare/the-difference-between-throughput-and-latency/&quot;&gt;page de comparaison d&amp;#39;AWS&lt;/a&gt; résume la vision réseau : la latence est le délai dans la communication réseau, le débit le volume moyen de données qui passe réellement sur une période, et la bande passante le maximum théorique (vérifié le 16 octobre 2026). Une grande partie de ce que l&amp;#39;on trouve en ligne emploie ce sens réseau. Le test de charge utilise les mêmes mots pour des requêtes plutôt que pour des paquets, d&amp;#39;où l&amp;#39;intérêt de préciser lequel un rapport désigne.&lt;/p&gt;
&lt;h2&gt;Que signifie « latence » dans un outil de test de charge ?&lt;/h2&gt;
&lt;p&gt;Cela dépend de l&amp;#39;outil. Dans JMeter, Latency est le temps jusqu&amp;#39;à la première partie de la réponse, et le temps de réponse complet s&amp;#39;appelle Elapsed time. Dans k6, &lt;code&gt;http_req_duration&lt;/code&gt; couvre l&amp;#39;envoi, l&amp;#39;attente et la réception, et le temps jusqu&amp;#39;au premier octet est une métrique à part.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/glossary.html&quot;&gt;glossaire de JMeter&lt;/a&gt; mesure l&amp;#39;Elapsed time de juste avant l&amp;#39;envoi de la requête à juste après la réception de la dernière réponse, et la Latency jusqu&amp;#39;à juste après la réception de la première. La &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;référence des métriques de k6&lt;/a&gt; définit &lt;code&gt;http_req_duration&lt;/code&gt; comme &lt;code&gt;http_req_sending + http_req_waiting + http_req_receiving&lt;/code&gt;, sans résolution DNS ni établissement de connexion, et appelle &lt;code&gt;http_req_waiting&lt;/code&gt; le temps jusqu&amp;#39;au premier octet (les deux vérifiés le 16 octobre 2026). La Latency de JMeter correspond donc à &lt;code&gt;http_req_waiting&lt;/code&gt; dans k6, pas à &lt;code&gt;http_req_duration&lt;/code&gt;. Comparez une « latence » JMeter à une « duration » k6 et le chiffre de JMeter paraîtra meilleur sans l&amp;#39;être.&lt;/p&gt;
&lt;h2&gt;Comment le débit et la latence évoluent-ils quand la charge augmente ?&lt;/h2&gt;
&lt;p&gt;Au début, plus de charge signifie plus de débit, et la latence reste à peu près stable. Une fois le système à sa capacité, le débit ne progresse plus et chaque utilisateur supplémentaire n&amp;#39;ajoute que de l&amp;#39;attente : la latence monte avec la charge.&lt;/p&gt;
&lt;p&gt;Un exemple chiffré, simple calcul. Un service traite au plus 200 requêtes par seconde et répond en 0,1 seconde quand il n&amp;#39;est pas chargé. Chaque utilisateur virtuel envoie une requête puis fait une pause de 1 seconde. Avec un nombre fixe d&amp;#39;utilisateurs, la forme de la loi de Little pour le modèle fermé relie les grandeurs : utilisateurs = requêtes par seconde × (latence + temps de réflexion), comme le montre pas à pas notre &lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;article sur la loi de Little&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Utilisateurs virtuels&lt;/th&gt;
&lt;th&gt;Débit (requêtes/s)&lt;/th&gt;
&lt;th&gt;Latence (s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;0,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;136&lt;/td&gt;
&lt;td&gt;0,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;220&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;0,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;0,5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;1,0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;2,0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Jusqu&amp;#39;à 220 utilisateurs, le débit progresse au même rythme qu&amp;#39;eux. Ensuite il reste bloqué à 200, et la latence doit absorber le reste : 300 utilisateurs demandent 300 ÷ 200 = 1,5 seconde par boucle, ce qui laisse 0,5 seconde de latence. Les systèmes réels fléchissent en général plus progressivement, car des files d&amp;#39;attente se forment avant le plafond exact. Avec un test à taux d&amp;#39;arrivée, la situation est pire : si les requêtes arrivent à plus de 200 par seconde, l&amp;#39;arriéré grossit tant que dure l&amp;#39;excédent, ce que l&amp;#39;article sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique.&lt;/p&gt;
&lt;h2&gt;Comment repérer le coude dans vos propres résultats ?&lt;/h2&gt;
&lt;p&gt;Augmentez la charge par paliers, maintenez chaque palier assez longtemps pour qu&amp;#39;il se stabilise, et notez le débit et un percentile de latence pour chacun. Le coude est le premier palier où le débit ne suit plus la charge alors que la latence commence à grimper.&lt;/p&gt;
&lt;p&gt;Quelques précautions rendent cette lecture fiable :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maintenez chaque palier quelques minutes, pour mesurer le débit sur une phase stable et non sur une rampe.&lt;/li&gt;
&lt;li&gt;Lisez un percentile, pas seulement la moyenne ; une moyenne peut rester calme pendant que les quelques pour cent de requêtes les plus lentes ralentissent nettement.&lt;/li&gt;
&lt;li&gt;Vérifiez les erreurs à chaque palier. Les échecs rapides comptent comme des requêtes terminées avec des temps courts, si bien qu&amp;#39;un système défaillant peut afficher un débit en hausse et une latence en baisse.&lt;/li&gt;
&lt;li&gt;Surveillez le générateur de charge. Si son CPU sature, le plafond trouvé est peut-être le sien.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/response-time-vs-virtual-users?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=throughput-vs-latency&quot;&gt;graphique temps de réponse face aux utilisateurs virtuels&lt;/a&gt; de LoadFocus trace le temps de réponse moyen et maximal en fonction des utilisateurs virtuels actifs, un point par palier atteint, et c&amp;#39;est là que le coude apparaît dans un test par paliers.&lt;/p&gt;
&lt;h2&gt;Peut-on augmenter le débit sans augmenter la latence ?&lt;/h2&gt;
&lt;p&gt;Parfois. Ajouter de la capacité déplace le plafond, si bien que la latence reste plate plus longtemps. Le regroupement (batching) fait en général le compromis inverse : il augmente le débit en faisant attendre chaque requête.&lt;/p&gt;
&lt;p&gt;L&amp;#39;algorithme de Nagle de TCP est l&amp;#39;exemple classique de ce compromis. La &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc896.html&quot;&gt;RFC 896&lt;/a&gt; retient les nouveaux segments tant que des données déjà envoyées sur la connexion ne sont pas acquittées, de sorte que le réseau transporte moins de paquets, plus pleins, et que chaque petite écriture peut attendre (vérifié le 16 octobre 2026). Le regroupement de requêtes et la mise en tampon des écritures fonctionnent de la même façon : plus de travail par seconde, plus de temps par élément. Quand vous modifiez l&amp;#39;un d&amp;#39;eux, relancez le test par paliers et comparez les deux courbes, pas un seul chiffre.&lt;/p&gt;
&lt;h2&gt;Lequel des deux mettre dans vos critères de réussite ?&lt;/h2&gt;
&lt;p&gt;Les deux, liés. Un objectif de latence veut peu dire sans le débit auquel il a été mesuré, et un objectif de débit veut peu dire si la latence a doublé pour l&amp;#39;atteindre. Formulez-les comme une paire, par exemple p95 sous 300 millisecondes à 200 requêtes par seconde avec moins de 1 % d&amp;#39;erreurs.&lt;/p&gt;
&lt;p&gt;Notre guide des &lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;critères de réussite d&amp;#39;un test de charge&lt;/a&gt; montre comment écrire et automatiser cette paire. Si votre outil attend les réponses lentes avant d&amp;#39;envoyer la requête suivante, ses chiffres de latence peuvent minimiser le problème ; la &lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; explique comment cela arrive et comment l&amp;#39;éviter. L&amp;#39;&lt;a href=&quot;https://loadfocus.com/fr-fr/glossary/what-is-latency?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=throughput-vs-latency&quot;&gt;entrée du glossaire LoadFocus sur la latence&lt;/a&gt; détaille d&amp;#39;où vient la latence et pourquoi les percentiles comptent.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Une faible latence signifie-t-elle un débit élevé ?&lt;/strong&gt;
Pas forcément. Un système peut répondre vite à chaque requête mais en traiter peu à la fois, ou en traiter beaucoup à la fois pendant que chacune attend. Vous ne connaissez les deux qu&amp;#39;après les avoir mesurés sous la même charge, idéalement sur plusieurs paliers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre latence et temps de réponse ?&lt;/strong&gt;
Dans l&amp;#39;usage courant, ils désignent souvent la même chose. Dans JMeter, Latency est le temps jusqu&amp;#39;à la première partie de la réponse et Elapsed time le temps de réponse complet : vérifiez lequel un rapport affiche avant de comparer des outils.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pourquoi le débit cesse-t-il d&amp;#39;augmenter pendant un test de charge ?&lt;/strong&gt;
Quelque chose a atteint sa limite : le CPU, une base de données, un pool de connexions, une limitation de requêtes (rate limit) ou le générateur de charge lui-même. À partir de là, les utilisateurs supplémentaires ne font que patienter, ce qui se voit comme une latence en hausse à débit constant.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;Loi de Little en test de charge : dimensionner et vérifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;Coordinated omission : ce que c&amp;#39;est et comment l&amp;#39;éviter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;Critères de réussite d&amp;#39;un test de charge : comment les fixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/apdex-score/&quot;&gt;Score Apdex : définition et méthode de calcul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/amdahls-law/&quot;&gt;Loi d&amp;#39;Amdahl : formule, exemples et limites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs Locust : simulations JVM ou locustfiles Python ?</title><link>https://loadtest.app/fr/gatling-vs-locust/</link><guid isPermaLink="true">https://loadtest.app/fr/gatling-vs-locust/</guid><description>Gatling vs Locust comparés : licence, exécution, modèle de charge, montée en charge, critères de réussite et rapports, avec conseils de choix.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Gatling et Locust sont deux outils open source gratuits qui gardent les tests de charge sous forme de code dans votre dépôt. Choisissez Gatling si votre équipe travaille sur la JVM ou si vous voulez des profils d&amp;#39;injection ouverts et fermés, des assertions et un rapport HTML dans un seul paquet. Choisissez Locust si votre équipe écrit du Python, apprécie une interface web pour lancer et suivre une exécution, et a besoin du mode distribué sans édition commerciale.&lt;/p&gt;
&lt;p&gt;Les informations de ce comparatif Gatling vs Locust viennent de la documentation et du dépôt de chaque projet, vérifiées le 13 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;Apache 2.0 ; gRPC, MQTT et GraphQL sous une licence de composant distincte (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exécution&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS 11 à 25 (version 3.16.0)&lt;/td&gt;
&lt;td&gt;Python 3.11 ou plus récent (version 2.46.7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code de test&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript ou TypeScript&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocoles intégrés&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events, JMS&lt;/td&gt;
&lt;td&gt;HTTP et HTTPS ; les autres via un client Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modèle de charge&lt;/td&gt;
&lt;td&gt;Profils d&amp;#39;injection ouverts ou fermés&lt;/td&gt;
&lt;td&gt;Un pool d&amp;#39;utilisateurs, donc un modèle fermé&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critères de réussite&lt;/td&gt;
&lt;td&gt;Assertions, évaluées après l&amp;#39;exécution&lt;/td&gt;
&lt;td&gt;Code de sortie 1 si des requêtes échouent, ou votre propre listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rapports&lt;/td&gt;
&lt;td&gt;Rapport HTML après chaque exécution&lt;/td&gt;
&lt;td&gt;Graphiques en direct dans l&amp;#39;interface web, fichiers CSV, rapport HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Montée en charge&lt;/td&gt;
&lt;td&gt;Gatling Enterprise&lt;/td&gt;
&lt;td&gt;Mode master et workers intégré, opérateur Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelle est la différence entre Gatling et Locust ?&lt;/h2&gt;
&lt;p&gt;Gatling exécute des simulations sur la JVM, et Locust exécute de simples programmes Python. Gatling fournit d&amp;#39;emblée un modèle de charge et un rapport, tandis qu&amp;#39;avec Locust vous écrivez vous-même la logique du test.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; de Gatling décrit un moteur non bloquant construit sur Netty et un SDK en cinq langages : Java, Kotlin et Scala passent par Maven, Gradle ou sbt, JavaScript et TypeScript par un SDK à part. Sa &lt;a href=&quot;https://docs.gatling.io/reference/deploy/install-local/&quot;&gt;page d&amp;#39;installation&lt;/a&gt; demande un OpenJDK LTS 64 bits de 11 à 25, et Node.js 24 ou plus récent pour le SDK JavaScript.&lt;/p&gt;
&lt;p&gt;Le README de Locust le présente comme un moyen d&amp;#39;écrire des tests de charge évolutifs en Python pur, et ses &lt;a href=&quot;https://raw.githubusercontent.com/locustio/locust/master/pyproject.toml&quot;&gt;métadonnées de paquet&lt;/a&gt; exigent Python 3.11 ou plus récent. La page &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; précise qu&amp;#39;il repose sur des événements avec gevent, si bien qu&amp;#39;un seul processus peut gérer plusieurs milliers d&amp;#39;utilisateurs simultanés (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment écrire le même test dans chaque outil ?&lt;/h2&gt;
&lt;p&gt;Dans Gatling, vous enchaînez des requêtes dans un scénario et lui donnez un profil d&amp;#39;injection. Dans Locust, vous écrivez une classe d&amp;#39;utilisateur avec des tâches et un temps d&amp;#39;attente entre elles.&lt;/p&gt;
&lt;p&gt;Cinquante utilisateurs simultanés qui listent les utilisateurs puis attendent une à trois secondes, pendant cinq minutes. Avec le SDK Java de Gatling (imports omis) :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class ApiSimulation extends Simulation {
  HttpProtocolBuilder api =
      http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  ScenarioBuilder users = scenario(&amp;quot;API users&amp;quot;)
      .exec(http(&amp;quot;list users&amp;quot;).get(&amp;quot;/api/users&amp;quot;))
      .pause(1, 3);

  {
    setUp(users.injectClosed(
        constantConcurrentUsers(50).during(300)))
      .protocols(api);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le même test dans Locust :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from locust import HttpUser, task, between


class ApiUser(HttpUser):
    wait_time = between(1, 3)

    @task
    def list_users(self):
        self.client.get(&amp;quot;/api/users&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;référence d&amp;#39;injection&lt;/a&gt; de Gatling range &lt;code&gt;constantConcurrentUsers&lt;/code&gt; parmi les étapes du modèle fermé. Locust reçoit le nombre d&amp;#39;utilisateurs et la durée sous forme d&amp;#39;options (vérifié le 13 octobre 2026) :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;locust -f locustfile.py --headless -u 50 -r 5 -t 5m \
  --host https://staging.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Comment Gatling et Locust modélisent-ils la charge ?&lt;/h2&gt;
&lt;p&gt;Gatling propose les modèles ouvert et fermé, selon la méthode que vous appelez. Locust fait tourner un pool d&amp;#39;utilisateurs, ce qui correspond à un modèle fermé.&lt;/p&gt;
&lt;p&gt;La page sur les &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;modèles de charge&lt;/a&gt; de Gatling définit les systèmes fermés comme ceux qui plafonnent le nombre d&amp;#39;utilisateurs simultanés, et les systèmes ouverts comme ceux où les utilisateurs continuent d&amp;#39;arriver même quand l&amp;#39;application répond lentement. Elle ajoute que la plupart des sites web sont ouverts. &lt;code&gt;injectOpen&lt;/code&gt; prend des taux d&amp;#39;arrivée et &lt;code&gt;injectClosed&lt;/code&gt; des cibles de concurrence.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;guide du locustfile&lt;/a&gt; indique que le temps d&amp;#39;attente ne peut que limiter le débit et ne lance pas de nouveaux utilisateurs pour atteindre un taux cible. Si une boucle dure plus longtemps que l&amp;#39;attente ne le permet, le taux passe sous la cible (vérifié le 13 octobre 2026). Notre guide sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique pourquoi cela compte.&lt;/p&gt;
&lt;h2&gt;Comment lancer un test plus gros que ce qu&amp;#39;une machine peut générer ?&lt;/h2&gt;
&lt;p&gt;Locust intègre le mode distribué. L&amp;#39;édition open source de Gatling génère la charge depuis une seule machine, et les exécutions distribuées demandent Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;Locust démarre un processus avec &lt;code&gt;--master&lt;/code&gt; et autant de processus &lt;code&gt;--worker&lt;/code&gt; que nécessaire. Selon les &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;docs sur la charge distribuée&lt;/a&gt;, un processus Python n&amp;#39;utilise pas plus d&amp;#39;un cœur, donc on lance un worker par cœur, et &lt;code&gt;--processes&lt;/code&gt; en démarre plusieurs sur une machine. Un &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;opérateur Kubernetes&lt;/a&gt; gère les exécutions distribuées dans un cluster.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/tutorials/faq/&quot;&gt;FAQ&lt;/a&gt; de Gatling dit que la Community Edition ne prend pas en charge les tests distribués, et le README décrit Enterprise comme exécuté sur des générateurs de charge gérés ou sur une infrastructure privée (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;p&gt;Il existe une échappatoire pour les deux. LoadFocus, l&amp;#39;éditeur de ce site, n&amp;#39;exécute ni les simulations Gatling ni les tests Locust. Si vous préférez ne faire tourner aucun des deux à grande échelle, il exécute des &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-locust&quot;&gt;scripts k6&lt;/a&gt; et des &lt;a href=&quot;https://loadfocus.com/fr-fr/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-locust&quot;&gt;plans de test JMeter&lt;/a&gt; depuis 25 régions cloud. Son validateur k6 avertit que les scénarios à taux d&amp;#39;arrivée y tournent avec un nombre fixe d&amp;#39;utilisateurs et ne tiennent donc pas une cadence de requêtes. Passer de l&amp;#39;un ou l&amp;#39;autre outil à ceux-là oblige à réécrire le test.&lt;/p&gt;
&lt;h2&gt;Comment décident-ils si un test a réussi, et quels rapports obtient-on ?&lt;/h2&gt;
&lt;p&gt;Gatling évalue les assertions après l&amp;#39;exécution et écrit un rapport HTML à chaque fois. Locust se termine avec le code 1 si une requête a échoué, et vous ajoutez d&amp;#39;autres contrôles sous forme de listener.&lt;/p&gt;
&lt;p&gt;Les &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; de Gatling sont évaluées après la simulation, et une seule assertion en échec fait échouer la simulation. Son &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;rapport HTML&lt;/a&gt; trace les percentiles du temps de réponse, les utilisateurs démarrés par seconde, les utilisateurs simultanés et les requêtes par seconde.&lt;/p&gt;
&lt;p&gt;D&amp;#39;après les &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;docs headless&lt;/a&gt; de Locust, l&amp;#39;exécution se termine avec le code 1 si un échantillon a échoué, et un exemple de listener fait échouer l&amp;#39;exécution sur le taux d&amp;#39;échec, le temps de réponse moyen ou le 95e percentile. La &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;référence de configuration&lt;/a&gt; cite &lt;code&gt;--csv&lt;/code&gt; pour les fichiers de statistiques et &lt;code&gt;--html&lt;/code&gt; pour un rapport (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quels protocoles chaque outil peut-il tester ?&lt;/h2&gt;
&lt;p&gt;Gatling en fournit davantage, avec des limites sur les plus récents. Locust fournit HTTP et HTTPS et attend un client Python pour le reste.&lt;/p&gt;
&lt;p&gt;Le README de Gatling liste HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events et JMS sous Apache 2.0 sans limite. gRPC, MQTT et GraphQL relèvent de la Gatling Enterprise Component License, et les tests qui les utilisent sont plafonnés à 5 utilisateurs simultanés et 5 minutes dans la Community Edition.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;page sur les autres systèmes&lt;/a&gt; de Locust montre comment envelopper une bibliothèque de protocole et signaler chaque appel, avec des exemples gRPC et MQTT. La bibliothèque doit fonctionner avec gevent, qui ne peut pas patcher les E/S faites en code C compilé, et locust-plugins ajoute des utilisateurs pour Kafka, Selenium et Playwright (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Lequel choisir ?&lt;/h2&gt;
&lt;p&gt;Choisissez selon le langage et la façon dont vous chargez le système. Gatling convient aux équipes JVM et aux tests en modèle ouvert, Locust aux équipes Python et aux tests à logique sur mesure.&lt;/p&gt;
&lt;p&gt;Choisissez Gatling plutôt que Locust si votre équipe vit sur la JVM et veut des tests Java, Kotlin ou Scala construits avec Maven, Gradle ou sbt, si vous avez besoin d&amp;#39;un modèle ouvert comme un taux d&amp;#39;arrivée fixe, si vous avez besoin de JMS ou de Server-Sent Events, ou si vous voulez des assertions et un rapport sans code supplémentaire.&lt;/p&gt;
&lt;p&gt;Choisissez Locust plutôt que Gatling si votre équipe écrit du Python et veut que les tests réutilisent un client Python interne, si vous voulez une interface web pour lancer une exécution et modifier la charge en cours de route, si vous avez besoin du mode distribué dans l&amp;#39;outil gratuit, ou si le système reçoit surtout des utilisateurs qui attendent et que votre protocole a une bibliothèque Python compatible gevent.&lt;/p&gt;
&lt;p&gt;Pour un constructeur de tests graphique, regardez JMeter, et pour un seul binaire sans JVM ni Python, regardez k6.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Gatling est-il plus rapide que Locust ?&lt;/strong&gt;
Nous ne l&amp;#39;avons pas mesuré nous-mêmes, donc nous ne désignons pas de gagnant. La seule comparaison honnête consiste à lancer le même scénario avec les deux outils sur votre propre matériel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust peut-il exécuter des simulations Gatling ?&lt;/strong&gt;
Pas d&amp;#39;après la documentation de Locust, qui ne décrit les tests que comme du code Python. Une simulation Gatling doit être réécrite en locustfile, et l&amp;#39;inverse vaut aussi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des tests Gatling ou Locust ?&lt;/strong&gt;
Non. LoadFocus exécute des plans de test JMeter et des scripts k6. Pour répartir une simulation Gatling sur plusieurs machines, utilisez Gatling Enterprise, et pour Locust son mode master et workers ou son opérateur Kubernetes.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-load-testing/&quot;&gt;Test de charge Gatling : l&amp;#39;outil JVM passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-load-testing/&quot;&gt;Test de charge Locust : l&amp;#39;outil Python passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-k6/&quot;&gt;Gatling vs k6 : simulations JVM ou un seul binaire Go ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-vs-jmeter/&quot;&gt;Locust vs JMeter : scripts Python ou plans de test JMeter ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>JMeter vs Postman : quel outil pour tester la charge ?</title><link>https://loadtest.app/fr/jmeter-vs-postman/</link><guid isPermaLink="true">https://loadtest.app/fr/jmeter-vs-postman/</guid><description>JMeter vs Postman en test de charge : utilisateurs virtuels, exécutions cloud et tarifs de Postman, leurs limites réelles, et quand choisir JMeter.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Postman est un client d&amp;#39;API conçu pour les vérifications fonctionnelles, les collections et le travail en équipe, auquel on a ajouté un mode de test de performance. Apache JMeter est un générateur de charge depuis l&amp;#39;origine. Utilisez Postman pour réutiliser la collection que vous avez déjà dans un test de charge rapide ou un smoke test en CI. Utilisez JMeter quand le test de charge est le vrai sujet : nombreux protocoles, grand nombre d&amp;#39;utilisateurs, rapports détaillés et génération de charge distribuée.&lt;/p&gt;
&lt;p&gt;Les informations sur Postman viennent de sa documentation et de sa page de tarifs, celles sur JMeter du site du projet, toutes vérifiées le 13 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Postman&lt;/th&gt;
&lt;th&gt;Apache JMeter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Usage principal&lt;/td&gt;
&lt;td&gt;Client d&amp;#39;API, tests fonctionnels et de collections, avec un mode performance&lt;/td&gt;
&lt;td&gt;Tests de charge et de performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Définition du test&lt;/td&gt;
&lt;td&gt;Une collection de requêtes avec des scripts et des assertions &lt;code&gt;pm.test()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Un plan de test construit dans une interface graphique et enregistré en &lt;code&gt;.jmx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Utilisateurs virtuels&lt;/td&gt;
&lt;td&gt;Chacun exécute la collection en boucle ; les exécutions locales sont limitées par votre machine&lt;/td&gt;
&lt;td&gt;Un thread Java par utilisateur dans un Thread Group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profils de charge&lt;/td&gt;
&lt;td&gt;Fixed, Ramp up, Spike et Peak&lt;/td&gt;
&lt;td&gt;Thread Groups avec une période de montée en charge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Origine de la charge&lt;/td&gt;
&lt;td&gt;Votre machine ou un runner CI, ou le cloud de Postman avec un forfait payant&lt;/td&gt;
&lt;td&gt;Votre machine, ou des serveurs JMeter distants que vous exploitez&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coût de la charge&lt;/td&gt;
&lt;td&gt;Exécutions locales dans tous les forfaits ; exécutions cloud à 0,04 $ par heure d&amp;#39;utilisateur virtuel&lt;/td&gt;
&lt;td&gt;Gratuit, licence Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Réussite ou échec en CI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;postman performance run&lt;/code&gt; avec &lt;code&gt;--pass-if&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mode CLI (&lt;code&gt;jmeter -n&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Que fait le test de performance de Postman ?&lt;/h2&gt;
&lt;p&gt;Il exécute les requêtes d&amp;#39;une collection avec plusieurs utilisateurs virtuels en parallèle, pendant un nombre de minutes défini. Chaque utilisateur répète les requêtes dans l&amp;#39;ordre, et vos scripts et assertions existants s&amp;#39;exécutent sous charge.&lt;/p&gt;
&lt;p&gt;Selon la &lt;a href=&quot;https://learning.postman.com/docs/tests-and-scripts/performance-testing/testing-api-performance&quot;&gt;documentation sur les tests de performance&lt;/a&gt;, la collection de vos tests fonctionnels est aussi votre test de charge, sans script ni langage distinct à maintenir (vérifié le 13 octobre 2026). Vous choisissez une durée et un nombre d&amp;#39;utilisateurs virtuels, puis un profil Fixed, Ramp up, Spike ou Peak, comme le décrit la &lt;a href=&quot;https://learning.postman.com/docs/tests-and-scripts/performance-testing/performance-test-configuration&quot;&gt;page de configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Quelles sont les limites de Postman pour les tests de charge ?&lt;/h2&gt;
&lt;p&gt;La limite principale est l&amp;#39;origine de la charge. Une exécution locale est plafonnée par la machine qui la lance, et tout ce qui dépasse suppose un forfait payant.&lt;/p&gt;
&lt;p&gt;Pour les exécutions locales, la documentation de Postman indique que le nombre d&amp;#39;utilisateurs virtuels dépend des ressources système disponibles et de la collection utilisée, que les scripts de pré-requête et de post-réponse réduisent le nombre d&amp;#39;utilisateurs simulables, et que l&amp;#39;exécution s&amp;#39;arrête si la machine dépasse son seuil de ressources. Elle suggère un premier test de 10 à 20 utilisateurs virtuels (vérifié le 13 octobre 2026). Au-delà, le générateur de charge peut lui-même fausser vos mesures, ce qui explique que Postman affiche aussi les pics de CPU et de mémoire de la machine de test.&lt;/p&gt;
&lt;p&gt;Les données sont la limite suivante. D&amp;#39;après la même page de configuration, les fichiers de données CSV et JSON ne fonctionnent que pour les exécutions locales, tandis que les datasets fonctionnent en local et dans le cloud.&lt;/p&gt;
&lt;h2&gt;Combien coûte le test de charge avec Postman ?&lt;/h2&gt;
&lt;p&gt;Les exécutions de performance locales sont incluses dans tous les forfaits. Les exécutions cloud sont réservées aux forfaits payants et facturées à l&amp;#39;usage, en heures d&amp;#39;utilisateur virtuel.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.postman.com/pricing/&quot;&gt;page de tarifs&lt;/a&gt; de Postman indique des tests de performance locaux illimités et des tests de performance cloud à 0,04 $ par heure d&amp;#39;utilisateur virtuel (vérifié le 13 octobre 2026). À ce tarif affiché, 500 utilisateurs virtuels pendant une heure représentent 500 heures d&amp;#39;utilisateur virtuel, soit 20 $, en plus du prix du forfait. Les adresses IP statiques pour atteindre des cibles derrière un pare-feu relèvent de l&amp;#39;offre Enterprise. Nous n&amp;#39;avons pas chiffré les forfaits eux-mêmes : consultez la page pour les tarifs actuels par utilisateur.&lt;/p&gt;
&lt;h2&gt;Quels protocoles peut-on tester sous charge ?&lt;/h2&gt;
&lt;p&gt;JMeter a une longue liste documentée. Pour Postman, nous n&amp;#39;avons trouvé aucune liste des protocoles pris en charge dans les exécutions de performance, donc nous n&amp;#39;affirmons rien à ce sujet.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://jmeter.apache.org/&quot;&gt;page d&amp;#39;accueil&lt;/a&gt; de JMeter cite HTTP et HTTPS, SOAP et REST, FTP, les bases de données via JDBC, LDAP, la messagerie JMS, le courrier SMTP, POP3 et IMAP, les commandes natives et scripts shell, TCP et les objets Java (vérifié le 13 octobre 2026). Postman gère d&amp;#39;autres types de requêtes dans l&amp;#39;application, comme GraphQL, gRPC et WebSocket, mais cela ne dit pas lesquels fonctionnent sous charge. Essayez-en un avant de vous y fier.&lt;/p&gt;
&lt;h2&gt;Comment monter en charge au-delà d&amp;#39;une machine ?&lt;/h2&gt;
&lt;p&gt;Postman monte en charge par son propre cloud, JMeter par des serveurs que vous exploitez vous-même. Le premier démarre plus facilement, le second vous donne le contrôle.&lt;/p&gt;
&lt;p&gt;Avec un forfait payant, les exécutions cloud de Postman répartissent la charge sur des workers gérés, si bien qu&amp;#39;une seule machine ne limite plus le test. Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;mode de test distant&lt;/a&gt; de JMeter permet à un client de piloter de nombreux serveurs JMeter. Chaque nœud doit avoir la même version de JMeter, un keystore pour RMI sur SSL sauf si vous le désactivez, et sa propre copie des fichiers de données (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;p&gt;Il existe une troisième voie pour les plans de test JMeter. LoadFocus, l&amp;#39;éditeur de ce site, &lt;a href=&quot;https://loadfocus.com/fr-fr/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=jmeter-vs-postman&quot;&gt;exécute vos plans de test JMeter existants&lt;/a&gt; depuis 25 régions cloud. Vous importez le fichier &lt;code&gt;.jmx&lt;/code&gt; et réglez utilisateurs virtuels, durée et montée en charge, sans serveur distant à configurer. LoadFocus n&amp;#39;exécute que JMeter et k6, donc pas une collection Postman.&lt;/p&gt;
&lt;h2&gt;Quel outil choisir ?&lt;/h2&gt;
&lt;p&gt;Choisissez Postman plutôt que JMeter pour les vérifications fonctionnelles et de contrat, pour une équipe qui partage des collections dans un espace de travail, et pour un smoke test rapide d&amp;#39;une API que vous testez déjà. Choisissez JMeter quand le test de charge est l&amp;#39;objectif principal, ou quand il vous faut plusieurs protocoles, beaucoup d&amp;#39;utilisateurs, ou des tests qui restent dans votre propre dépôt.&lt;/p&gt;
&lt;p&gt;Postman convient à un contrôle court en CI : &lt;code&gt;postman performance run&lt;/code&gt; se termine avec un code de sortie non nul quand un seuil comme le 95e percentile n&amp;#39;est pas respecté, ce qui fait échouer le build. JMeter est préférable pour la charge sur des bases de données ou de la messagerie, pour les longs tests d&amp;#39;endurance, et pour le tableau de bord HTML avec tables APDEX et percentiles que &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;sa documentation&lt;/a&gt; décrit.&lt;/p&gt;
&lt;p&gt;Beaucoup d&amp;#39;équipes utilisent les deux : Postman pour construire et vérifier les contrôles d&amp;#39;API, JMeter pour donner un vrai volume aux parcours critiques.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Postman peut-il remplacer JMeter pour les tests de charge ?&lt;/strong&gt;
Pour de petites vérifications d&amp;#39;API HTTP, oui, puisque la collection que vous avez déjà est le test. Pour une forte concurrence, d&amp;#39;autres protocoles ou de longues exécutions, les limites documentées des exécutions locales et la tarification à l&amp;#39;usage du cloud font de JMeter la base la plus sûre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Postman peut-il exécuter un fichier .jmx de JMeter ?&lt;/strong&gt;
Nous n&amp;#39;avons rien trouvé dans sa documentation qui importe un plan de test JMeter. Les tests de performance de Postman reposent sur des collections : un fichier &lt;code&gt;.jmx&lt;/code&gt; devrait être reconstruit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter est-il gratuit ?&lt;/strong&gt;
Oui. La version actuelle sur la &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;page de téléchargement&lt;/a&gt; est la 5.6.3, qui demande Java 8 ou plus récent (vérifié le 13 octobre 2026). Vous payez les machines qui génèrent la charge, ou un service cloud qui exécute vos plans.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;Outils de test de charge open source : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter : du code ou un plan de test graphique ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-vs-jmeter/&quot;&gt;Locust vs JMeter : scripts Python ou plans de test JMeter ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/apdex-score/&quot;&gt;Score Apdex : définition et méthode de calcul&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>k6 vs Locust : scripts JavaScript ou utilisateurs Python ?</title><link>https://loadtest.app/fr/k6-vs-locust/</link><guid isPermaLink="true">https://loadtest.app/fr/k6-vs-locust/</guid><description>k6 vs Locust comparés : licence, langage, modèles de charge, critères de réussite, protocoles et montée en charge, avec des conseils pour choisir.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;k6 et Locust sont deux outils open source qui gardent un test de charge sous forme de code dans votre dépôt, et l&amp;#39;un comme l&amp;#39;autre testera correctement une API HTTP sous charge. Choisissez Locust si votre équipe écrit du Python et veut de la logique de test en Python pur. Choisissez k6 si vous écrivez du JavaScript, voulez des seuils de réussite intégrés, ou avez besoin d&amp;#39;un test qui tient un taux d&amp;#39;arrivée.&lt;/p&gt;
&lt;p&gt;Les informations de ce comparatif k6 vs Locust viennent de la documentation et du dépôt de chaque projet, vérifiées le 13 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;k6&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exécution&lt;/td&gt;
&lt;td&gt;Un binaire Go avec un moteur JavaScript intégré (version v2.3.0)&lt;/td&gt;
&lt;td&gt;Python 3.11 ou plus récent (version 2.46.7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de test&lt;/td&gt;
&lt;td&gt;JavaScript, ou TypeScript dont les types sont retirés&lt;/td&gt;
&lt;td&gt;Classes Python dans un locustfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocoles intégrés&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSockets, gRPC&lt;/td&gt;
&lt;td&gt;HTTP et HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modèle de charge&lt;/td&gt;
&lt;td&gt;Six exécuteurs, dont deux arrival-rate (modèle ouvert)&lt;/td&gt;
&lt;td&gt;Un groupe d&amp;#39;utilisateurs qui attendent chacun un délai (modèle fermé)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Réussite ou échec&lt;/td&gt;
&lt;td&gt;Seuils, qui peuvent interrompre une exécution plus tôt&lt;/td&gt;
&lt;td&gt;Code de sortie 1 si des requêtes échouent ; autres limites via un listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests navigateur&lt;/td&gt;
&lt;td&gt;Module navigateur intégré&lt;/td&gt;
&lt;td&gt;Utilisateurs navigateur via le projet séparé &lt;a href=&quot;https://github.com/SvenskaSpel/locust-plugins&quot;&gt;locust-plugins&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Montée en charge&lt;/td&gt;
&lt;td&gt;k6-operator sur Kubernetes, ou Grafana Cloud k6&lt;/td&gt;
&lt;td&gt;Master et workers, un opérateur Kubernetes, ou Azure Load Testing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelle est la différence entre k6 et Locust ?&lt;/h2&gt;
&lt;p&gt;La différence principale est le langage dans lequel vous écrivez les tests. k6 exécute du JavaScript dans un programme Go compilé, tandis que Locust exécute votre code Python et s&amp;#39;appuie sur gevent pour gérer de nombreux utilisateurs simultanés.&lt;/p&gt;
&lt;p&gt;k6 s&amp;#39;installe comme &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;paquet ou binaire autonome&lt;/a&gt;, sans autre environnement d&amp;#39;exécution. Il exécute aussi des fichiers &lt;code&gt;.ts&lt;/code&gt;, mais son &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/javascript-typescript-compatibility-mode/&quot;&gt;support de TypeScript&lt;/a&gt; retire les types sans les vérifier. Locust s&amp;#39;installe avec &lt;code&gt;pip install locust&lt;/code&gt;, et sa page &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; indique que les tests sont du Python ordinaire, versionné comme n&amp;#39;importe quel autre code (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment écrire le même test dans chaque outil ?&lt;/h2&gt;
&lt;p&gt;Les deux expriment le test sous forme de petit programme. Voici un test avec 50 utilisateurs pendant cinq minutes, qui échoue si le 95e percentile dépasse 500 ms ou si plus de 1 % des requêtes échouent.&lt;/p&gt;
&lt;p&gt;Dans k6, les objectifs font partie du script, sous forme de &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;seuils&lt;/a&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { sleep } from &amp;quot;k6&amp;quot;;

export const options = {
  vus: 50,
  duration: &amp;quot;5m&amp;quot;,
  thresholds: {
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
  },
};

export default function () {
  http.get(&amp;quot;https://staging.example.com/api/users&amp;quot;);
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans Locust, l&amp;#39;utilisateur est une classe, et les mêmes objectifs vont dans un listener, d&amp;#39;après le modèle de la &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;documentation du mode headless&lt;/a&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import logging
from locust import HttpUser, between, events, task


class ApiUser(HttpUser):
    wait_time = between(1, 2)

    @task
    def list_users(self):
        self.client.get(&amp;quot;/api/users&amp;quot;)


@events.quitting.add_listener
def _(environment, **kw):
    stats = environment.stats.total
    if stats.fail_ratio &amp;gt; 0.01:
        environment.process_exit_code = 1
    elif stats.get_response_time_percentile(0.95) &amp;gt; 500:
        environment.process_exit_code = 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On les lance avec &lt;code&gt;k6 run script.js&lt;/code&gt; et &lt;code&gt;locust -f locustfile.py --headless -u 50 -r 10 -t 5m --host https://staging.example.com&lt;/code&gt; (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment k6 et Locust modélisent-ils la charge ?&lt;/h2&gt;
&lt;p&gt;k6 prend en charge les deux modèles de charge, alors que Locust décrit la charge comme un nombre fixe d&amp;#39;utilisateurs. Dans k6 vous choisissez le modèle par l&amp;#39;exécuteur, dans Locust par le nombre d&amp;#39;utilisateurs et le délai d&amp;#39;attente.&lt;/p&gt;
&lt;p&gt;k6 propose &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;six exécuteurs&lt;/a&gt;. Quatre sont fermés : un utilisateur virtuel ne démarre son itération suivante que lorsque la précédente est terminée. Les deux exécuteurs arrival-rate suivent le &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;modèle ouvert&lt;/a&gt;, où les itérations démarrent indépendamment de la durée des précédentes. Le &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;guide du locustfile&lt;/a&gt; précise que le délai d&amp;#39;attente peut seulement limiter le débit et ne peut pas lancer de nouveaux utilisateurs pour atteindre une cadence cible (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;p&gt;Si votre objectif est « 300 requêtes arrivent chaque seconde, quel que soit le temps de réponse », k6 sait l&amp;#39;exprimer directement. Notre guide sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert et fermé&lt;/a&gt; explique quand utiliser chacun.&lt;/p&gt;
&lt;h2&gt;Comment k6 et Locust décident-ils si un test est réussi ?&lt;/h2&gt;
&lt;p&gt;k6 fait des critères de réussite une fonction centrale, et Locust laisse l&amp;#39;essentiel à votre code. Un seuil k6 non respecté termine l&amp;#39;exécution avec un code de sortie non nul, et &lt;code&gt;abortOnFail&lt;/code&gt; arrête le test dès qu&amp;#39;il échoue.&lt;/p&gt;
&lt;p&gt;Locust se termine avec le code 1 si une requête a échoué. Pour des limites sur le taux d&amp;#39;échec, la moyenne ou le 95e percentile, sa documentation montre un listener comme celui ci-dessus, qui fixe lui-même le code de sortie (vérifié le 13 octobre 2026). Notre guide sur les &lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;critères de réussite d&amp;#39;un test de charge&lt;/a&gt; aide à choisir les limites.&lt;/p&gt;
&lt;h2&gt;Quels protocoles chaque outil couvre-t-il ?&lt;/h2&gt;
&lt;p&gt;k6 livre quatre protocoles et un module navigateur, Locust livre HTTP et HTTPS et vous laisse envelopper n&amp;#39;importe quel client Python pour le reste.&lt;/p&gt;
&lt;p&gt;k6 liste HTTP/1.1, HTTP/2, WebSockets et gRPC comme &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;protocoles intégrés&lt;/a&gt;, avec d&amp;#39;autres via des extensions xk6, ainsi qu&amp;#39;un &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6-browser/&quot;&gt;module navigateur&lt;/a&gt; qui pilote un navigateur basé sur Chromium. La page de Locust sur les &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;autres systèmes&lt;/a&gt; dit qu&amp;#39;il n&amp;#39;a de support intégré que pour HTTP/HTTPS mais qu&amp;#39;on peut l&amp;#39;étendre pour tester presque n&amp;#39;importe quel système, en enveloppant une bibliothèque de protocole et en signalant chaque appel comme une requête. La bibliothèque doit coopérer avec gevent (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment lancer un test plus gros que ce qu&amp;#39;une machine peut générer ?&lt;/h2&gt;
&lt;p&gt;Locust monte en charge avec un master et des workers, k6 avec un opérateur Kubernetes ou un service hébergé. Les deux peuvent répartir un test sur de nombreuses machines.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;documentation du mode distribué&lt;/a&gt; de Locust indique qu&amp;#39;un processus peut faire plus de mille requêtes par seconde pour un plan de test simple ; les tests plus gros utilisent donc un worker par cœur de processeur, sur autant de machines que nécessaire. Le &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; répartit un test sur plusieurs instances k6 dans un cluster Kubernetes, et Grafana Cloud k6 est la voie hébergée (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;p&gt;Il existe une troisième voie pour les scripts k6. LoadFocus, qui publie ce site, &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=k6-vs-locust&quot;&gt;exécute des scripts k6&lt;/a&gt; depuis 25 régions cloud, avec les utilisateurs et la durée tirés des réglages du test. Son validateur de scripts avertit que les scénarios arrival-rate y tournent avec un nombre fixe d&amp;#39;utilisateurs : un script en modèle ouvert ne tient donc pas son taux d&amp;#39;arrivée sur LoadFocus. LoadFocus n&amp;#39;exécute pas Locust : il exécute uniquement des scripts k6 et des plans de test JMeter.&lt;/p&gt;
&lt;h2&gt;Quels rapports obtient-on ?&lt;/h2&gt;
&lt;p&gt;k6 affiche un récapitulatif en fin de test et peut exporter un rapport HTML depuis son tableau de bord web. Locust montre des graphiques en direct dans son interface web et écrit des fichiers à la demande.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/end-of-test/&quot;&gt;récapitulatif de fin de test&lt;/a&gt; de k6 s&amp;#39;affiche dans le terminal, et son &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/web-dashboard/&quot;&gt;tableau de bord web&lt;/a&gt; exporte un rapport HTML autonome quand vous définissez &lt;code&gt;K6_WEB_DASHBOARD_EXPORT&lt;/code&gt;. Locust sert une interface web sur le port 8089 avec des graphiques en direct, et sa &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;référence de configuration&lt;/a&gt; liste les sorties &lt;code&gt;--csv&lt;/code&gt;, &lt;code&gt;--html&lt;/code&gt; et &lt;code&gt;--json&lt;/code&gt; (vérifié le 13 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Lequel choisir ?&lt;/h2&gt;
&lt;p&gt;Locust convient aux équipes Python, et k6 à celles qui veulent des seuils intégrés et un modèle de charge ouvert. Les protocoles et la montée en charge tranchent la plupart des autres cas.&lt;/p&gt;
&lt;p&gt;Choisissez Locust plutôt que k6 si votre équipe écrit du Python et veut des boucles, des branchements, des données générées et son propre client d&amp;#39;API en Python pur, si vous voulez réutiliser des bibliothèques Python pour un protocole, ou si vous voulez une interface web avec des graphiques en direct pour explorer un système. Choisissez k6 plutôt que Locust si votre équipe écrit du JavaScript ou du TypeScript, si des seuils doivent faire échouer un build CI et arrêter tôt une mauvaise exécution, si vous avez besoin d&amp;#39;un taux d&amp;#39;arrivée constant, ou si vous voulez gRPC et les tests navigateur dans le même outil.&lt;/p&gt;
&lt;p&gt;Pour une vue plus large, lisez notre revue du &lt;a href=&quot;https://loadtest.app/fr/locust-load-testing/&quot;&gt;test de charge avec Locust&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Locust est-il plus rapide que k6 ?&lt;/strong&gt;
Nous ne l&amp;#39;avons pas mesuré nous-mêmes, donc nous ne désignons pas de gagnant. Le test équitable est le même scénario avec les deux outils sur votre propre matériel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust peut-il exécuter des scripts k6 ?&lt;/strong&gt;
Pas d&amp;#39;après la documentation de Locust, qui décrit des tests écrits en Python dans un locustfile. Un script k6 est du JavaScript, il faut donc le réécrire en classe d&amp;#39;utilisateur Python, et les seuils deviennent un listener.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des tests Locust ?&lt;/strong&gt;
Non. LoadFocus exécute des scripts k6 et des plans de test JMeter. Pour faire monter en charge un test Locust, utilisez son mode master et workers, l&amp;#39;opérateur Kubernetes ou Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-load-testing/&quot;&gt;Test de charge Locust : l&amp;#39;outil Python passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-vs-jmeter/&quot;&gt;Locust vs JMeter : scripts Python ou plans de test JMeter ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-k6/&quot;&gt;Gatling vs k6 : simulations JVM ou binaire Go ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery : quel outil de test de charge choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel utiliser ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/azure-load-testing/&quot;&gt;Azure Load Testing : le service de Microsoft passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Coordinated omission : ce que c&apos;est et comment l&apos;éviter</title><link>https://loadtest.app/fr/coordinated-omission/</link><guid isPermaLink="true">https://loadtest.app/fr/coordinated-omission/</guid><description>La coordinated omission expliquée : comment un générateur qui attend les réponses lentes les masque, comment la repérer et ce que font wrk2, k6 et JMeter.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;La coordinated omission est une erreur de mesure : un générateur de charge attend chaque réponse lente avant d&amp;#39;envoyer sa requête suivante, il envoie donc moins de requêtes au moment même où le système ralentit et enregistre trop peu des mauvais moments. Les percentiles que vous lisez ensuite paraissent alors meilleurs que ce que les utilisateurs ont vécu. Pour l&amp;#39;éviter, envoyez les requêtes selon un calendrier qui ignore les temps de réponse et mesurez chaque requête à partir du moment où elle aurait dû partir.&lt;/p&gt;
&lt;p&gt;Les informations sur les outils viennent de la documentation ou du dépôt de chaque projet, vérifiées le 9 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Ce qu&amp;#39;il propose&lt;/th&gt;
&lt;th&gt;Ce qu&amp;#39;il faut vérifier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;wrk2&lt;/td&gt;
&lt;td&gt;Un taux constant (&lt;code&gt;-R&lt;/code&gt;), latence mesurée depuis l&amp;#39;envoi prévu&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--u_latency&lt;/code&gt; ajoute la vue non corrigée&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HdrHistogram&lt;/td&gt;
&lt;td&gt;Deux méthodes qui comblent les mesures manquantes&lt;/td&gt;
&lt;td&gt;En appliquer une seule, jamais les deux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;Les executors à taux d&amp;#39;arrivée&lt;/td&gt;
&lt;td&gt;Le compteur &lt;code&gt;dropped_iterations&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Des étapes &lt;code&gt;injectOpen&lt;/code&gt; comme &lt;code&gt;constantUsersPerSec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Les étapes sont dans &lt;code&gt;injectOpen&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant_throughput&lt;/code&gt; cadence chaque utilisateur&lt;/td&gt;
&lt;td&gt;Le taux atteint par rapport à la cible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Open Model Thread Group (5.5 et plus, expérimental)&lt;/td&gt;
&lt;td&gt;Un Thread Group classique est un pool fermé&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qu&amp;#39;est-ce que la coordinated omission ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est l&amp;#39;erreur qui survient quand le côté qui mesure cesse de prendre des mesures parce que le système est lent, si bien que les mesures qui manquent sont précisément les lentes. Perdre des mesures au hasard bouge à peine un percentile ; les perdre au rythme d&amp;#39;un ralentissement les fausse tous.&lt;/p&gt;
&lt;p&gt;Le nom vient de Gil Tene, dont un &lt;a href=&quot;https://groups.google.com/g/mechanical-sympathy/c/icNZJejUHfE&quot;&gt;message de 2013 sur une liste de diffusion&lt;/a&gt; trace exactement cette frontière. Il est l&amp;#39;auteur d&amp;#39;origine d&amp;#39;&lt;a href=&quot;https://hdrhistogram.github.io/HdrHistogram/&quot;&gt;HdrHistogram&lt;/a&gt;, wrk2 se trouve sur son compte GitHub, et la documentation des deux projets explique l&amp;#39;effet (vérifié le 9 octobre 2026). La documentation de k6 emploie le terme pour un modèle de charge fermé qui freine sa propre charge, une cause fréquente. Notre article sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; traite ce choix ; celui-ci s&amp;#39;en tient à la mesure.&lt;/p&gt;
&lt;h2&gt;Comment un test de charge finit-il par masquer les réponses lentes ?&lt;/h2&gt;
&lt;p&gt;Un générateur en boucle fermée n&amp;#39;envoie la requête suivante sur une connexion qu&amp;#39;après l&amp;#39;arrivée de la réponse précédente. Si une réponse prend une seconde, cette connexion n&amp;#39;envoie rien pendant une seconde, et les requêtes qu&amp;#39;elle aurait envoyées n&amp;#39;obtiennent jamais de temps de réponse.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;README de wrk2&lt;/a&gt; le dit du modèle de wrk, qui mesure chaque requête du premier octet envoyé à la réponse complète : comme une connexion n&amp;#39;envoie qu&amp;#39;après une réponse, le générateur se coordonne avec le serveur et évite de mesurer pendant les périodes de forte latence (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/HdrHistogram/HdrHistogram&quot;&gt;README d&amp;#39;HdrHistogram&lt;/a&gt; propose une expérience de pensée. Un système mesuré toutes les 10 ms répond en 1 ms pendant 100 secondes, puis se fige pendant 100 secondes, ce qui donne une seule mesure de 100 secondes. L&amp;#39;histogramme brut place environ 99,99 % des résultats à 1 ms ou moins ; corrigé des mesures bloquées, il n&amp;#39;en place qu&amp;#39;environ la moitié.&lt;/p&gt;
&lt;h2&gt;Comment savoir si vos résultats souffrent de coordinated omission ?&lt;/h2&gt;
&lt;p&gt;Comparez le taux envoyé au taux prévu. Si le taux de requêtes a baissé pendant que les temps de réponse montaient, le générateur a levé le pied et la période lente est sous-représentée.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La charge était définie en utilisateurs ou en connexions, sans taux.&lt;/strong&gt; N&amp;#39;importe quelle boucle fermée peut produire l&amp;#39;erreur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le taux de requêtes baisse là où les temps de réponse montent.&lt;/strong&gt; Un creux du taux pendant un pic signifie que des requêtes ne sont jamais parties.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le maximum écrase le 99e percentile.&lt;/strong&gt; Quelques mesures énormes parmi des milliers de rapides, c&amp;#39;est l&amp;#39;exemple ci-dessus en miniature. Lisez toute la &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;distribution des temps de réponse&lt;/a&gt;, en gardant à l&amp;#39;esprit qu&amp;#39;elle ne compte que les requêtes envoyées.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le générateur de charge manquait de CPU.&lt;/strong&gt; LoadFocus documente qu&amp;#39;un moteur proche de 100 % de CPU ne peut pas envoyer au taux configuré, et ses résultats affichent un avertissement de &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/load-generator-saturation?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;saturation du générateur de charge&lt;/a&gt; quand un moteur a atteint ou dépassé 80 % de CPU en pointe.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Comment wrk2 évite-t-il la coordinated omission ?&lt;/h2&gt;
&lt;p&gt;Il envoie à taux constant et mesure chaque requête à partir du moment où le plan prévoyait son départ. Une requête partie en retard parce que sa connexion était occupée se voit compter l&amp;#39;attente.&lt;/p&gt;
&lt;p&gt;wrk2 ajoute à wrk un argument de taux (&lt;code&gt;-R&lt;/code&gt;, requêtes par seconde au total) et enregistre les latences dans un HdrHistogram. &lt;code&gt;--u_latency&lt;/code&gt; ajoute au rapport l&amp;#39;histogramme non corrigé, marqué CO, comme dans l&amp;#39;exemple du README :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wrk -t2 -c100 -d30s -R2000 --u_latency http://127.0.0.1:80/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans le second exemple du README, une pause du serveur de 1,4 seconde pendant un test de 30 secondes rend le 99e percentile corrigé 200 fois plus élevé que le non corrigé. Le README qualifie aussi le projet d&amp;#39;expérimental et prévient que des tests de moins de 10 à 20 secondes risquent de ne rien apprendre (vérifié le 9 octobre 2026). Notre &lt;a href=&quot;https://loadtest.app/fr/http-benchmarking-tools/&quot;&gt;revue des outils de benchmark HTTP&lt;/a&gt; compare wrk2 à hey, oha et d&amp;#39;autres.&lt;/p&gt;
&lt;h2&gt;Comment HdrHistogram corrige-t-il les latences enregistrées ?&lt;/h2&gt;
&lt;p&gt;Si vous connaissez l&amp;#39;intervalle auquel les requêtes devaient partir, il ajoute les mesures qu&amp;#39;une longue réponse a bloquées. La correction se fait à l&amp;#39;enregistrement ou après coup, sur une copie.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;recordValueWithExpectedInterval&lt;/code&gt; enregistre une valeur et, si elle dépasse l&amp;#39;intervalle, ajoute des valeurs qui décroissent par pas de cet intervalle. &lt;code&gt;copyCorrectedForCoordinatedOmission&lt;/code&gt; renvoie une copie corrigée d&amp;#39;un histogramme terminé. La &lt;a href=&quot;https://hdrhistogram.github.io/HdrHistogram/JavaDoc/org/HdrHistogram/AbstractHistogram.html&quot;&gt;JavaDoc&lt;/a&gt; présente les deux méthodes comme mutuellement exclusives (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// intervalle prévu : 10 ms, valeurs en microsecondes
Histogram h = new Histogram(3);
h.recordValueWithExpectedInterval(latencyUs, 10_000);

// ou, après le test, sur un histogramme brut :
Histogram fixed = raw.copyCorrectedForCoordinatedOmission(10_000);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La correction ne vaut que ce que vaut l&amp;#39;intervalle que vous lui passez. Elle convient donc à un générateur censé envoyer à un rythme régulier.&lt;/p&gt;
&lt;h2&gt;Comment k6, Gatling, Locust et JMeter s&amp;#39;y prennent-ils ?&lt;/h2&gt;
&lt;p&gt;k6, Gatling et JMeter peuvent lancer le travail selon un calendrier qui n&amp;#39;attend pas les réponses. Locust cadence chaque utilisateur mais ne peut pas lancer d&amp;#39;utilisateurs supplémentaires pour tenir un taux.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6.&lt;/strong&gt; Dans les executors à taux d&amp;#39;arrivée, &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;les itérations démarrent indépendamment de la réponse du système&lt;/a&gt; tant qu&amp;#39;un utilisateur virtuel est libre. Quand aucun ne l&amp;#39;est, k6 saute l&amp;#39;itération et la compte dans &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;&lt;code&gt;dropped_iterations&lt;/code&gt;&lt;/a&gt;, ce qui, tard dans un test, peut signifier que le système se dégrade (vérifié le 9 octobre 2026). Une itération abandonnée n&amp;#39;a pas de temps de réponse : lisez ce compteur à côté des percentiles. Sur LoadFocus, les scénarios à taux d&amp;#39;arrivée des &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;scripts k6&lt;/a&gt; tournent avec un nombre fixe d&amp;#39;utilisateurs, soit un modèle fermé. Lancez k6 vous-même quand le taux d&amp;#39;arrivée est l&amp;#39;objet du test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; Des étapes comme &lt;code&gt;constantUsersPerSec&lt;/code&gt; dans &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; lancent de nouveaux utilisateurs virtuels à un taux fixé, que les précédents aient terminé ou non (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust.&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;constant_throughput&lt;/code&gt;&lt;/a&gt; ajuste l&amp;#39;attente de chaque utilisateur pour qu&amp;#39;il exécute une tâche au plus un certain nombre de fois par seconde. La documentation précise que le temps d&amp;#39;attente ne peut que limiter le taux et ne lance pas de nouveaux utilisateurs, et la &lt;a href=&quot;https://docs.locust.io/en/stable/api.html&quot;&gt;référence de l&amp;#39;API&lt;/a&gt; ajoute qu&amp;#39;une tâche qui dépasse son intervalle n&amp;#39;est suivie d&amp;#39;aucune attente. Une réponse lente retarde donc quand même cet utilisateur (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Un &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; est un pool de threads qui bouclent, donc une boucle fermée. JMeter 5.5 a ajouté l&amp;#39;&lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Open_Model_Thread_Group&quot;&gt;Open Model Thread Group&lt;/a&gt;, expérimental, qui suit un calendrier comme &lt;code&gt;rate(1/sec) random_arrivals(2 min)&lt;/code&gt; et, selon les &lt;a href=&quot;https://jmeter.apache.org/changes_history.html&quot;&gt;notes de version&lt;/a&gt;, crée des threads au besoin (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Un modèle de charge ouvert supprime-t-il la coordinated omission ?&lt;/h2&gt;
&lt;p&gt;Il supprime la cause principale, un générateur qui attend avant d&amp;#39;envoyer. Deux failles restent : un générateur à court d&amp;#39;utilisateurs ou de CPU prend quand même du retard sur son calendrier, et chaque utilisateur d&amp;#39;un parcours en plusieurs étapes attend toujours ses propres réponses.&lt;/p&gt;
&lt;p&gt;La première se voit sous forme d&amp;#39;itérations abandonnées ou d&amp;#39;un moteur saturé ; dans les deux cas, relancez le test avec plus de marge. La seconde est inhérente à la plupart des tests HTTP : le README de wrk2 note qu&amp;#39;envoyer sans attendre ne convient qu&amp;#39;aux protocoles non bloquants ou à une requête par connexion, et c&amp;#39;est pourquoi wrk2 corrige plutôt la mesure du temps.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Qui a nommé la coordinated omission ?&lt;/strong&gt;
Gil Tene, l&amp;#39;auteur d&amp;#39;origine d&amp;#39;HdrHistogram, dont le fork wrk2 de wrk est conçu pour l&amp;#39;éviter. Son message de 2013 sur la liste de diffusion mechanical-sympathy la décrit comme un problème qu&amp;#39;il appelle ainsi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La coordinated omission est-elle la même chose qu&amp;#39;un modèle de charge fermé ?&lt;/strong&gt;
Les deux sont liés. Un modèle fermé en est une cause fréquente, puisque chaque utilisateur virtuel attend sa réponse avant de renvoyer, et le README de wrk2 retrouve aussi l&amp;#39;effet dans le code de supervision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faut-il corriger tous les histogrammes de latence ?&lt;/strong&gt;
Seulement si vous connaissez l&amp;#39;intervalle auquel les requêtes étaient prévues, car HdrHistogram en a besoin pour combler les mesures manquantes. Appliquez à un jeu de données une seule de ses deux méthodes de correction, jamais les deux.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/http-benchmarking-tools/&quot;&gt;Outils de benchmark HTTP : wrk, hey, oha, ab et autres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;Critères de réussite d&amp;#39;un test de charge : comment les fixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/ycsb/&quot;&gt;YCSB : charges de travail A-F, exécution et limites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Test de charge Gatling : l&apos;outil JVM passé en revue</title><link>https://loadtest.app/fr/gatling-load-testing/</link><guid isPermaLink="true">https://loadtest.app/fr/gatling-load-testing/</guid><description>Test de charge Gatling : simulations, injection ouverte ou fermée, checks, assertions, rapport HTML, plugins de build, CI, limites et quand préférer k6.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Gatling est un outil de test de charge gratuit sous licence Apache 2.0, dans lequel chaque test est une simulation écrite en code, exécutée sur la JVM et suivie d&amp;#39;un rapport HTML. Un test de charge Gatling convient aux équipes de développement qui veulent leurs tests dans le dépôt, des modèles de charge ouverts ou fermés et des assertions qui font échouer le build. Les équipes qui veulent un éditeur de tests graphique ou beaucoup de protocoles seront mieux servies par JMeter, et celles qui veulent un seul binaire sans JVM par k6.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas exécuté Gatling pour cette revue. Les faits viennent de la documentation, du dépôt et des pages de version de Gatling, vérifiés le 9 octobre 2026, et les jugements sont les nôtres.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sujet&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;Apache 2.0, sauf les plugins gRPC, MQTT et GraphQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environnement&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS 64 bits de 11 à 25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version actuelle&lt;/td&gt;
&lt;td&gt;3.16.0 (29 septembre 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Langages des tests&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript, TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocoles intégrés&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, SSE, JMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Résultats&lt;/td&gt;
&lt;td&gt;Rapport HTML statique par exécution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build et CI&lt;/td&gt;
&lt;td&gt;Plugins Maven, Gradle, sbt et npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Montée en échelle&lt;/td&gt;
&lt;td&gt;Gatling Enterprise (commercial)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qui développe Gatling, et le projet est-il toujours maintenu ?&lt;/h2&gt;
&lt;p&gt;Gatling Corp, une entreprise française, développe Gatling et en détient les droits d&amp;#39;auteur. Le projet est activement maintenu, avec trois versions JVM publiées depuis le début de 2026.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/project/licenses/project-licenses/&quot;&gt;page des licences&lt;/a&gt; attribue les droits d&amp;#39;auteur à Gatling Corp. &lt;a href=&quot;https://repo1.maven.org/maven2/io/gatling/gatling-core/&quot;&gt;Maven Central&lt;/a&gt; liste la 3.15.0 en février, la 3.15.1 en mai et la 3.16.0 le 29 septembre 2026, et le SDK JavaScript est passé en &lt;a href=&quot;https://github.com/gatling/gatling-js/releases/tag/v3.16.1&quot;&gt;3.16.1&lt;/a&gt; le 6 octobre. Les &lt;a href=&quot;https://docs.gatling.io/release-notes/gatling/whats-new/3.16/&quot;&gt;notes de version 3.16&lt;/a&gt; ajoutent GraphQL et des files partagées entre utilisateurs virtuels. Le &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; présente le dépôt comme la Community Edition, libre d&amp;#39;utilisation, y compris commerciale (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;De quoi avez-vous besoin pour exécuter Gatling ?&lt;/h2&gt;
&lt;p&gt;D&amp;#39;une JVM 64 bits pour Java, Kotlin ou Scala, ou de Node.js pour JavaScript et TypeScript. Dans les deux cas, la simulation elle-même tourne sur une JVM.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/reference/deploy/install-local/&quot;&gt;page d&amp;#39;installation&lt;/a&gt; prend en charge les versions LTS d&amp;#39;OpenJDK de 11 à 25 et exclut les JVM 32 bits et OpenJ9. La &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/js-cli/&quot;&gt;CLI JavaScript&lt;/a&gt; demande Node.js 24 ou plus récent et télécharge un bundle d&amp;#39;exécution Gatling, ainsi que GraalVM selon le &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;README de gatling-js&lt;/a&gt; (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment une simulation Gatling est-elle structurée ?&lt;/h2&gt;
&lt;p&gt;Une simulation définit des scénarios, donne à chacun un profil d&amp;#39;injection et y attache une configuration de protocole, le tout enregistré par un seul appel à &lt;code&gt;setUp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dans la &lt;a href=&quot;https://docs.gatling.io/concepts/simulation/&quot;&gt;référence des simulations&lt;/a&gt;, un scénario enchaîne des requêtes avec des pauses, des boucles et des conditions. Cette simulation Java enregistre l&amp;#39;identifiant d&amp;#39;un produit trouvé par une recherche, marque une pause d&amp;#39;une à trois secondes et ouvre la fiche produit, tandis que les arrivées montent à 20 utilisateurs par seconde puis s&amp;#39;y maintiennent dix minutes :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class ShopSimulation extends Simulation {

  HttpProtocolBuilder api =
      http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  ScenarioBuilder shoppers = scenario(&amp;quot;Shoppers&amp;quot;)
      .exec(http(&amp;quot;search&amp;quot;).get(&amp;quot;/api/products?q=lamp&amp;quot;)
          .check(jsonPath(&amp;quot;$[0].id&amp;quot;).saveAs(&amp;quot;id&amp;quot;)))
      .pause(1, 3)
      .exec(http(&amp;quot;product&amp;quot;).get(&amp;quot;/api/products/#{id}&amp;quot;));

  {
    setUp(shoppers.injectOpen(
        rampUsersPerSec(1).to(20).during(120),
        constantUsersPerSec(20).during(600)))
      .protocols(api)
      .assertions(
          global().responseTime().percentile(95.0).lt(800));
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les imports sont omis, et &lt;code&gt;#{id}&lt;/code&gt; lit la valeur enregistrée grâce à l&amp;#39;&lt;a href=&quot;https://docs.gatling.io/concepts/session/el/&quot;&gt;Expression Language&lt;/a&gt; de Gatling. &lt;a href=&quot;https://loadtest.app/fr/gatling-vs-k6/&quot;&gt;Gatling vs k6&lt;/a&gt; montre une simulation en JavaScript.&lt;/p&gt;
&lt;h2&gt;Faut-il injecter les utilisateurs en modèle ouvert ou fermé ?&lt;/h2&gt;
&lt;p&gt;En modèle ouvert pour la plupart des sites web et des API, où de nouveaux utilisateurs continuent d&amp;#39;arriver même quand le système ralentit. Le modèle fermé convient aux systèmes qui plafonnent la concurrence, comme une file d&amp;#39;attente de billetterie.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;référence de l&amp;#39;injection&lt;/a&gt; sépare l&amp;#39;API : &lt;code&gt;injectOpen&lt;/code&gt; prend des taux d&amp;#39;arrivée comme &lt;code&gt;rampUsersPerSec&lt;/code&gt;, et &lt;code&gt;injectClosed&lt;/code&gt; des cibles de concurrence comme &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. La &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;page sur les modèles de charge&lt;/a&gt; indique que la plupart des sites web se comportent comme des systèmes ouverts et qu&amp;#39;un profil ne peut pas mélanger les deux (vérifié le 9 octobre 2026). Notre guide sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique comment choisir.&lt;/p&gt;
&lt;h2&gt;Comment fonctionnent les checks, les assertions et le rapport ?&lt;/h2&gt;
&lt;p&gt;Les checks vérifient chaque réponse et peuvent en extraire des valeurs, tandis que les assertions jugent l&amp;#39;exécution entière une fois terminée. Chaque exécution produit ensuite un rapport HTML.&lt;/p&gt;
&lt;p&gt;Sans check de statut explicite, Gatling &lt;a href=&quot;https://docs.gatling.io/reference/script/http/checks/&quot;&gt;vérifie&lt;/a&gt; que chaque réponse HTTP est en 2XX ou 304. Les &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; portent sur les temps de réponse, le nombre de requêtes ou les requêtes par seconde, globalement ou par requête, et une seule assertion en échec fait échouer la simulation. Le &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;rapport HTML&lt;/a&gt; présente les tranches de temps de réponse et les percentiles, les utilisateurs démarrés par seconde, les utilisateurs simultanés et les requêtes par seconde ; ses percentiles dans le temps ne comptent que les requêtes réussies (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment Gatling s&amp;#39;intègre-t-il au build et à la CI ?&lt;/h2&gt;
&lt;p&gt;Par son plugin Maven, Gradle, sbt ou npm, qui tourne dans n&amp;#39;importe quel système de CI. Une assertion en échec fait échouer le build.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/maven-plugin/&quot;&gt;plugin Maven&lt;/a&gt; rattache &lt;code&gt;gatling:test&lt;/code&gt; à la phase &lt;code&gt;integration-test&lt;/code&gt;, si bien que &lt;code&gt;mvn verify&lt;/code&gt; le lance, et avec &lt;code&gt;CI=true&lt;/code&gt; il ne demande plus quelle simulation exécuter (l&amp;#39;exécution échoue alors si le projet contient plus d&amp;#39;une simulation et qu&amp;#39;aucune n&amp;#39;est désignée). Le &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/gradle-plugin/&quot;&gt;plugin Gradle&lt;/a&gt; utilise &lt;code&gt;gatlingRun&lt;/code&gt;, et le &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/sbt-plugin/&quot;&gt;plugin sbt&lt;/a&gt; n&amp;#39;accepte que des simulations en Scala. Les &lt;a href=&quot;https://docs.gatling.io/integrations/ci-cd/&quot;&gt;intégrations CI&lt;/a&gt; toutes prêtes de Gatling, comme son action GitHub, lancent des exécutions Gatling Enterprise (vérifié le 9 octobre 2026). Notre &lt;a href=&quot;https://loadtest.app/fr/load-testing-in-github-actions/&quot;&gt;guide GitHub Actions&lt;/a&gt; traite le côté workflow.&lt;/p&gt;
&lt;h2&gt;Quels protocoles Gatling prend-il en charge ?&lt;/h2&gt;
&lt;p&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events et JMS sont fournis sans limite. gRPC, MQTT et GraphQL sont des plugins séparés, plafonnés à 5 utilisateurs et 5 minutes hors de Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; place les cinq premiers sous Apache 2.0. Les pages d&amp;#39;installation de &lt;a href=&quot;https://docs.gatling.io/reference/script/grpc/setup/&quot;&gt;gRPC&lt;/a&gt;, &lt;a href=&quot;https://docs.gatling.io/reference/script/mqtt/setup/&quot;&gt;MQTT&lt;/a&gt; et &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/setup/&quot;&gt;GraphQL&lt;/a&gt; placent chaque plugin sous la Gatling Enterprise Component License : sans limite sur Gatling Enterprise, tandis qu&amp;#39;un test avec la Community Edition s&amp;#39;arrête à 5 utilisateurs ou 5 minutes. Cette &lt;a href=&quot;https://docs.gatling.io/project/licenses/enterprise-component/&quot;&gt;licence&lt;/a&gt; accorde un usage gratuit pendant un an au plus, uniquement pour tester en interne vos propres applications web ; elle prend fin dès qu&amp;#39;une limite est atteinte, et Gatling peut modifier ces limites. GraphQL exige la 3.16.0 ou plus récente. Ses notes de version et le README indiquent que le SDK JavaScript ne le prend pas encore en charge, même si la page d&amp;#39;installation cite déjà un paquet npm : vérifiez ce point avant de prévoir un test GraphQL en JavaScript (vérifié le 9 octobre 2026). Notre guide pour &lt;a href=&quot;https://loadtest.app/fr/how-to-load-test-a-graphql-api/&quot;&gt;tester la charge d&amp;#39;une API GraphQL&lt;/a&gt; contourne ce plafond avec de simples requêtes HTTP.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;apporte Gatling Enterprise ?&lt;/h2&gt;
&lt;p&gt;Gatling Enterprise est l&amp;#39;édition commerciale, sur le même moteur. Elle génère la charge depuis une infrastructure gérée ou privée, ce que l&amp;#39;édition gratuite ne fait pas.&lt;/p&gt;
&lt;p&gt;D&amp;#39;après le README, Enterprise exécute les tests sur des générateurs de charge gérés ou dans vos propres comptes AWS, Azure, GCP ou Kubernetes, et ajoute des tableaux de bord en direct, des tendances, des équipes avec SSO et des intégrations CI/CD. La &lt;a href=&quot;https://docs.gatling.io/tutorials/faq/&quot;&gt;FAQ&lt;/a&gt; précise que la Community Edition ne prend pas en charge les tests distribués et que les simulations passent sur Enterprise sans modification (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, l&amp;#39;éditeur de ce site, n&amp;#39;exécute pas de simulations Gatling. Il &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-load-testing&quot;&gt;exécute des plans de test JMeter et des scripts k6&lt;/a&gt; depuis 25 régions cloud ; pour Gatling, la voie vers davantage de machines reste donc Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Quels sont les points forts de Gatling, et ses limites ?&lt;/h2&gt;
&lt;p&gt;Gatling brille par ses tests sous forme de code relisible, ses modèles de charge et ses rapports sans configuration. Il est plus faible sur les protocoles au-delà du web et de la messagerie, et pour monter gratuitement au-delà d&amp;#39;une machine.&lt;/p&gt;
&lt;p&gt;Le README met en avant son moteur : non bloquant, construit sur Netty, où chaque utilisateur virtuel est un message léger. Les limites que la documentation énonce elle-même (vérifié le 9 octobre 2026) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gatling n&amp;#39;est pas un navigateur : selon la &lt;a href=&quot;https://docs.gatling.io/reference/script/http/protocol/&quot;&gt;page du protocole HTTP&lt;/a&gt;, il n&amp;#39;exécute pas de JavaScript.&lt;/li&gt;
&lt;li&gt;Le SDK JavaScript n&amp;#39;a pas de &lt;a href=&quot;https://docs.gatling.io/reference/script/jms/&quot;&gt;JMS&lt;/a&gt; et ne peut pas utiliser de bibliothèques npm qui exigent des binaires natifs ou des API propres à Node.js.&lt;/li&gt;
&lt;li&gt;Le cache HTTP est activé par défaut, ce qui peut réduire le nombre de requêtes.&lt;/li&gt;
&lt;li&gt;Le format de &lt;code&gt;simulation.log&lt;/code&gt; n&amp;#39;est pas documenté et peut changer à tout moment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quand choisir plutôt k6, JMeter ou Locust ?&lt;/h2&gt;
&lt;p&gt;Choisissez un autre outil quand son langage, ses protocoles ou sa voie gratuite vers la montée en échelle conviennent mieux à votre équipe.&lt;/p&gt;
&lt;p&gt;Notre panorama des &lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;outils de test de charge open source&lt;/a&gt; place Gatling à côté de cinq autres.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;k6&lt;/strong&gt; si vous voulez en CI &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;un seul binaire&lt;/a&gt; sans JVM, des &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; capables d&amp;#39;arrêter tôt une exécution en échec, ou gRPC parmi ses &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;protocoles intégrés&lt;/a&gt; (vérifié le 9 octobre 2026). &lt;a href=&quot;https://loadtest.app/fr/gatling-vs-k6/&quot;&gt;Gatling vs k6&lt;/a&gt; compare les deux.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;JMeter&lt;/strong&gt; si vos testeurs construisent leurs tests dans une interface graphique, ou si vous avez besoin de JDBC, LDAP ou FTP dans son &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;cœur&lt;/a&gt; (vérifié le 9 octobre 2026). LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-load-testing&quot;&gt;exécute vos plans de test JMeter existants&lt;/a&gt; depuis 25 régions cloud, et &lt;a href=&quot;https://loadtest.app/fr/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter&lt;/a&gt; va plus loin.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;Locust&lt;/strong&gt; si votre équipe écrit en Python et veut un &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;mode distribué&lt;/a&gt; dans l&amp;#39;outil gratuit (vérifié le 9 octobre 2026). Notre &lt;a href=&quot;https://loadtest.app/fr/locust-load-testing/&quot;&gt;revue de Locust&lt;/a&gt; le présente.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Gatling est-il gratuit pour un usage commercial ?&lt;/strong&gt;
Oui. La Community Edition est sous Apache 2.0. Les plugins gRPC, MQTT et GraphQL ont leur propre licence et s&amp;#39;arrêtent à 5 utilisateurs et 5 minutes hors de Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faut-il Java pour utiliser Gatling ?&lt;/strong&gt;
Pour Java, Kotlin ou Scala, oui : un OpenJDK LTS 64 bits de 11 à 25. Le SDK JavaScript demande Node.js 24 ou plus récent, et sa CLI télécharge elle-même l&amp;#39;environnement JVM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des tests Gatling ?&lt;/strong&gt;
Non. LoadFocus exécute des plans de test JMeter et des scripts k6. Pour répartir une simulation Gatling sur plusieurs machines, utilisez Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter : du code ou un plan de test graphique ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-k6/&quot;&gt;Gatling vs k6 : simulations JVM ou un seul binaire Go ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;Outils de test de charge open source : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-locust/&quot;&gt;Gatling vs Locust : simulations JVM ou locustfiles Python ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/nbomber-load-testing/&quot;&gt;Test de charge NBomber : le framework .NET passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs JMeter : du code ou un plan de test graphique ?</title><link>https://loadtest.app/fr/gatling-vs-jmeter/</link><guid isPermaLink="true">https://loadtest.app/fr/gatling-vs-jmeter/</guid><description>Gatling et JMeter comparés : licence, scripts, protocoles, enregistreurs, modèles de charge, mise à l&apos;échelle, CI et rapports, avec des conseils clairs.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Gatling et Apache JMeter sont deux outils de test de charge gratuits et open source qui tournent sur la JVM, et le choix dépend surtout de la façon dont votre équipe veut construire ses tests. Choisissez Gatling si vous voulez des tests sous forme de code en Java, Kotlin, Scala, JavaScript ou TypeScript, des profils d&amp;#39;injection ouverts et un rapport HTML après chaque exécution. Choisissez JMeter si vous avez besoin de protocoles comme JDBC, LDAP, FTP ou le mail sans rien ajouter, si vous préférez construire vos tests dans une interface graphique, ou si vous avez déjà des plans de test &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Les informations de ce comparatif Gatling vs JMeter viennent de la documentation et du dépôt de chaque projet, vérifiées le 9 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;th&gt;Apache JMeter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;Apache 2.0 ; gRPC, MQTT et GraphQL sous une licence de composant distincte (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Apache 2.0 (&lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environnement d&amp;#39;exécution&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS 11 à 25 (version 3.16.0)&lt;/td&gt;
&lt;td&gt;JVM, Java 8 ou plus récent (version 5.6.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests écrits en&lt;/td&gt;
&lt;td&gt;Code Java, Kotlin, Scala, JavaScript ou TypeScript&lt;/td&gt;
&lt;td&gt;Plans de test construits dans une interface graphique, enregistrés en XML (&lt;code&gt;.jmx&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocoles intégrés&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events, JMS&lt;/td&gt;
&lt;td&gt;HTTP(S), SOAP/REST, FTP, JDBC, LDAP, JMS, mail, TCP, commandes shell, objets Java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enregistreur&lt;/td&gt;
&lt;td&gt;Proxy HTTP ou convertisseur de fichiers HAR&lt;/td&gt;
&lt;td&gt;HTTP(S) Test Script Recorder (proxy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modèle de charge&lt;/td&gt;
&lt;td&gt;Profils d&amp;#39;injection ouverts ou fermés&lt;/td&gt;
&lt;td&gt;Thread Groups ; un Open Model Thread Group expérimental&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mise à l&amp;#39;échelle&lt;/td&gt;
&lt;td&gt;Une seule machine ; l&amp;#39;exécution distribuée demande Gatling Enterprise&lt;/td&gt;
&lt;td&gt;Mode distant intégré, un client qui pilote plusieurs serveurs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI et exécution sans interface&lt;/td&gt;
&lt;td&gt;Plugins Maven, Gradle, sbt et npm ; une assertion en échec fait échouer l&amp;#39;exécution&lt;/td&gt;
&lt;td&gt;Mode CLI (&lt;code&gt;jmeter -n&lt;/code&gt;) ; plugins tiers pour Maven, Gradle et Jenkins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rapports&lt;/td&gt;
&lt;td&gt;Rapport HTML après chaque exécution&lt;/td&gt;
&lt;td&gt;Tableau de bord HTML ; résultats en direct via un Backend Listener&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelle est la différence entre Gatling et JMeter ?&lt;/h2&gt;
&lt;p&gt;Dans Gatling, un test est un programme dans un projet de build. Dans JMeter, un test est un arbre d&amp;#39;éléments que vous assemblez dans une interface graphique de bureau puis enregistrez dans un fichier XML, et la plupart des autres différences en découlent.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; de Gatling appelle les tests des simulations et les range dans votre dépôt comme du code applicatif, exécutés via un plugin Maven, Gradle, sbt ou npm. Le &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;SDK JavaScript et TypeScript&lt;/a&gt; s&amp;#39;installe avec npm et télécharge son propre environnement GraalVM.&lt;/p&gt;
&lt;p&gt;Un plan JMeter contient un Thread Group pour les utilisateurs, des samplers pour les requêtes, des assertions et des listeners pour les résultats. JMeter 5.6.3, la version actuelle sur la &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;page de téléchargement&lt;/a&gt;, demande Java 8 ou plus récent. Le README de la &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/README.md&quot;&gt;branche de développement&lt;/a&gt; de JMeter exige déjà Java 17 (vérifié le 10 octobre 2026). Sous le capot, JMeter exécute chaque utilisateur virtuel dans un thread Java, tandis que le README de Gatling décrit les utilisateurs virtuels comme des messages légers sur un moteur non bloquant construit sur Netty.&lt;/p&gt;
&lt;h2&gt;Comment écrit-on un test avec chaque outil ?&lt;/h2&gt;
&lt;p&gt;Dans Gatling, vous écrivez une classe de simulation qui définit un scénario, un profil d&amp;#39;injection et des assertions. Dans JMeter, vous ajoutez un Thread Group et des samplers dans l&amp;#39;interface graphique, vous enregistrez le plan puis vous le lancez en ligne de commande.&lt;/p&gt;
&lt;p&gt;Une simulation Java inspirée du &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/java-jvm/running-your-first-simulation/&quot;&gt;tutoriel de première simulation&lt;/a&gt; de Gatling : les nouveaux utilisateurs arrivent d&amp;#39;abord à un par seconde, passent à dix par seconde en une minute, puis restent à ce rythme pendant cinq minutes. L&amp;#39;exécution échoue si le 95e percentile dépasse 500 ms ou si plus de 1 % des requêtes échouent :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.*;

import io.gatling.javaapi.core.*;
import io.gatling.javaapi.http.*;

public class ApiSimulation extends Simulation {

  HttpProtocolBuilder httpProtocol =
      http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  ScenarioBuilder users = scenario(&amp;quot;API users&amp;quot;)
      .exec(http(&amp;quot;list users&amp;quot;).get(&amp;quot;/api/users&amp;quot;))
      .pause(1);

  {
    setUp(users.injectOpen(
            rampUsersPerSec(1).to(10).during(60),
            constantUsersPerSec(10).during(300)))
        .protocols(httpProtocol)
        .assertions(
            global().responseTime().percentile(95.0).lt(500),
            global().failedRequests().percent().lt(1.0));
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lancez-la avec &lt;code&gt;./mvnw gatling:test&lt;/code&gt; ; une simulation JavaScript ou TypeScript se lance avec &lt;code&gt;npx gatling run&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dans JMeter, le même test est un Thread Group qui contient un sampler HTTP Request, et une Duration Assertion peut marquer en échec chaque réponse trop lente. Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;guide de démarrage&lt;/a&gt; construit le plan en mode GUI et l&amp;#39;exécute en mode CLI, et &lt;code&gt;-e -o&lt;/code&gt; ajoute le rapport HTML :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;jmeter -n -t api-users.jmx -l results.jtl -e -o report/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les deux outils peuvent enregistrer un premier jet depuis un navigateur. Le &lt;a href=&quot;https://docs.gatling.io/reference/script/http/recorder/&quot;&gt;Recorder&lt;/a&gt; de Gatling fonctionne comme un proxy HTTP ou convertit un fichier HAR en simulation, et le &lt;a href=&quot;https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html&quot;&gt;HTTP(S) Test Script Recorder&lt;/a&gt; de JMeter capture le trafic du navigateur dans un plan (vérifié le 9 octobre 2026). La documentation de Gatling qualifie désormais ce Recorder de legacy, et le plus récent &lt;a href=&quot;https://docs.gatling.io/tutorials/low-code/browser/studio/&quot;&gt;Gatling Studio&lt;/a&gt; exige un compte Enterprise pour se connecter (vérifié le 10 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quels protocoles chaque outil peut-il tester ?&lt;/h2&gt;
&lt;p&gt;JMeter couvre davantage de protocoles en standard. Gatling fournit les principaux protocoles web plus JMS, et confie l&amp;#39;essentiel du reste à des composants séparés ou à des plugins communautaires.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt; de JMeter liste tous les protocoles du tableau ci-dessus, mail compris. JDBC et JMS demandent les fichiers JAR du pilote fournis par votre base de données ou votre fournisseur JMS, et le &lt;a href=&quot;https://jmeter-plugins.org/install/Install/&quot;&gt;Plugins Manager&lt;/a&gt; installe des plugins communautaires depuis l&amp;#39;interface graphique.&lt;/p&gt;
&lt;p&gt;D&amp;#39;après le README de Gatling, gRPC, MQTT et GraphQL sont des composants séparés sous la Gatling Enterprise Component License, limités sans Enterprise à cinq utilisateurs simultanés et à des tests de cinq minutes. Kafka, AMQP, SFTP, FTP et JDBC passent par des &lt;a href=&quot;https://docs.gatling.io/reference/script/third-parties/&quot;&gt;plugins tiers&lt;/a&gt; pour Gatling 3.13 que Gatling ne maintient pas (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment Gatling et JMeter modélisent-ils la charge ?&lt;/h2&gt;
&lt;p&gt;Gatling vous fait choisir entre un modèle ouvert et un modèle fermé dans le script lui-même. Le Thread Group classique de JMeter est un pool fermé d&amp;#39;utilisateurs, et une charge fondée sur les arrivées demande le plus récent Open Model Thread Group.&lt;/p&gt;
&lt;p&gt;Dans Gatling, &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; accepte des taux d&amp;#39;arrivée comme &lt;code&gt;constantUsersPerSec&lt;/code&gt; et &lt;code&gt;rampUsersPerSec&lt;/code&gt;, et &lt;code&gt;injectClosed&lt;/code&gt; des cibles de concurrence comme &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. JMeter 5.5 a ajouté l&amp;#39;&lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Open_Model_Thread_Group&quot;&gt;Open Model Thread Group&lt;/a&gt;, que la référence marque toujours comme expérimental (vérifié le 9 octobre 2026). Notre guide sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique pourquoi ce choix compte.&lt;/p&gt;
&lt;h2&gt;Comment répartir un test sur plusieurs machines ?&lt;/h2&gt;
&lt;p&gt;JMeter intègre un mode distribué. L&amp;#39;édition open source de Gatling génère la charge depuis une seule machine, et sa documentation indique qu&amp;#39;il faut un compte Gatling Enterprise pour l&amp;#39;exécution distribuée.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;mode de test distant&lt;/a&gt; de JMeter permet à un client de piloter autant de serveurs que nécessaire. Chaque serveur exécute le plan entier : 1 000 threads sur six serveurs donnent donc 6 000 threads. Tous les nœuds devraient utiliser la même version de JMeter et de Java, RMI a besoin d&amp;#39;un keystore sauf si SSL est désactivé, et les fichiers de données doivent être copiés sur chaque serveur.&lt;/p&gt;
&lt;p&gt;Il existe une troisième voie pour les plans de test JMeter. LoadFocus, l&amp;#39;éditeur de ce site, &lt;a href=&quot;https://loadfocus.com/fr-fr/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-jmeter&quot;&gt;exécute vos plans de test JMeter existants&lt;/a&gt; sans modification depuis 25 régions cloud, sans serveur distant à configurer. LoadFocus n&amp;#39;exécute pas de simulations Gatling.&lt;/p&gt;
&lt;h2&gt;Comment s&amp;#39;intègrent-ils à la CI, et quels rapports obtient-on ?&lt;/h2&gt;
&lt;p&gt;Les deux tournent sans interface. Les assertions de Gatling peuvent faire échouer le build directement, alors que celles de JMeter signalent des échantillons isolés et que l&amp;#39;intégration CI passe par des bibliothèques tierces.&lt;/p&gt;
&lt;p&gt;Les &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; de Gatling sont vérifiées après l&amp;#39;exécution, et une seule assertion en échec fait échouer la simulation et la tâche de build. Le &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;rapport HTML&lt;/a&gt; montre les percentiles du temps de réponse, les utilisateurs démarrés par seconde, les utilisateurs simultanés et les requêtes par seconde au fil du temps.&lt;/p&gt;
&lt;p&gt;Le mode CLI de JMeter n&amp;#39;offre aucun critère de réussite : un objectif manqué ne fait échouer le build qu&amp;#39;à travers les bibliothèques pour Maven, Gradle et Jenkins que cite son README, ou une vérification de votre part. Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;tableau de bord&lt;/a&gt; de JMeter ajoute une table APDEX, une table de statistiques avec trois percentiles configurables et des synthèses d&amp;#39;erreurs, et un Backend Listener envoie les résultats en direct vers InfluxDB ou Graphite.&lt;/p&gt;
&lt;h2&gt;Lequel choisir ?&lt;/h2&gt;
&lt;p&gt;Choisissez Gatling si votre équipe écrit du Java, du Kotlin, du Scala ou du TypeScript et veut relire ses tests de charge comme le reste de son code. Choisissez plutôt JMeter si vous avez besoin de protocoles au-delà du web, si vos testeurs préfèrent une interface graphique, ou si vous avez déjà des plans &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Gatling convient aux équipes qui décrivent le trafic en taux d&amp;#39;arrivée et veulent des règles de réussite ou d&amp;#39;échec à côté du scénario, avec un rapport lisible sans configuration supplémentaire.&lt;/p&gt;
&lt;p&gt;JMeter est le meilleur choix pour tester JDBC, LDAP, FTP ou le mail, pour les testeurs qui affinent visuellement un parcours enregistré, et pour l&amp;#39;exécution distribuée sur vos propres serveurs sans licence commerciale. Une entreprise qui utilise déjà JMeter conserve aussi ses plans, ses plugins et son savoir-faire.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Gatling est-il plus rapide que JMeter ?&lt;/strong&gt;
Nous ne l&amp;#39;avons pas mesuré nous-mêmes, nous ne désignerons donc pas de gagnant. La comparaison équitable consiste à lancer le même scénario avec les deux outils sur votre propre matériel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling peut-il exécuter des fichiers .jmx de JMeter ?&lt;/strong&gt;
Pas directement. Gatling exécute des simulations écrites avec ses SDK, donc un plan JMeter doit être réécrit. Le README de Gatling mentionne des extensions d&amp;#39;IA qui convertissent les plans de test JMeter, et elles demandent un jeton d&amp;#39;API Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des tests Gatling ?&lt;/strong&gt;
Non. LoadFocus exécute des plans de test JMeter et des scripts k6. Pour répartir une simulation Gatling sur plusieurs machines, utilisez Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-load-testing/&quot;&gt;Test de charge Gatling : l&amp;#39;outil JVM passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-k6/&quot;&gt;Gatling vs k6 : simulations JVM ou un seul binaire Go ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-vs-jmeter/&quot;&gt;Locust vs JMeter : scripts Python ou plans de test JMeter ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery : quel outil de test de charge choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-locust/&quot;&gt;Gatling vs Locust : simulations JVM ou locustfiles Python ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/jmeter-vs-postman/&quot;&gt;JMeter vs Postman : quel outil pour tester la charge ?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs k6 : simulations JVM ou un seul binaire Go ?</title><link>https://loadtest.app/fr/gatling-vs-k6/</link><guid isPermaLink="true">https://loadtest.app/fr/gatling-vs-k6/</guid><description>Gatling vs k6 comparés : licence, exécution, langages, protocoles, modèles de charge, critères de réussite, montée en charge, et quand choisir chacun.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Gatling et k6 sont deux outils open source qui gardent les tests de charge sous forme de code dans votre dépôt, et l&amp;#39;un comme l&amp;#39;autre testera correctement une API HTTP sous charge. Choisissez Gatling si votre équipe travaille en Java, Kotlin ou Scala, ou veut un rapport HTML après chaque exécution sans rien configurer. Choisissez k6 si vous voulez un seul binaire Go sans JVM, le gRPC et les tests navigateur dès l&amp;#39;installation, et des seuils capables d&amp;#39;arrêter tôt une exécution qui échoue.&lt;/p&gt;
&lt;p&gt;Les informations de ce comparatif Gatling vs k6 viennent de la documentation et du dépôt de chaque projet, vérifiées le 9 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;th&gt;k6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;Apache 2.0 ; gRPC, MQTT et GraphQL sous une licence de composant distincte (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environnement d&amp;#39;exécution&lt;/td&gt;
&lt;td&gt;JVM ; le SDK Java demande OpenJDK LTS 11 à 25 (version 3.16.0)&lt;/td&gt;
&lt;td&gt;Un binaire Go avec un moteur JavaScript intégré (version v2.3.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de test&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript ou TypeScript&lt;/td&gt;
&lt;td&gt;JavaScript, ou TypeScript sans vérification des types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocoles principaux&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events, JMS&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSockets, gRPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modèle de charge&lt;/td&gt;
&lt;td&gt;Profils d&amp;#39;injection ouverts ou fermés&lt;/td&gt;
&lt;td&gt;Six executors, dont deux à taux d&amp;#39;arrivée (modèle ouvert)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critères de réussite&lt;/td&gt;
&lt;td&gt;Assertions, vérifiées après l&amp;#39;exécution&lt;/td&gt;
&lt;td&gt;Thresholds, qui peuvent aussi interrompre une exécution en cours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rapports&lt;/td&gt;
&lt;td&gt;Rapport HTML après chaque exécution&lt;/td&gt;
&lt;td&gt;Résumé en fin de test ; tableau de bord web avec export HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests navigateur&lt;/td&gt;
&lt;td&gt;Rien d&amp;#39;intégré ; le Recorder transforme le trafic du navigateur en code&lt;/td&gt;
&lt;td&gt;Module navigateur intégré (pilote un navigateur basé sur Chromium)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Montée en charge distribuée&lt;/td&gt;
&lt;td&gt;Gatling Enterprise&lt;/td&gt;
&lt;td&gt;k6-operator sur Kubernetes, ou Grafana Cloud k6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelle est la différence entre Gatling et k6 ?&lt;/h2&gt;
&lt;p&gt;La plus grande différence tient à l&amp;#39;environnement d&amp;#39;exécution. Gatling tourne sur la JVM et vous écrivez les tests avec l&amp;#39;un de ses SDK, alors que k6 est un programme Go compilé unique qui exécute du JavaScript.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; de Gatling cite un SDK Java pour Java, Kotlin et Scala, lancé par un plugin Maven, Gradle ou sbt. Son &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;SDK JavaScript et TypeScript&lt;/a&gt; s&amp;#39;installe avec npm, et son outil en ligne de commande télécharge GraalVM : même une simulation JavaScript tourne donc sur une JVM.&lt;/p&gt;
&lt;p&gt;k6 s&amp;#39;installe sous forme de &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;paquet ou de binaire autonome&lt;/a&gt;, sans autre environnement d&amp;#39;exécution. Il exécute aussi directement les fichiers &lt;code&gt;.ts&lt;/code&gt;, et sa &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/javascript-typescript-compatibility-mode/&quot;&gt;prise en charge de TypeScript&lt;/a&gt; retire les types sans les vérifier (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment écrire le même test dans chaque outil ?&lt;/h2&gt;
&lt;p&gt;Les deux outils peuvent exprimer le même test en JavaScript. Gatling parle de simulation et décrit la charge par un profil d&amp;#39;injection, k6 parle de script et la décrit par un scénario doté d&amp;#39;un executor.&lt;/p&gt;
&lt;p&gt;Voici un test où dix nouveaux utilisateurs arrivent chaque seconde pendant cinq minutes, et qui échoue si le 95e percentile dépasse 500 ms ou si plus de 1 % des requêtes échouent. Avec le SDK JavaScript de Gatling, sur le modèle de son &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/javascript/running-your-first-simulation/&quot;&gt;tutoriel de première simulation&lt;/a&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import {
  constantUsersPerSec, global, scenario, simulation,
} from &amp;quot;@gatling.io/core&amp;quot;;
import { http } from &amp;quot;@gatling.io/http&amp;quot;;

export default simulation((setUp) =&amp;gt; {
  const api = http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  const users = scenario(&amp;quot;API users&amp;quot;)
    .exec(http(&amp;quot;list users&amp;quot;).get(&amp;quot;/api/users&amp;quot;));

  setUp(users.injectOpen(constantUsersPerSec(10).during(300)))
    .protocols(api)
    .assertions(
      global().responseTime().percentile(95).lt(500),
      global().failedRequests().percent().lt(1),
    );
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le même test dans k6, avec l&amp;#39;&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;executor constant-arrival-rate&lt;/a&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;

export const options = {
  scenarios: {
    api_users: {
      executor: &amp;quot;constant-arrival-rate&amp;quot;,
      rate: 10,
      timeUnit: &amp;quot;1s&amp;quot;,
      duration: &amp;quot;5m&amp;quot;,
      preAllocatedVUs: 50,
    },
  },
  thresholds: {
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
  },
};

export default function () {
  http.get(&amp;quot;https://staging.example.com/api/users&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lancez-les avec &lt;code&gt;npx gatling run&lt;/code&gt; et &lt;code&gt;k6 run script.js&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Comment Gatling et k6 modélisent-ils la charge ?&lt;/h2&gt;
&lt;p&gt;Les deux prennent en charge les modèles de charge ouvert et fermé. Dans Gatling, le choix passe par la méthode d&amp;#39;injection que vous appelez, dans k6 par l&amp;#39;executor que vous retenez.&lt;/p&gt;
&lt;p&gt;Dans Gatling, &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; prend des taux d&amp;#39;arrivée comme &lt;code&gt;constantUsersPerSec&lt;/code&gt;, et &lt;code&gt;injectClosed&lt;/code&gt; des objectifs de concurrence comme &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. k6 propose &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;six executors&lt;/a&gt; : les deux à taux d&amp;#39;arrivée suivent le modèle ouvert, les quatre autres le modèle fermé, où un utilisateur virtuel ne lance sa prochaine itération qu&amp;#39;une fois la précédente terminée.&lt;/p&gt;
&lt;p&gt;Un scénario k6 à taux d&amp;#39;arrivée lance ses itérations depuis un pool d&amp;#39;utilisateurs virtuels préalloués, et quand ce pool est épuisé, k6 saute des itérations et les compte comme &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;itérations abandonnées&lt;/a&gt; (vérifié le 9 octobre 2026). Notre guide sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique quand choisir l&amp;#39;un ou l&amp;#39;autre.&lt;/p&gt;
&lt;h2&gt;Comment Gatling et k6 décident-ils si un test a réussi ?&lt;/h2&gt;
&lt;p&gt;Les deux transforment des objectifs de performance en un verdict, réussite ou échec, qu&amp;#39;un pipeline CI peut exploiter. Gatling vérifie ses objectifs une fois l&amp;#39;exécution terminée, et k6 peut en plus arrêter une exécution dès qu&amp;#39;un objectif est manqué.&lt;/p&gt;
&lt;p&gt;Les &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; de Gatling sont évaluées après la simulation, et une seule assertion en échec fait échouer la simulation et le build. Les &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; de k6 terminent une exécution en échec avec un code de sortie non nul, et un threshold réglé avec &lt;code&gt;abortOnFail&lt;/code&gt; arrête le test dès qu&amp;#39;il échoue (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quels protocoles et quels tests navigateur chaque outil couvre-t-il ?&lt;/h2&gt;
&lt;p&gt;Les deux gèrent HTTP et WebSockets dès l&amp;#39;installation. Gatling y ajoute Server-Sent Events et JMS, et k6 le gRPC et de vraies sessions de navigateur.&lt;/p&gt;
&lt;p&gt;Selon le README de Gatling, gRPC, MQTT et GraphQL sont des composants distincts sous la Gatling Enterprise Component License, limités sans Enterprise à cinq utilisateurs simultanés et à des tests de cinq minutes. k6 cite HTTP/1.1, HTTP/2, WebSockets et gRPC comme &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;protocoles intégrés&lt;/a&gt;, et d&amp;#39;autres s&amp;#39;ajoutent via des extensions xk6 comme Kafka et Redis.&lt;/p&gt;
&lt;p&gt;Pour les tests navigateur, k6 dispose d&amp;#39;un &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6-browser/&quot;&gt;module navigateur&lt;/a&gt; qui pilote un navigateur basé sur Chromium et collecte des métriques côté frontend. La documentation de Gatling ne décrit aucun moteur de navigateur : le &lt;a href=&quot;https://docs.gatling.io/reference/script/http/recorder/&quot;&gt;Recorder&lt;/a&gt; de Gatling transforme une session de navigateur ou un fichier HAR en simulation au niveau HTTP (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment lancer un test plus gros que ce qu&amp;#39;une machine peut générer ?&lt;/h2&gt;
&lt;p&gt;L&amp;#39;édition open source de Gatling génère la charge depuis une seule machine, et l&amp;#39;exécution distribuée demande Gatling Enterprise. k6 peut répartir un test sur un cluster Kubernetes avec le k6-operator open source, ou le lancer sur Grafana Cloud k6.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/java-jvm/installation-guide/&quot;&gt;guide d&amp;#39;installation&lt;/a&gt; de Gatling demande un compte Enterprise pour l&amp;#39;exécution distribuée, qui s&amp;#39;appuie sur des générateurs de charge gérés ou sur des emplacements privés dans votre propre compte AWS, Azure, GCP ou Kubernetes. Le &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; répartit un test sur plusieurs instances k6 dans un cluster (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;Il existe une troisième voie pour les scripts k6. LoadFocus, l&amp;#39;éditeur de ce site, &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-k6&quot;&gt;exécute les scripts k6&lt;/a&gt; sur sa propre infrastructure cloud depuis 25 régions, avec le nombre d&amp;#39;utilisateurs et la durée pris dans les réglages du test. Son validateur de script prévient que les scénarios à taux d&amp;#39;arrivée y tournent avec un nombre fixe d&amp;#39;utilisateurs : un script en modèle ouvert comme celui ci-dessus ne tient donc pas son taux d&amp;#39;arrivée sur LoadFocus. LoadFocus n&amp;#39;exécute pas les simulations Gatling : pour Gatling, la voie vers plus de machines reste Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Quels rapports obtenez-vous ?&lt;/h2&gt;
&lt;p&gt;Gatling écrit un rapport HTML après chaque exécution, sans configuration. k6 affiche un résumé dans le terminal et peut produire un rapport HTML depuis son tableau de bord web intégré.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;rapport HTML&lt;/a&gt; de Gatling trace les percentiles du temps de réponse, les utilisateurs lancés par seconde et les requêtes par seconde au fil du test. k6 affiche un &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/end-of-test/&quot;&gt;résumé de fin de test&lt;/a&gt;, et son &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/web-dashboard/&quot;&gt;tableau de bord web&lt;/a&gt; montre des graphiques en direct et exporte un rapport HTML autonome quand vous définissez &lt;code&gt;K6_WEB_DASHBOARD_EXPORT&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Lequel choisir ?&lt;/h2&gt;
&lt;p&gt;Gatling convient aux équipes qui vivent sur la JVM, et k6 à celles qui veulent un binaire unique et du JavaScript. Les protocoles, les tests navigateur et la montée en charge tranchent la plupart des autres cas.&lt;/p&gt;
&lt;p&gt;Choisissez Gatling plutôt que k6 si votre équipe vit sur la JVM et veut des tests en Java, Kotlin ou Scala construits avec Maven, Gradle ou sbt à côté du code de l&amp;#39;application, si vous avez besoin de JMS ou de Server-Sent Events, ou si vous voulez un rapport HTML après chaque exécution sans configuration.&lt;/p&gt;
&lt;p&gt;Choisissez k6 plutôt que Gatling si vous voulez un binaire unique en CI sans JVM à installer, si vos tests ont besoin de gRPC ou de vraies sessions de navigateur, si des thresholds doivent arrêter tôt une exécution qui échoue, ou si vous comptez monter en charge sur Kubernetes avec un operator open source.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Gatling est-il plus rapide que k6 ?&lt;/strong&gt;
Nous ne l&amp;#39;avons pas mesuré nous-mêmes, donc nous ne désignons pas de gagnant. La seule comparaison honnête consiste à lancer le même scénario avec les deux outils sur votre propre matériel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling peut-il exécuter des scripts k6 ?&lt;/strong&gt;
Pas d&amp;#39;après la documentation de Gatling, qui ne décrit aucun moyen d&amp;#39;exécuter des scripts k6. Les deux SDK ont des API différentes et les &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;convertisseurs&lt;/a&gt; de Gatling couvrent JMeter et LoadRunner : un script k6 doit donc être réécrit en simulation Gatling, même avec le SDK JavaScript.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des tests Gatling ?&lt;/strong&gt;
Non. LoadFocus exécute des scripts k6 et des plans de test JMeter. Pour répartir une simulation Gatling sur plusieurs machines, utilisez Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-load-testing/&quot;&gt;Test de charge Gatling : l&amp;#39;outil JVM passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery : quel outil de test de charge choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter : du code ou un plan de test graphique ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-locust/&quot;&gt;Gatling vs Locust : simulations JVM ou locustfiles Python ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/grpc-load-testing/&quot;&gt;Test de charge gRPC : outils, mise en place et mesures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Test de charge d&apos;une API GraphQL : guide pratique</title><link>https://loadtest.app/fr/how-to-load-test-a-graphql-api/</link><guid isPermaLink="true">https://loadtest.app/fr/how-to-load-test-a-graphql-api/</guid><description>Test de charge d&apos;une API GraphQL : nommer chaque opération, mêler lectures et mutations, repérer les erreurs derrière un HTTP 200, surveiller cache et N+1.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;Pour un test de charge d&amp;#39;une API GraphQL, scriptez les opérations que vos clients envoient vraiment, donnez à chacune son propre nom dans l&amp;#39;outil de test et mélangez-les dans les proportions observées en production, avec des variables variées. Vérifiez dans chaque corps de réponse la présence d&amp;#39;un tableau &lt;code&gt;errors&lt;/code&gt;, car un serveur GraphQL répond le plus souvent avec un statut HTTP 200 même quand une partie de l&amp;#39;opération a échoué. Augmentez ensuite la charge et jugez chaque opération sur ses propres percentiles.&lt;/p&gt;
&lt;p&gt;Sources : graphql.org, le brouillon de la spécification GraphQL over HTTP et la documentation de chaque outil, le tout vérifié le 9 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Nommer chaque opération avec&lt;/th&gt;
&lt;th&gt;Faire échouer une réponse qui contient &lt;code&gt;errors&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Alimenter les variables depuis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tags: { name: &amp;quot;...&amp;quot; }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Un &lt;code&gt;check()&lt;/code&gt; sur le corps analysé&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SharedArray&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Le nom du sampler&lt;/td&gt;
&lt;td&gt;Une JSON Assertion sur &lt;code&gt;$.errors&lt;/code&gt;, inversée&lt;/td&gt;
&lt;td&gt;CSV Data Set Config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http(&amp;quot;...&amp;quot;)&lt;/code&gt; ou le plugin GraphQL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jsonPath(&amp;quot;$.errors&amp;quot;).notExists()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Les feeders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;Un &lt;code&gt;name&lt;/code&gt; sur la requête&lt;/td&gt;
&lt;td&gt;&lt;code&gt;notHasProperty: &amp;quot;errors&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;config.payload&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Pourquoi une API GraphQL demande-t-elle un test de charge différent ?&lt;/h2&gt;
&lt;p&gt;Parce que toutes les opérations passent par une seule URL et que le travail derrière dépend du document GraphQL et de ses variables. Un rapport groupé par URL met dans le même panier une recherche coûteuse et une simple lecture.&lt;/p&gt;
&lt;p&gt;Le guide &lt;a href=&quot;https://graphql.org/learn/serving-over-http/&quot;&gt;Serving over HTTP&lt;/a&gt; de graphql.org indique qu&amp;#39;un serveur GraphQL fonctionne sur un seul endpoint, en général &lt;code&gt;/graphql&lt;/code&gt;. Les opérations y arrivent en POST, avec un corps JSON qui contient &lt;code&gt;query&lt;/code&gt;, un &lt;code&gt;operationName&lt;/code&gt; facultatif et &lt;code&gt;variables&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Comment obtenir des résultats par opération ?&lt;/h2&gt;
&lt;p&gt;Nommez chaque requête d&amp;#39;après son opération GraphQL et faites regrouper les statistiques par ce nom. Chaque outil a son propre réglage pour cela (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;k6&lt;/strong&gt; : le &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/tags-and-groups/&quot;&gt;guide sur les tags et les groupes&lt;/a&gt; conseille de définir &lt;code&gt;tags.name&lt;/code&gt; pour donner un nom parlant à une requête, et les &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; peuvent cibler un seul tag, par exemple &lt;code&gt;http_req_duration{name:GetProduct}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JMeter&lt;/strong&gt; : l&amp;#39;&lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Aggregate_Report&quot;&gt;Aggregate Report&lt;/a&gt; crée une ligne par requête portant un nom différent. Depuis JMeter 5.4, le sampler &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#HTTP_Request&quot;&gt;GraphQL HTTP Request&lt;/a&gt; a des champs Query, Variables et Operation Name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gatling&lt;/strong&gt; : le &lt;a href=&quot;https://docs.gatling.io/reference/script/http/request/&quot;&gt;nom de la requête&lt;/a&gt; sert de clé à ses statistiques, et le &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/requests/&quot;&gt;plugin GraphQL&lt;/a&gt; nomme les requêtes d&amp;#39;après l&amp;#39;opération, par exemple &lt;code&gt;query GetUser&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Artillery&lt;/strong&gt; : le &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/metrics-by-endpoint&quot;&gt;plugin metrics-by-endpoint&lt;/a&gt; rapporte les résultats par URL et ajoute à chaque entrée le &lt;code&gt;name&lt;/code&gt; de la requête, si bien que les opérations nommées apparaissent séparément ; &lt;code&gt;useOnlyRequestNames: true&lt;/code&gt; retire l&amp;#39;URL et ne garde que le nom.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quelles opérations le test doit-il envoyer ?&lt;/h2&gt;
&lt;p&gt;Celles que reçoit la production, dans les mêmes proportions. Relevez le nombre de chaque opération dans vos logs serveur ou votre monitoring GraphQL et transformez-le en un mélange pondéré de lectures et de mutations.&lt;/p&gt;
&lt;p&gt;Utilisez les documents que vos clients embarquent, avec leur vraie profondeur, plutôt qu&amp;#39;un seul document simplifié. Alimentez les variables depuis un fichier, pour que le serveur cherche beaucoup d&amp;#39;enregistrements différents au lieu de renvoyer un seul résultat en cache. Gardez aussi un nombre réaliste d&amp;#39;opérations distinctes : la &lt;a href=&quot;https://www.apollographql.com/docs/technotes/TN0035-load-testing-graphql&quot;&gt;note technique d&amp;#39;Apollo sur le test de charge GraphQL&lt;/a&gt;, un document du fournisseur, explique que chaque nouvelle opération est analysée et validée avant d&amp;#39;être exécutée, et déconseille de générer bien plus d&amp;#39;opérations uniques que n&amp;#39;en envoient les vrais clients.&lt;/p&gt;
&lt;p&gt;Les mutations modifient les données : lancez-les là où vous pouvez les réinitialiser. Le &lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;guide pas à pas du test de charge&lt;/a&gt; couvre les objectifs et la montée en charge.&lt;/p&gt;
&lt;h2&gt;Pourquoi une réponse HTTP 200 peut-elle quand même être un échec ?&lt;/h2&gt;
&lt;p&gt;Parce que GraphQL signale les erreurs dans le corps de la réponse. Une requête peut renvoyer le statut 200 avec un tableau &lt;code&gt;errors&lt;/code&gt; et des données partielles, et un contrôle du statut la laisse passer.&lt;/p&gt;
&lt;p&gt;La page &lt;a href=&quot;https://graphql.org/learn/response/&quot;&gt;Response&lt;/a&gt; de graphql.org explique que, quand un resolver échoue, l&amp;#39;exécution continue et la réponse contient &lt;code&gt;data&lt;/code&gt; à côté de &lt;code&gt;errors&lt;/code&gt;. Son guide HTTP ajoute qu&amp;#39;une telle réponse doit tout de même recevoir un statut 2xx, faute de code HTTP pour un succès partiel, et que certains anciens serveurs répondent 2xx même pour des erreurs de validation. Le &lt;a href=&quot;https://graphql.github.io/graphql-over-http/draft/&quot;&gt;brouillon GraphQL over HTTP&lt;/a&gt; propose un statut spécifique 294 pour le succès partiel avec le type de média plus récent &lt;code&gt;application/graphql-response+json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dans un test de charge, c&amp;#39;est doublement trompeur. Les erreurs ne sont pas comptées, et les requêtes qui échouent vite, comme des opérations refusées par une limite de profondeur, tirent les temps de réponse vers le bas.&lt;/p&gt;
&lt;h2&gt;Comment vérifier le tableau errors dans chaque outil ?&lt;/h2&gt;
&lt;p&gt;Analysez le corps JSON et faites échouer la requête quand &lt;code&gt;errors&lt;/code&gt; est présent. Chaque outil a un moyen intégré de le faire.&lt;/p&gt;
&lt;p&gt;Dans k6, un check sur le corps analysé s&amp;#39;en charge, et un threshold sur la métrique &lt;code&gt;checks&lt;/code&gt; fait échouer l&amp;#39;exécution, car &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;les checks seuls ne changent pas le code de sortie de k6&lt;/a&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { check, sleep } from &amp;quot;k6&amp;quot;;
import { SharedArray } from &amp;quot;k6/data&amp;quot;;

const URL = &amp;quot;https://staging.example.com/graphql&amp;quot;;
const ids = new SharedArray(&amp;quot;ids&amp;quot;, () =&amp;gt;
  JSON.parse(open(&amp;quot;./product-ids.json&amp;quot;)));
const QUERY = `query GetProduct($id: ID!) {
  product(id: $id) { id name price }
}`;

export const options = {
  vus: 20,
  duration: &amp;quot;5m&amp;quot;,
  thresholds: {
    checks: [&amp;quot;rate&amp;gt;0.99&amp;quot;],
    &amp;quot;http_req_duration{name:GetProduct}&amp;quot;: [&amp;quot;p(95)&amp;lt;400&amp;quot;],
  },
};

function parse(res) {
  try { return res.json(); } catch (e) { return null; }
}

export default function () {
  const id = ids[Math.floor(Math.random() * ids.length)];
  const payload = JSON.stringify({
    query: QUERY,
    operationName: &amp;quot;GetProduct&amp;quot;,
    variables: { id: id },
  });
  const res = http.post(URL, payload, {
    headers: { &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot; },
    tags: { name: &amp;quot;GetProduct&amp;quot; },
  });
  const body = parse(res);
  check(res, {
    &amp;quot;status is 2xx&amp;quot;: (r) =&amp;gt; r.status &amp;gt;= 200 &amp;amp;&amp;amp; r.status &amp;lt; 300,
    &amp;quot;no GraphQL errors&amp;quot;: () =&amp;gt; body !== null &amp;amp;&amp;amp; !body.errors,
  });
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-data/sharedarray/&quot;&gt;&lt;code&gt;SharedArray&lt;/code&gt;&lt;/a&gt; charge les identifiants une seule fois pour tous les utilisateurs virtuels. Le &lt;code&gt;try&lt;/code&gt; évite qu&amp;#39;un corps qui n&amp;#39;est pas du JSON, comme la page d&amp;#39;erreur d&amp;#39;un proxy, interrompe l&amp;#39;itération.&lt;/p&gt;
&lt;p&gt;Dans &lt;strong&gt;JMeter&lt;/strong&gt;, ajoutez une &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#JSON_Assertion&quot;&gt;JSON Assertion&lt;/a&gt; avec le chemin &lt;code&gt;$.errors&lt;/code&gt; et cochez &amp;quot;Invert assertion&amp;quot;, pour que l&amp;#39;échantillon échoue quand le chemin existe. Un &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#JSON_Extractor&quot;&gt;JSON Extractor&lt;/a&gt; copie des identifiants dans des variables pour l&amp;#39;opération suivante.&lt;/p&gt;
&lt;p&gt;Dans &lt;strong&gt;Gatling&lt;/strong&gt;, ajoutez &lt;code&gt;.check(jsonPath(&amp;quot;$.errors&amp;quot;).notExists())&lt;/code&gt;, deux éléments tirés de sa &lt;a href=&quot;https://docs.gatling.io/concepts/checks/&quot;&gt;référence des checks&lt;/a&gt;. Le plugin GraphQL vérifie le statut et les erreurs par défaut, mais sa &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/setup/&quot;&gt;page d&amp;#39;installation&lt;/a&gt; limite les exécutions avec la Community Edition à 5 utilisateurs et 5 minutes (vérifié le 9 octobre 2026). Pour des tests plus gros sans Gatling Enterprise, utilisez des requêtes HTTP classiques avec ce check.&lt;/p&gt;
&lt;p&gt;Dans &lt;strong&gt;Artillery&lt;/strong&gt;, le &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/expect&quot;&gt;plugin expect&lt;/a&gt; propose &lt;code&gt;notHasProperty: &amp;quot;errors&amp;quot;&lt;/code&gt;, et &lt;code&gt;reportFailuresAsErrors: true&lt;/code&gt; fait apparaître les attentes non remplies dans le rapport. Un &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/http&quot;&gt;&lt;code&gt;capture&lt;/code&gt;&lt;/a&gt; avec un chemin &lt;code&gt;json&lt;/code&gt; transmet une valeur à la requête suivante.&lt;/p&gt;
&lt;h2&gt;Que surveiller en plus des temps de réponse ?&lt;/h2&gt;
&lt;p&gt;Le cache, les requêtes persistées et la charge de la base de données par requête HTTP. Chacun peut rendre un test plus rapide ou plus lent que la production pour des raisons sans rapport avec la capacité.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://graphql.org/learn/performance/&quot;&gt;guide de performance&lt;/a&gt; de graphql.org note que les opérations de type query envoyées en GET peuvent profiter du cache HTTP et des CDN, et que les requêtes persistées permettent à un client d&amp;#39;envoyer un hash au lieu du document complet. Si vos clients le font, le test doit le faire aussi. S&amp;#39;ils ne le font pas, un test qui répète la même query avec les mêmes variables mesure un cache que le trafic réel ne sollicite pas. La note technique d&amp;#39;Apollo ajoute qu&amp;#39;Apollo Server, Gateway et le GraphOS Router activent par défaut les requêtes persistées automatiques.&lt;/p&gt;
&lt;p&gt;Le même guide décrit le problème N+1 : une liste dont le resolver charge chaque élément séparément transforme une requête en de nombreuses requêtes à la base, ce que l&amp;#39;on corrige en général en les regroupant avec un outil comme DataLoader. Suivez les requêtes à la base par seconde à côté des requêtes HTTP par seconde ; si elles grimpent beaucoup plus vite quand la charge monte, soupçonnez un resolver. Les limites de profondeur, de complexité et de débit peuvent aussi se déclencher pendant un test.&lt;/p&gt;
&lt;h2&gt;D&amp;#39;où doit venir la charge ?&lt;/h2&gt;
&lt;p&gt;D&amp;#39;une seule machine tant que vous écrivez le script et faites un smoke test, puis du cloud quand il vous faut plus de charge ou du trafic venant de plusieurs régions.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-load-test-a-graphql-api&quot;&gt;LoadFocus exécute des scripts k6&lt;/a&gt; depuis 25 régions cloud. Le nombre d&amp;#39;utilisateurs et la durée y viennent des paramètres du test et non des &lt;code&gt;options&lt;/code&gt; du script, et les scénarios à taux d&amp;#39;arrivée tournent avec un nombre fixe d&amp;#39;utilisateurs au lieu d&amp;#39;une cadence de requêtes fixe, la différence expliquée dans l&amp;#39;article sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt;. LoadFocus publie aussi un &lt;a href=&quot;https://loadfocus.com/templates/load-testing-for-graphql-endpoints-with-complex-queries?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-load-test-a-graphql-api&quot;&gt;modèle pour les endpoints GraphQL avec des requêtes complexes&lt;/a&gt; (en anglais).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Un test de charge GraphQL doit-il envoyer les queries en GET ou en POST ?&lt;/strong&gt;
Comme le font vos clients. graphql.org n&amp;#39;autorise GET que pour les opérations de type query, et les mutations doivent passer par POST. Si la production envoie des requêtes persistées en GET via un CDN, testez aussi ce chemin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le même script peut-il tester la charge des subscriptions GraphQL ?&lt;/strong&gt;
En général non. graphql.org rappelle que les subscriptions durent longtemps et passent souvent par des WebSockets ou des server-sent events : elles demandent leur propre scénario, dans un outil qui gère ce transport.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une réponse partielle doit-elle compter comme une requête en échec ?&lt;/strong&gt;
Dans la plupart des tests, oui, car le client a reçu une erreur pour une partie de sa demande. Si certaines erreurs sont attendues, comme des résultats introuvables pour des enregistrements supprimés, ciblez ces codes d&amp;#39;erreur et faites échouer le reste.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;Comment faire un test de charge : le guide pas à pas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-testing-in-github-actions/&quot;&gt;Test de charge dans GitHub Actions : guide pratique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/websocket-load-testing-tools/&quot;&gt;Outils de test de charge WebSocket : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/grpc-load-testing/&quot;&gt;Test de charge gRPC : outils, mise en place et mesures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Outils de benchmark HTTP : wrk, hey, oha, ab et autres</title><link>https://loadtest.app/fr/http-benchmarking-tools/</link><guid isPermaLink="true">https://loadtest.app/fr/http-benchmarking-tools/</guid><description>wrk, wrk2, hey, oha, ab, bombardier, autocannon et h2load comparés : contrôle de la cadence, HTTP/2, sortie de latence, licence et dernières versions.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Les outils de benchmark HTTP en ligne de commande que la plupart des équipes utilisent sont wrk, wrk2, hey, oha, ab (Apache Bench), bombardier, autocannon et h2load. Prenez wrk2 si vous avez besoin d&amp;#39;une cadence de requêtes constante et de latences de queue fiables, hey ou oha pour une vérification rapide qui parle aussi HTTP/2, h2load quand c&amp;#39;est HTTP/2 ou HTTP/3 que vous testez, et autocannon si votre équipe travaille en Node.js.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas mis ces outils en concurrence, vous ne trouverez donc ici ni chiffres de vitesse ni verdict sur le plus « rapide ». Les informations viennent du dépôt, du manuel ou de la page des versions de chaque projet (vérifiées le 9 octobre 2026) ; les conseils de choix sont notre jugement.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Écrit en&lt;/th&gt;
&lt;th&gt;Licence&lt;/th&gt;
&lt;th&gt;Contrôle de la cadence&lt;/th&gt;
&lt;th&gt;HTTP/2&lt;/th&gt;
&lt;th&gt;Dernière version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;wrk&lt;/td&gt;
&lt;td&gt;C, scripts LuaJIT&lt;/td&gt;
&lt;td&gt;Modified Apache 2.0&lt;/td&gt;
&lt;td&gt;Aucun&lt;/td&gt;
&lt;td&gt;Non documenté&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/wg/wrk/tags&quot;&gt;Tag 4.2.0, févr. 2021&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wrk2&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Cadence fixe (&lt;code&gt;-R&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Non documenté&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/giltene/wrk2/commits/master&quot;&gt;Aucune, dernier commit sept. 2019&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hey&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Limite par worker (&lt;code&gt;-q&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rakyll/hey/releases&quot;&gt;v0.1.5, janv. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oha&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Limite globale (&lt;code&gt;-q&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Oui, plus HTTP/3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/hatoo/oha/releases&quot;&gt;v1.16.0, août 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ab&lt;/td&gt;
&lt;td&gt;C (Apache httpd)&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Aucun&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://httpd.apache.org/download.cgi&quot;&gt;httpd 2.4.69, oct. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bombardier&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Limite (&lt;code&gt;-r&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/codesenberg/bombardier/releases&quot;&gt;v2.0.2, mars 2025&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;autocannon&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Limite (&lt;code&gt;-R&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mcollina/autocannon/releases&quot;&gt;v8.0.0, oct. 2024&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;h2load&lt;/td&gt;
&lt;td&gt;C++ (nghttp2)&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Par client (&lt;code&gt;--rps&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Oui, plus HTTP/3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/nghttp2/nghttp2/releases&quot;&gt;nghttp2 v1.70.0, juil. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vegeta&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Cadence fixe (&lt;code&gt;-rate&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tsenart/vegeta/releases&quot;&gt;v12.13.0, oct. 2025&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Pourquoi est-il important qu&amp;#39;un outil fixe la cadence ?&lt;/h2&gt;
&lt;p&gt;Un outil qui maintient un nombre fixe de connexions envoie moins dès que le serveur ralentit, et ses chiffres de latence oublient alors le temps que les requêtes ont passé à attendre. Un outil à cadence fixe continue d&amp;#39;envoyer selon le plan prévu, et le ralentissement apparaît dans les percentiles.&lt;/p&gt;
&lt;p&gt;La plupart des outils présentés ici font tourner un nombre donné de connexions ou de workers (&lt;code&gt;-c&lt;/code&gt;), chacun attendant une réponse avant d&amp;#39;envoyer la suite. Le &lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;README de wrk2&lt;/a&gt; appelle cet angle mort Coordinated Omission et chronomètre chaque requête à partir du moment où elle aurait dû partir. &lt;a href=&quot;https://github.com/tsenart/vegeta&quot;&gt;Vegeta&lt;/a&gt; maintient lui aussi une cadence constante ; voir notre tour d&amp;#39;horizon des &lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;outils de test de charge open source&lt;/a&gt;. oha et autocannon peuvent corriger leur latence de cet effet quand une cadence est fixée, tandis que hey et bombardier documentent leurs options de cadence comme de simples plafonds.&lt;/p&gt;
&lt;h2&gt;wrk vaut-il encore la peine ?&lt;/h2&gt;
&lt;p&gt;Oui, pour voir rapidement quelle charge une seule machine peut envoyer vers un endpoint, en gardant la réserve ci-dessus à l&amp;#39;esprit. Son tag le plus récent date de février 2021.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/wg/wrk&quot;&gt;wrk&lt;/a&gt; est écrit en C et garde un nombre fixe de connexions ouvertes sur plusieurs threads. Des scripts LuaJIT facultatifs peuvent construire les requêtes, traiter les réponses et produire des rapports personnalisés, et &lt;code&gt;make&lt;/code&gt; le compile avec les versions de LuaJIT et d&amp;#39;OpenSSL fournies. Il affiche la latence moyenne, l&amp;#39;écart type et le maximum ; &lt;code&gt;--latency&lt;/code&gt; ajoute les 50e, 75e, 90e et 99e percentiles.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt wrk2 si vous avez besoin d&amp;#39;une cadence de requêtes fixe ou de latences de queue fiables pendant un ralentissement.&lt;/p&gt;
&lt;h2&gt;Quand faut-il wrk2 plutôt que wrk ?&lt;/h2&gt;
&lt;p&gt;Quand la question porte sur le comportement de la latence à une cadence de requêtes donnée. wrk2 maintient cette cadence constante et enregistre chaque latence dans un HdrHistogram.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;wrk2&lt;/a&gt; ajoute à wrk un argument de débit (&lt;code&gt;-R&lt;/code&gt;, en requêtes par seconde). &lt;code&gt;--latency&lt;/code&gt; affiche le spectre complet des percentiles et &lt;code&gt;--u_latency&lt;/code&gt; ajoute les valeurs non corrigées pour comparaison. Son README prévient que des exécutions de moins de 10 à 20 secondes risquent de ne fournir aucune information utile à cause d&amp;#39;une phase de calibrage de 10 secondes, et qualifie le projet d&amp;#39;expérimental. Il n&amp;#39;a aucune version publiée, et son Makefile produit un binaire qui s&amp;#39;appelle lui aussi &lt;code&gt;wrk&lt;/code&gt; : gardez les deux bien séparés.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt oha ou autocannon si vous voulez un réglage de cadence avec correction de latence, dans un projet encore maintenu.&lt;/p&gt;
&lt;h2&gt;hey et oha sont-ils interchangeables ?&lt;/h2&gt;
&lt;p&gt;Pour des vérifications rapides, en grande partie : les deux font tourner un groupe de workers pour un nombre de requêtes ou une durée, et les deux parlent HTTP/2. Ils diffèrent par leur limitation de cadence et par ce que vous voyez pendant l&amp;#39;exécution.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rakyll/hey&quot;&gt;hey&lt;/a&gt; est un petit programme Go avec des binaires prêts à l&amp;#39;emploi pour Linux, macOS et Windows, ainsi qu&amp;#39;une formule Homebrew. &lt;code&gt;-q&lt;/code&gt; limite les requêtes par seconde de chaque worker, &lt;code&gt;-h2&lt;/code&gt; active HTTP/2, et le résumé comprend un histogramme des temps de réponse et une distribution des latences, ou du CSV avec &lt;code&gt;-o csv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hatoo/oha&quot;&gt;oha&lt;/a&gt; est écrit en Rust, s&amp;#39;inspire de hey et affiche une interface en direct dans le terminal. Son &lt;code&gt;-q&lt;/code&gt; fixe une cadence globale, &lt;code&gt;--latency-correction&lt;/code&gt; corrige la Coordinated Omission, et &lt;code&gt;--http-version&lt;/code&gt; accepte 1.1, 2 et, dans une compilation expérimentale, 3. Il s&amp;#39;installe avec cargo, Homebrew, winget ou pacman, et sait écrire du JSON ou du CSV.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt hey si une limite par worker correspond à votre façon de penser la charge ; choisissez oha pour HTTP/3, le JSON ou la correction de latence.&lt;/p&gt;
&lt;h2&gt;Faut-il encore utiliser ab ?&lt;/h2&gt;
&lt;p&gt;Pour une vérification rapide sur une machine où il est déjà installé, oui. ab est livré avec Apache HTTP Server, et son propre manuel énumère des limites connues.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://httpd.apache.org/docs/2.4/programs/ab.html&quot;&gt;ab&lt;/a&gt; prend un nombre de requêtes (&lt;code&gt;-n&lt;/code&gt;) et un niveau de concurrence (&lt;code&gt;-c&lt;/code&gt;), n&amp;#39;a aucune option de cadence ni de HTTP/2, et n&amp;#39;utilise KeepAlive qu&amp;#39;avec &lt;code&gt;-k&lt;/code&gt;. Sa sortie se termine par le pourcentage de requêtes servies en un temps donné ; il peut écrire ces pourcentages en CSV (&lt;code&gt;-e&lt;/code&gt;) ou chaque mesure dans un fichier gnuplot (&lt;code&gt;-g&lt;/code&gt;). La section Bugs du manuel indique que ab n&amp;#39;implémente pas entièrement HTTP/1.x et prévient que son analyse intensive des chaînes peut vous faire mesurer les performances de ab lui-même.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt hey ou oha si vous avez besoin de HTTP/2, d&amp;#39;une limite de cadence ou du keep-alive par défaut.&lt;/p&gt;
&lt;h2&gt;À quoi servent bombardier et autocannon ?&lt;/h2&gt;
&lt;p&gt;bombardier est un outil Go avec HTTP/2 en option et une limite de cadence. autocannon convient aux équipes Node.js, car il fonctionne aussi comme bibliothèque dans un script Node.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/codesenberg/bombardier&quot;&gt;bombardier&lt;/a&gt; utilise par défaut le client fasthttp et passe au client net/http de Go avec &lt;code&gt;--http1&lt;/code&gt; ou &lt;code&gt;--http2&lt;/code&gt;. &lt;code&gt;-r&lt;/code&gt; fixe une limite de cadence, &lt;code&gt;-l&lt;/code&gt; affiche les 50e, 75e, 90e et 99e percentiles, et &lt;code&gt;-o json&lt;/code&gt; rend le résultat exploitable par une machine.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mcollina/autocannon&quot;&gt;autocannon&lt;/a&gt; se présente comme un outil HTTP/1.1 avec pipelining et HTTPS, et s&amp;#39;installe avec &lt;code&gt;npm i autocannon -g&lt;/code&gt;. &lt;code&gt;-R&lt;/code&gt; plafonne la cadence globale et &lt;code&gt;-r&lt;/code&gt; celle de chaque connexion, et dès que l&amp;#39;une des deux est fixée, la latence est corrigée de la Coordinated Omission. Son tableau affiche les percentiles 2,5 %, 50 %, 97,5 % et 99 %, &lt;code&gt;-l&lt;/code&gt; les affiche tous et &lt;code&gt;-j&lt;/code&gt; écrit du JSON.&lt;/p&gt;
&lt;p&gt;Choisissez autocannon plutôt que bombardier si vos benchmarks vivent dans une suite de tests Node.js, et bombardier si vous avez besoin de HTTP/2.&lt;/p&gt;
&lt;h2&gt;Quel outil est conçu pour HTTP/2 et HTTP/3 ?&lt;/h2&gt;
&lt;p&gt;h2load. Il vient du projet nghttp2, privilégie HTTP/2 et peut forcer HTTP/1.1 ou, s&amp;#39;il a été compilé avec ce support, HTTP/3.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nghttp2.org/documentation/h2load-howto.html&quot;&gt;h2load&lt;/a&gt; se compile avec nghttp2 en passant &lt;code&gt;--enable-app&lt;/code&gt; à &lt;code&gt;./configure&lt;/code&gt;. En plus du nombre de clients (&lt;code&gt;-c&lt;/code&gt;), il fixe le nombre de flux simultanés par client (&lt;code&gt;-m&lt;/code&gt;) pour tester le multiplexage sous charge, et &lt;code&gt;--rps&lt;/code&gt; règle les requêtes par seconde de chaque client. Le &lt;a href=&quot;https://nghttp2.org/documentation/h2load.1.html&quot;&gt;manuel&lt;/a&gt; donne le minimum, le maximum, la moyenne, la médiane, le p95 et le p99 pour le temps de requête, le temps de connexion et le temps jusqu&amp;#39;au premier octet. Le support de HTTP/3 est signalé comme expérimental.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt oha si vous voulez HTTP/2 avec moins d&amp;#39;options et une vue en direct.&lt;/p&gt;
&lt;h2&gt;Quand passer d&amp;#39;un benchmark à un vrai test de charge ?&lt;/h2&gt;
&lt;p&gt;Quand la question touche aux parcours utilisateurs, à plus de charge qu&amp;#39;une machine ne peut en générer, ou à du trafic venant de là où se trouvent vos utilisateurs.&lt;/p&gt;
&lt;p&gt;Chaque outil présenté ici envoie des requêtes simples depuis une seule machine, et le guide de h2load rappelle que le client lui-même peut devenir le goulet d&amp;#39;étranglement. Passez à un outil de test de charge si vous avez besoin d&amp;#39;authentification, de parcours en plusieurs étapes ou de temps de réflexion, si le trafic doit venir de plusieurs régions, ou si un test doit réussir ou échouer dans la CI. Notre guide &lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;Comment faire un test de charge&lt;/a&gt; détaille la démarche pas à pas, et &lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; compare deux outils scriptables.&lt;/p&gt;
&lt;p&gt;LoadFocus, l&amp;#39;éditeur de ce site, &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=http-benchmarking-tools&quot;&gt;exécute des tests de charge&lt;/a&gt; pour sites web et API depuis 25 régions cloud, avec JMeter, k6 ou des tests sans code. Si votre benchmark est une requête que vous envoyez déjà avec curl, son &lt;a href=&quot;https://loadfocus.com/fr-fr/curl-to-k6?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=http-benchmarking-tools&quot;&gt;convertisseur cURL vers k6&lt;/a&gt; gratuit en fait un script k6, directement dans votre navigateur.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre wrk et wrk2 ?&lt;/strong&gt;
wrk2 est un fork de wrk qui envoie les requêtes à une cadence constante fixée avec &lt;code&gt;-R&lt;/code&gt; et chronomètre chaque requête à partir du moment où elle aurait dû partir. wrk garde un nombre fixe de connexions occupées et n&amp;#39;a aucun réglage de cadence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quels outils de benchmark HTTP prennent en charge HTTP/2 ?&lt;/strong&gt;
D&amp;#39;après leur documentation, hey, oha, bombardier, h2load et Vegeta. wrk et wrk2 ne le documentent pas, autocannon se présente comme un outil HTTP/1.1 et ab n&amp;#39;a pas d&amp;#39;option HTTP/2.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;Outils de test de charge open source : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;Coordinated omission : ce que c&amp;#39;est et comment l&amp;#39;éviter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/websocket-load-testing-tools/&quot;&gt;Outils de test de charge WebSocket : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tail-latency/&quot;&gt;Latence de queue : définition et mesure sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/redis-benchmark/&quot;&gt;redis-benchmark : l&amp;#39;utiliser et lire ses résultats&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Loi de Little en test de charge : dimensionner et vérifier</title><link>https://loadtest.app/fr/littles-law-load-testing/</link><guid isPermaLink="true">https://loadtest.app/fr/littles-law-load-testing/</guid><description>La loi de Little en test de charge expliquée : le lien entre utilisateurs, taux de requêtes et temps de réponse, le calcul d&apos;un test et ses limites.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;La loi de Little en test de charge dit que le nombre moyen d&amp;#39;utilisateurs ou de requêtes présents dans un système est égal au rythme auquel ils le traversent multiplié par le temps moyen que chacun y passe : L = λW. Avec un nombre fixe d&amp;#39;utilisateurs virtuels, cela donne utilisateurs = boucles par seconde × (temps de réponse + temps de réflexion), ce qui indique avant un test si le plan peut atteindre son taux cible et, après, si les résultats se tiennent. Elle porte sur des moyennes calculées sur une phase stable du test, donc elle ne dit rien des percentiles.&lt;/p&gt;
&lt;p&gt;Les exemples chiffrés ci-dessous sont de simples calculs, sans test derrière. Les faits sur les outils viennent de la documentation de chaque projet, vérifiée le 9 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Terme&lt;/th&gt;
&lt;th&gt;Définition de Little&lt;/th&gt;
&lt;th&gt;Utilisateurs virtuels fixes (modèle fermé)&lt;/th&gt;
&lt;th&gt;Taux d&amp;#39;arrivée (modèle ouvert)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;Nombre moyen d&amp;#39;éléments dans le système&lt;/td&gt;
&lt;td&gt;Utilisateurs virtuels, en attente ou en pause&lt;/td&gt;
&lt;td&gt;Itérations en cours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;λ&lt;/td&gt;
&lt;td&gt;Taux d&amp;#39;arrivée moyen&lt;/td&gt;
&lt;td&gt;Boucles terminées par seconde&lt;/td&gt;
&lt;td&gt;Le taux que vous fixez&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;W&lt;/td&gt;
&lt;td&gt;Temps moyen passé à l&amp;#39;intérieur&lt;/td&gt;
&lt;td&gt;Temps de réponse + temps de réflexion par boucle&lt;/td&gt;
&lt;td&gt;Durée d&amp;#39;une itération&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Que dit la loi de Little ?&lt;/h2&gt;
&lt;p&gt;Sur la durée, le nombre moyen d&amp;#39;éléments dans un système de files d&amp;#39;attente est égal à leur taux d&amp;#39;arrivée moyen multiplié par le temps moyen que chacun y passe. Connaissez deux des trois grandeurs et vous obtenez la troisième.&lt;/p&gt;
&lt;p&gt;John D. C. Little a publié la démonstration en 1961 dans Operations Research sous le titre &lt;a href=&quot;https://doi.org/10.1287/opre.9.3.383&quot;&gt;A Proof for the Queuing Formula: L = λW&lt;/a&gt;. Dans son &lt;a href=&quot;https://doi.org/10.1287/opre.1110.0940&quot;&gt;bilan pour les 50 ans de la loi&lt;/a&gt;, paru en 2011, il écrit qu&amp;#39;elle tient dans des conditions remarquablement générales : pour une seule file comme pour un réseau entier, pour une sous-catégorie d&amp;#39;éléments comme pour l&amp;#39;ensemble, et quel que soit l&amp;#39;ordre de service. Le même article transpose les termes à un serveur : requêtes en cours de traitement, requêtes par seconde et temps de réponse moyen.&lt;/p&gt;
&lt;h2&gt;Que représentent L, λ et W dans un test de charge ?&lt;/h2&gt;
&lt;p&gt;Cela dépend de l&amp;#39;endroit où vous tracez la frontière du système. Autour du serveur, L est le nombre de requêtes en cours et W le temps de réponse ; autour de la boucle complète d&amp;#39;un utilisateur virtuel, L est le nombre total d&amp;#39;utilisateurs virtuels et W le temps de réponse plus le temps de réflexion.&lt;/p&gt;
&lt;p&gt;Dans un test en modèle fermé, chaque utilisateur se trouve toujours quelque part dans sa boucle : il attend une réponse ou marque une pause entre deux étapes. Avec la frontière autour de la boucle, tous comptent comme « dans le système », λ est le rythme auquel les boucles se terminent et W la durée moyenne d&amp;#39;une boucle, y compris le &lt;a href=&quot;https://loadtest.app/fr/think-time-in-load-testing/&quot;&gt;temps de réflexion&lt;/a&gt; ajouté par le script :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;utilisateurs = boucles/s × (temps de réponse + réflexion)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Autour du serveur, la même loi donne les requêtes en vol : requêtes par seconde × temps de réponse moyen, le nombre que vos pools de connexions et vos threads de travail doivent absorber. Gardez les trois valeurs sur la même frontière et la même tranche de temps ; les mélanger donne des résultats faux mais plausibles.&lt;/p&gt;
&lt;h2&gt;Comment dimensionner un test en modèle fermé avec la loi de Little ?&lt;/h2&gt;
&lt;p&gt;Convertissez le taux de requêtes visé en boucles par seconde, puis multipliez par la durée attendue d&amp;#39;une boucle : le résultat est le nombre d&amp;#39;utilisateurs virtuels dont le plan a besoin. Prenez le temps de réponse attendu sous la charge cible, en général plus élevé que celui observé avec quelques utilisateurs.&lt;/p&gt;
&lt;p&gt;Un exemple chiffré, purement arithmétique. L&amp;#39;objectif est de 100 requêtes par seconde, chaque boucle envoie 4 requêtes censées durer 0,5 seconde chacune, et le script marque 3 pauses de 2 secondes en moyenne :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;boucles par seconde   = 100 requêtes/s ÷ 4 requêtes = 25
durée d&amp;#39;une boucle    = 4 × 0,5 s + 3 × 2 s          = 8 s
utilisateurs virtuels = 25 boucles/s × 8 s           = 200
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voyez 200 comme un minimum. Si les réponses prennent 1 seconde sous cette charge, une boucle dure 10 secondes et le même objectif demande 250 utilisateurs.&lt;/p&gt;
&lt;h2&gt;Pourquoi les mêmes utilisateurs envoient-ils moins de requêtes quand le système ralentit ?&lt;/h2&gt;
&lt;p&gt;Le nombre d&amp;#39;utilisateurs est fixe, donc quand la durée d&amp;#39;une boucle augmente, le nombre de boucles par seconde doit baisser. La charge diminue au moment précis où le système commence à peiner.&lt;/p&gt;
&lt;p&gt;Gardez les 200 utilisateurs et faites durer chaque requête 2 secondes. Une boucle dure alors 4 × 2 + 6 = 14 secondes, et 200 ÷ 14 donne environ 14,3 boucles, soit environ 57 requêtes par seconde. Le test affiche toujours 200 utilisateurs, mais il tourne à un peu plus de la moitié du taux prévu. L&amp;#39;article sur le &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt; explique pourquoi cela masque la saturation ; la loi de Little prédit l&amp;#39;ampleur de la baisse.&lt;/p&gt;
&lt;p&gt;Elle montre aussi à quoi ressemble une limite de capacité. Quand le taux de requêtes ne peut plus monter, chaque utilisateur supplémentaire n&amp;#39;ajoute que de l&amp;#39;attente : avec un plafond de 25 boucles par seconde, 300 utilisateurs donnent 12 secondes par boucle et 400 utilisateurs 16. Le graphique LoadFocus &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/response-time-vs-virtual-users?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=littles-law-load-testing&quot;&gt;temps de réponse vs utilisateurs virtuels&lt;/a&gt; trace le temps de réponse moyen et maximal en fonction du nombre d&amp;#39;utilisateurs virtuels actifs, un point par palier atteint ; c&amp;#39;est là qu&amp;#39;apparaît cette montée régulière.&lt;/p&gt;
&lt;h2&gt;Comment vérifier un test terminé avec la loi de Little ?&lt;/h2&gt;
&lt;p&gt;Prenez le taux de requêtes et le temps de réponse moyens sur une période où le nombre d&amp;#39;utilisateurs est resté stable, recalculez-en le nombre d&amp;#39;utilisateurs et comparez-le à votre configuration. Un écart important signifie qu&amp;#39;une partie du temps échappe à vos mesures.&lt;/p&gt;
&lt;p&gt;Un autre calcul. Un test maintient 200 utilisateurs et affiche 80 requêtes par seconde pour 0,6 seconde en moyenne, avec les mêmes 4 requêtes et 6 secondes de pause par boucle. Cela fait 20 boucles par seconde de 4 × 0,6 + 6 = 8,4 secondes chacune, de quoi occuper 168 utilisateurs. Les 32 autres signifient que chaque boucle a en réalité duré 10 secondes, donc environ 1,6 seconde par boucle reste inexpliquée. Où chercher :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L&amp;#39;établissement des connexions. Dans k6, &lt;code&gt;http_req_duration&lt;/code&gt; n&amp;#39;inclut ni la résolution DNS ni la connexion (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;référence des métriques&lt;/a&gt;, vérifiée le 9 octobre 2026).&lt;/li&gt;
&lt;li&gt;Le générateur de charge. Un générateur surchargé retarde le script entre deux requêtes.&lt;/li&gt;
&lt;li&gt;Le temps de réflexion. Des pauses aléatoires peuvent durer en moyenne plus que prévu.&lt;/li&gt;
&lt;li&gt;La fenêtre. Si elle empiète sur une rampe, moins d&amp;#39;utilisateurs étaient actifs en moyenne.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;k6 mesure aussi la boucle directement : &lt;code&gt;vus&lt;/code&gt; compte les utilisateurs virtuels actifs et &lt;code&gt;iteration_duration&lt;/code&gt; la durée d&amp;#39;une itération complète, donc les utilisateurs actifs doivent être proches des itérations par seconde × la durée moyenne d&amp;#39;une itération.&lt;/p&gt;
&lt;h2&gt;Et les tests par taux d&amp;#39;arrivée ?&lt;/h2&gt;
&lt;p&gt;La loi tient avec la frontière autour de chaque itération : les itérations en cours sont égales au taux d&amp;#39;arrivée multiplié par la durée d&amp;#39;une itération. C&amp;#39;est le nombre d&amp;#39;utilisateurs virtuels que l&amp;#39;outil doit garder prêts.&lt;/p&gt;
&lt;p&gt;Le guide k6 sur &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/arrival-rate-vu-allocation/&quot;&gt;l&amp;#39;allocation des VU pour les exécuteurs à taux d&amp;#39;arrivée&lt;/a&gt; les estime à la durée médiane d&amp;#39;une itération × le taux, plus une constante pour la variance (vérifié le 9 octobre 2026). C&amp;#39;est la loi de Little avec la médiane à la place de la moyenne ; quelques itérations lentes tirent la moyenne au-dessus de la médiane, d&amp;#39;où l&amp;#39;importance de la marge.&lt;/p&gt;
&lt;p&gt;LoadFocus exécute des &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=littles-law-load-testing&quot;&gt;scripts k6&lt;/a&gt; dans son cloud, et les scénarios à taux d&amp;#39;arrivée y tournent avec un nombre fixe d&amp;#39;utilisateurs ; le validateur de script le signale quand vous ajoutez un tel script. Dimensionnez ces tests avec le calcul du modèle fermé ci-dessus et attendez-vous à voir le taux baisser si les réponses ralentissent.&lt;/p&gt;
&lt;h2&gt;Où la loi de Little cesse-t-elle de s&amp;#39;appliquer ?&lt;/h2&gt;
&lt;p&gt;Elle relie des moyennes sur une période où le système est à l&amp;#39;équilibre. Les percentiles, les fenêtres courtes et les rampes sortent de son champ.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Des moyennes seulement. Un test peut respecter la loi alors qu&amp;#39;une requête sur vingt attend dix fois la moyenne ; jugez donc aussi les résultats sur les percentiles.&lt;/li&gt;
&lt;li&gt;Une phase stable. La démonstration de 1961 suppose un processus stationnaire, et le bilan de 2011 montre que la formule est aussi exacte sur une fenêtre finie qui commence et finit à vide. Un plateau de test n&amp;#39;est ni l&amp;#39;un ni l&amp;#39;autre, alors choisissez-en un long, où les utilisateurs qui terminent une boucle sont aussi nombreux que ceux qui en commencent une.&lt;/li&gt;
&lt;li&gt;Les rampes. Pendant l&amp;#39;ajout d&amp;#39;utilisateurs, le pic configuré n&amp;#39;est pas L : prenez le nombre moyen d&amp;#39;utilisateurs sur la fenêtre, ou laissez la rampe de côté.&lt;/li&gt;
&lt;li&gt;Les erreurs. Les échecs rapides comptent comme des requêtes terminées avec un temps court, si bien qu&amp;#39;un système défaillant peut quand même équilibrer l&amp;#39;équation. Vérifiez d&amp;#39;abord le taux d&amp;#39;erreur.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;La loi de Little suppose-t-elle des arrivées de Poisson ou une file particulière ?&lt;/strong&gt;
Non. Les démonstrations du bilan de Little ne supposent rien sur la forme des arrivées ni sur les temps de service, et le résultat tient quel que soit l&amp;#39;ordre de service. Il faut seulement que les moyennes existent sur la période mesurée.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La loi de Little peut-elle prédire le temps de réponse p95 ?&lt;/strong&gt;
Non. Elle relie trois moyennes, elle peut donc vérifier un temps de réponse moyen, mais elle ne dit rien de la forme de la distribution ni des quelques pour cent les plus lents.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/think-time-in-load-testing/&quot;&gt;Temps de réflexion en test de charge : bien le régler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;Comment faire un test de charge : le guide pas à pas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/redis-benchmark/&quot;&gt;redis-benchmark : l&amp;#39;utiliser et lire ses résultats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/amdahls-law/&quot;&gt;Loi d&amp;#39;Amdahl : formule, exemples et limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/queueing-theory/&quot;&gt;Théorie des files d&amp;#39;attente : ce qu&amp;#39;elle dit de la latence&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Critères de réussite d&apos;un test de charge : comment les fixer</title><link>https://loadtest.app/fr/load-test-pass-fail-criteria/</link><guid isPermaLink="true">https://loadtest.app/fr/load-test-pass-fail-criteria/</guid><description>Fixer les critères de réussite d&apos;un test de charge : partir d&apos;un SLO, choisir latence, erreurs et taux de requêtes, puis séparer échecs et alertes.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;Les critères de réussite d&amp;#39;un test de charge sont les quelques seuils qu&amp;#39;une exécution doit tenir pour être déclarée réussie : un percentile de latence pour les requêtes que les utilisateurs attendent, un taux d&amp;#39;erreur et un taux de requêtes minimal, le tout à une charge donnée. Tirez ces seuils d&amp;#39;un objectif de niveau de service (SLO), placez à l&amp;#39;intérieur des seuils de régression issus d&amp;#39;exécutions précédentes, et laissez le code de sortie de l&amp;#39;outil faire échouer l&amp;#39;exécution sur ces seuils stricts uniquement. Tout le reste est un avertissement qu&amp;#39;une personne lit.&lt;/p&gt;
&lt;p&gt;Les informations sur les outils ont été vérifiées le 9 octobre 2026 dans la documentation de chaque projet, et chaque seuil présenté est un exemple.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critère&lt;/th&gt;
&lt;th&gt;Seuil d&amp;#39;exemple&lt;/th&gt;
&lt;th&gt;Origine du chiffre&lt;/th&gt;
&lt;th&gt;En cas d&amp;#39;écart&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;p95 de latence, paiement&lt;/td&gt;
&lt;td&gt;Moins de 400 ms&lt;/td&gt;
&lt;td&gt;SLO de latence moins une marge&lt;/td&gt;
&lt;td&gt;Échec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p99 de latence, paiement&lt;/td&gt;
&lt;td&gt;Moins de 1 200 ms&lt;/td&gt;
&lt;td&gt;Exécutions précédentes de ce test&lt;/td&gt;
&lt;td&gt;Avertissement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Taux d&amp;#39;erreur&lt;/td&gt;
&lt;td&gt;Moins de 0,5 %&lt;/td&gt;
&lt;td&gt;SLO de disponibilité&lt;/td&gt;
&lt;td&gt;Échec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requêtes par seconde&lt;/td&gt;
&lt;td&gt;Au moins 95 % du plan&lt;/td&gt;
&lt;td&gt;La charge prévue&lt;/td&gt;
&lt;td&gt;Échec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU du générateur de charge&lt;/td&gt;
&lt;td&gt;Moins de 80 %&lt;/td&gt;
&lt;td&gt;Outil ou plateforme&lt;/td&gt;
&lt;td&gt;Exécution invalide&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui fait réussir ou échouer un test de charge ?&lt;/h2&gt;
&lt;p&gt;Une exécution réussit quand chaque seuil strict tient à la charge prévue, et échoue dès qu&amp;#39;un seuil est manqué. Elle est invalide quand le test lui-même n&amp;#39;a pas fait son travail, quels que soient les chiffres.&lt;/p&gt;
&lt;p&gt;Un générateur de charge saturé, une charge qui n&amp;#39;a jamais atteint sa cible ou un script en erreur produisent des chiffres sur le dispositif de test. LoadFocus, par exemple, affiche un avertissement de &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/load-generator-saturation?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-test-pass-fail-criteria&quot;&gt;saturation du générateur de charge&lt;/a&gt; quand un moteur a atteint ou dépassé 80 % de CPU en pointe. Les &lt;a href=&quot;https://github.com/grafana/k6/blob/master/errext/exitcodes/codes.go&quot;&gt;codes de sortie de k6&lt;/a&gt; séparent les cas pour la CI : 99 signale des seuils non tenus, 107 une exception dans le script (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment transformer un SLO en critères de test de charge ?&lt;/h2&gt;
&lt;p&gt;Reformulez chaque SLO que la charge peut mettre en défaut, en général la latence et la disponibilité, en seuil sur ce que le test mesure, et rendez ce seuil plus strict que le SLO pour qu&amp;#39;une réussite laisse de la marge.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://sre.google/sre-book/service-level-objectives/&quot;&gt;livre SRE de Google&lt;/a&gt; définit un SLO comme une valeur cible ou une plage de valeurs pour un niveau de service mesuré par un indicateur (SLI), avec des exemples comme : 99 % des appels &lt;code&gt;Get&lt;/code&gt; se terminent en moins de 100 ms. Il demande qu&amp;#39;un SLO précise comment il est mesuré et dans quelles conditions il s&amp;#39;applique, et recommande une marge de sécurité : un objectif interne plus strict que celui annoncé aux utilisateurs.&lt;/p&gt;
&lt;p&gt;Pour un test de charge, ces conditions sont la charge et le mélange de requêtes. « 95 % des appels de paiement en moins de 500 ms » pourrait ainsi devenir, à titre d&amp;#39;exemple, « p95 du paiement sous 400 ms à 300 requêtes par seconde pendant 15 minutes ». Sans SLO, convenez d&amp;#39;un objectif provisoire avec le responsable produit.&lt;/p&gt;
&lt;h2&gt;Quelles métriques les critères doivent-ils couvrir ?&lt;/h2&gt;
&lt;p&gt;La latence des requêtes que les utilisateurs attendent, un taux d&amp;#39;erreur, le taux de requêtes atteint et, surtout sous forme d&amp;#39;avertissements, les ressources des serveurs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La latence par type de requête.&lt;/strong&gt; Un percentile global mélange un health check rapide et une recherche lente. Dans k6, les &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;requêtes étiquetées créent des sous-métriques&lt;/a&gt; avec leurs propres seuils ; dans Gatling, &lt;code&gt;details()&lt;/code&gt; cible une requête ou un groupe. Un test qui a freiné sa propre charge affiche des percentiles flatteurs (&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les erreurs, au sens large.&lt;/strong&gt; Un 200 rapide qui renvoie une page d&amp;#39;erreur reste un échec : vérifiez le contenu. Une &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Response_Assertion&quot;&gt;Response Assertion&lt;/a&gt; JMeter en échec marque son échantillon comme non réussi ; les checks k6 n&amp;#39;agissent sur le code de sortie qu&amp;#39;à travers un seuil.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un plancher de taux de requêtes.&lt;/strong&gt; Dans un modèle de charge fermé, un système lent reçoit moins de requêtes, et une exécution peut tenir ses seuils de latence avec une fraction de la charge prévue (&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge ouvert ou fermé&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les ressources des serveurs.&lt;/strong&gt; CPU, mémoire et occupation des pools viennent de votre supervision. Traitez-les comme des avertissements, sauf si un plan de capacité fixe un plafond strict.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Comment choisir les chiffres ?&lt;/h2&gt;
&lt;p&gt;Le plafond vient du SLO, le seuil de régression des exécutions précédentes du même test. Le SLO dit ce que les utilisateurs tolèrent ; les exécutions précédentes disent ce que ce build fait d&amp;#39;habitude.&lt;/p&gt;
&lt;p&gt;Le livre SRE déconseille de fixer un SLO à partir des performances actuelles. Un seuil de régression sert à repérer un changement, et les performances actuelles sont justement sa matière première. Lancez plusieurs fois le build inchangé avec le même environnement et la même charge, notez de combien chaque métrique varie, et placez le seuil au-dessus de la pire exécution avec un peu de marge, tout en restant sous le plafond tiré du SLO quand il y en a un.&lt;/p&gt;
&lt;p&gt;Si les exécutions d&amp;#39;un même build varient davantage que la régression que vous voulez détecter, le test est trop bruité pour bloquer un build : allongez d&amp;#39;abord la phase stable ou isolez l&amp;#39;environnement. Enregistrez de nouvelles exécutions de référence après tout changement volontaire.&lt;/p&gt;
&lt;h2&gt;Quels critères doivent faire échouer le build, et lesquels seulement avertir ?&lt;/h2&gt;
&lt;p&gt;Faites échouer le build sur les seuils issus d&amp;#39;un SLO ou qui vérifient l&amp;#39;exactitude des réponses. Avertissez sur les percentiles de queue, l&amp;#39;usage des ressources et les dérives lentes, qui demandent du jugement ; une barrière qui échoue sur du bruit finit vite désactivée.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;plugin &lt;code&gt;ensure&lt;/code&gt;&lt;/a&gt; d&amp;#39;Artillery a un niveau d&amp;#39;avertissement : une condition avec &lt;code&gt;strict: false&lt;/code&gt; est facultative, et un échec ne change donc pas le code de sortie (vérifié le 9 octobre 2026). Dans k6, un check sans seuil ne fait jamais échouer l&amp;#39;exécution. Ailleurs, gardez les avertissements hors des assertions.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  plugins:
    ensure:
      thresholds:
        - &amp;quot;http.response_time.p95&amp;quot;: 400
      conditions:
        - expression: &amp;quot;http.response_time.p99 &amp;lt; 1200&amp;quot;
          strict: false
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Quand un test de charge doit-il s&amp;#39;arrêter plus tôt ?&lt;/h2&gt;
&lt;p&gt;Quand continuer ne peut que nuire ou ne prouve plus rien : des erreurs bien au-delà du seuil, un système déjà tombé ou un générateur qui ne suit plus. Donnez à la règle un délai de grâce pour que le bruit du démarrage ne la déclenche pas.&lt;/p&gt;
&lt;p&gt;Rendez les règles d&amp;#39;arrêt plus lâches que les seuils de réussite : elles protègent un environnement partagé. Dans k6, &lt;code&gt;abortOnFail&lt;/code&gt; arrête le test dès qu&amp;#39;un seuil échoue, après un &lt;code&gt;delayAbortEval&lt;/code&gt; facultatif. La &lt;a href=&quot;https://docs.locust.io/en/stable/extending-locust.html&quot;&gt;documentation de Locust sur les extensions&lt;/a&gt; montre un greenlet en arrière-plan qui arrête l&amp;#39;exécution quand le taux d&amp;#39;échec dépasse un seuil. Dans Gatling, &lt;a href=&quot;https://docs.gatling.io/concepts/scenario/&quot;&gt;&lt;code&gt;crashLoadGeneratorIf&lt;/code&gt;&lt;/a&gt; arrête le générateur avec un code d&amp;#39;échec quand une condition est vraie dans la session d&amp;#39;un utilisateur virtuel. Un &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; JMeter peut arrêter le test sur une erreur de sampler, ce qui convient à un contrôle d&amp;#39;exactitude (tout vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment chaque outil encode-t-il les critères ?&lt;/h2&gt;
&lt;p&gt;k6 et Artillery transforment un seuil strict manqué en code de sortie non nul, Locust le fait pour toute requête en échec ou pour les seuils que vous codez vous-même, et les assertions de Gatling font échouer le build. JMeter laisse le verdict à une étape qui suit l&amp;#39;exécution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6&lt;/strong&gt; : les &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;seuils&lt;/a&gt; se placent dans les options du script. Cet exemple échoue sur le p95 des requêtes étiquetées &lt;code&gt;name: checkout&lt;/code&gt; ou sur 0,5 % d&amp;#39;erreurs, et s&amp;#39;arrête au bout d&amp;#39;une minute si les erreurs dépassent 5 % :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;export const options = {
  thresholds: {
    &amp;quot;http_req_duration{name:checkout}&amp;quot;: [&amp;quot;p(95)&amp;lt;400&amp;quot;],
    http_req_failed: [
      &amp;quot;rate&amp;lt;0.005&amp;quot;,
      { threshold: &amp;quot;rate&amp;lt;0.05&amp;quot;, abortOnFail: true,
        delayAbortEval: &amp;quot;1m&amp;quot; },
    ],
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Gatling&lt;/strong&gt; : les &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; associent une portée (&lt;code&gt;global&lt;/code&gt;, &lt;code&gt;forAll&lt;/code&gt;, &lt;code&gt;details&lt;/code&gt;), une statistique comme un percentile ou &lt;code&gt;requestsPerSec&lt;/code&gt;, et une condition. Elles sont évaluées après l&amp;#39;exécution, et une seule assertion en échec fait échouer la simulation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;se termine avec le code 1 si au moins une requête a échoué&lt;/a&gt;, et &lt;code&gt;--exit-code-on-error&lt;/code&gt; change ce code. Pour un ratio ou un percentile, définissez &lt;code&gt;environment.process_exit_code&lt;/code&gt; dans un listener &lt;code&gt;quitting&lt;/code&gt; ; le &lt;a href=&quot;https://github.com/locustio/locust/blob/master/locust/main.py&quot;&gt;code source de Locust&lt;/a&gt; donne la priorité à cette valeur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt; juge chaque échantillon avec ses assertions, et ses &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;options en ligne de commande&lt;/a&gt; ne prévoient aucun seuil pour l&amp;#39;exécution entière. C&amp;#39;est la CI qui tranche : un court script sur le fichier de résultats, comme dans notre &lt;a href=&quot;https://loadtest.app/fr/load-testing-in-github-actions/&quot;&gt;guide GitHub Actions&lt;/a&gt;, ou le &lt;a href=&quot;https://github.com/jmeter-maven-plugin/jmeter-maven-plugin/wiki/Test-Results-File-Format&quot;&gt;jmeter-maven-plugin&lt;/a&gt;, un plugin tiers dont le goal &lt;code&gt;results&lt;/code&gt; fait échouer le build si un seul échantillon a échoué, sauf si &lt;code&gt;errorRateThresholdInPercent&lt;/code&gt; fixe un taux (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus&lt;/strong&gt; juge les exécutions selon des &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/pass-fail-thresholds?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-test-pass-fail-criteria&quot;&gt;seuils de réussite ou d&amp;#39;échec&lt;/a&gt; enregistrés sur le test : temps de réponse p95 et p99 maximaux, taux d&amp;#39;erreur maximal et taux de requêtes minimal, chacun facultatif. Chaque exécution reçoit un badge PASS ou FAIL avec les valeurs mesurées et les cibles, et une API transmet le verdict à un pipeline. LoadFocus exécute les scénarios k6 à taux d&amp;#39;arrivée avec un nombre fixe d&amp;#39;utilisateurs : là, un plancher de taux vérifie donc ce que ces utilisateurs ont atteint.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Le temps de réponse moyen doit-il être un critère de réussite ?&lt;/strong&gt;
Rarement. Le livre SRE préfère les percentiles : une moyenne masque la longue traîne et peut rester stable pendant que les requêtes les plus lentes ralentissent nettement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combien de critères de réussite un test de charge doit-il avoir ?&lt;/strong&gt;
Une poignée de seuils stricts, plus des avertissements. Le livre SRE conseille d&amp;#39;avoir le moins de SLO possible et estime qu&amp;#39;un SLO qu&amp;#39;on ne peut jamais invoquer pour gagner une discussion sur les priorités ne vaut probablement pas la peine d&amp;#39;être gardé. Appliquez la même règle à chaque seuil d&amp;#39;un test de charge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un test de charge peut-il réussir avec quelques requêtes en échec ?&lt;/strong&gt;
Oui, si le taux d&amp;#39;erreur reste sous son seuil. Vérifiez le comportement par défaut de votre outil : Locust fait échouer l&amp;#39;exécution à la moindre requête en échec.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-testing-in-github-actions/&quot;&gt;Test de charge dans GitHub Actions : guide pratique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;Coordinated omission : ce que c&amp;#39;est et comment l&amp;#39;éviter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;Comment faire un test de charge : le guide pas à pas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/apdex-score/&quot;&gt;Score Apdex : définition et méthode de calcul&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/slo-vs-sla/&quot;&gt;SLO vs SLA : la différence, les SLI et le budget d&amp;#39;erreur&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Test de charge dans GitHub Actions : guide pratique</title><link>https://loadtest.app/fr/load-testing-in-github-actions/</link><guid isPermaLink="true">https://loadtest.app/fr/load-testing-in-github-actions/</guid><description>Monter un test de charge dans GitHub Actions avec k6, Artillery, Locust ou JMeter : seuils qui font échouer le job, artefacts et limites d&apos;un runner.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;Pour un test de charge dans GitHub Actions, un seul fichier de workflow suffit : installer l&amp;#39;outil, lancer un test court contre une URL de préproduction et laisser le code de sortie de l&amp;#39;outil faire échouer le job quand un seuil n&amp;#39;est pas tenu. Envoyez les résultats comme artefact pour que chaque exécution laisse une trace. Gardez un test modeste, car un runner standard hébergé par GitHub est une seule machine virtuelle avec quelques cœurs de CPU.&lt;/p&gt;
&lt;p&gt;Les informations sur les outils et sur GitHub viennent de la documentation de chaque éditeur, vérifiées le 9 octobre 2026, et les workflows suivent cet usage documenté.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Installé par&lt;/th&gt;
&lt;th&gt;Ce qui fait échouer le job&lt;/th&gt;
&lt;th&gt;Résultats à conserver&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;setup-k6-action&lt;/code&gt; de Grafana&lt;/td&gt;
&lt;td&gt;Un seuil non tenu&lt;/td&gt;
&lt;td&gt;Sortie JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;&lt;code&gt;artilleryio/action-cli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Une vérification &lt;code&gt;ensure&lt;/code&gt; en échec&lt;/td&gt;
&lt;td&gt;&lt;code&gt;report.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install locust&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Toute requête en échec, ou votre propre règle&lt;/td&gt;
&lt;td&gt;Fichiers CSV et HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;L&amp;#39;archive de la version&lt;/td&gt;
&lt;td&gt;Rien d&amp;#39;intégré : ajouter une étape de contrôle&lt;/td&gt;
&lt;td&gt;Fichier &lt;code&gt;.jtl&lt;/code&gt; et rapport HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;De quoi un workflow de test de charge a-t-il besoin ?&lt;/h2&gt;
&lt;p&gt;D&amp;#39;un déclencheur, d&amp;#39;un runner, d&amp;#39;une étape qui installe l&amp;#39;outil, d&amp;#39;une étape qui lance le test avec des seuils et d&amp;#39;une étape qui envoie les résultats. Tout le reste est facultatif.&lt;/p&gt;
&lt;p&gt;Gardez le script de test dans le dépôt, par exemple sous &lt;code&gt;tests/load/&lt;/code&gt;. Lisez l&amp;#39;URL de préproduction depuis une variable du dépôt via le &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/contexts&quot;&gt;contexte &lt;code&gt;vars&lt;/code&gt;&lt;/a&gt;, et fixez &lt;code&gt;timeout-minutes&lt;/code&gt; sur le job : &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax&quot;&gt;la valeur par défaut est de 360 minutes&lt;/a&gt; (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quels événements doivent déclencher un test de charge ?&lt;/h2&gt;
&lt;p&gt;Lancez un test court sur les pull requests et un test plus long selon un planning ou à la main.&lt;/p&gt;
&lt;p&gt;Utilisez &lt;code&gt;pull_request&lt;/code&gt; pour repérer une régression avant la fusion, &lt;code&gt;workflow_dispatch&lt;/code&gt; pour les exécutions manuelles et &lt;code&gt;schedule&lt;/code&gt; pour des exécutions cron (en UTC, sauf si vous indiquez un fuseau horaire). La &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows&quot;&gt;référence des événements&lt;/a&gt; de GitHub ajoute quelques limites (vérifié le 9 octobre 2026) : les exécutions planifiées ne tournent que sur la branche par défaut, au plus toutes les cinq minutes, et peuvent être retardés en début d&amp;#39;heure. Les pull requests venant de forks ne reçoivent aucun secret hormis &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Comment lancer k6 dans GitHub Actions ?&lt;/h2&gt;
&lt;p&gt;Utilisez les deux actions officielles de Grafana, l&amp;#39;une pour installer k6, l&amp;#39;autre pour lancer le script. L&amp;#39;étape échoue dès que k6 se termine avec un code de sortie non nul, ce que provoque un seuil non tenu.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/grafana/setup-k6-action&quot;&gt;setup-k6-action&lt;/a&gt; et &lt;a href=&quot;https://github.com/grafana/run-k6-action&quot;&gt;run-k6-action&lt;/a&gt; sont toutes deux en &lt;code&gt;v1&lt;/code&gt; (vérifié le 9 octobre 2026) :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: load-test
on:
  pull_request:
  workflow_dispatch:

jobs:
  k6:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    env:
      BASE_URL: ${{ vars.STAGING_URL }}
    steps:
      - uses: actions/checkout@v7
      - uses: grafana/setup-k6-action@v1
      - uses: grafana/run-k6-action@v1
        with:
          path: tests/load/smoke.js
          flags: --out json=results.json
      - uses: actions/upload-artifact@v7
        if: always()
        with:
          name: k6-results
          path: results.json
          retention-days: 14
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les seuils se trouvent dans le script, qui lit &lt;code&gt;BASE_URL&lt;/code&gt; dans l&amp;#39;environnement :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;

export const options = {
  vus: 10,
  duration: &amp;quot;1m&amp;quot;,
  thresholds: {
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
  },
};

export default function () {
  http.get(`${__ENV.BASE_URL}/health`);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La documentation de k6 précise que &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;les checks n&amp;#39;ont pas d&amp;#39;effet sur le code de sortie&lt;/a&gt;, si bien que la décision de réussite ou d&amp;#39;échec doit venir des seuils.&lt;/p&gt;
&lt;h2&gt;Comment lancer Artillery, Locust ou JMeter à la place ?&lt;/h2&gt;
&lt;p&gt;Remplacez les étapes d&amp;#39;installation et d&amp;#39;exécution, gardez le reste du workflow et servez-vous du mécanisme propre à chaque outil pour échouer quand un objectif est manqué.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery&lt;/strong&gt; dispose d&amp;#39;une &lt;a href=&quot;https://www.artillery.io/docs/cicd/github-actions&quot;&gt;GitHub Action officielle&lt;/a&gt; dont le &lt;a href=&quot;https://github.com/artilleryio/action-cli&quot;&gt;README&lt;/a&gt; indique que &lt;code&gt;@v2&lt;/code&gt; suit la dernière version 2.x (vérifié le 9 octobre 2026). L&amp;#39;étape devient &lt;code&gt;uses: artilleryio/action-cli@v2&lt;/code&gt; avec &lt;code&gt;command: run --target ${{ vars.STAGING_URL }} tests/load/api.yml --output report.json&lt;/code&gt;, et le &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;plugin ensure&lt;/a&gt; fait sortir Artillery avec un code non nul quand un objectif est manqué. La section &lt;code&gt;config&lt;/code&gt; du script :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  target: &amp;quot;https://staging.example.com&amp;quot;
  phases:
    - duration: 60
      arrivalRate: 5
  plugins:
    ensure:
      thresholds:
        - &amp;quot;http.response_time.p95&amp;quot;: 500
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Locust&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;se termine avec le code 1 dès qu&amp;#39;une requête a échoué&lt;/a&gt;, et pour des règles de latence, vous fixez &lt;code&gt;environment.process_exit_code&lt;/code&gt; dans un écouteur de l&amp;#39;événement &lt;code&gt;quitting&lt;/code&gt;, comme le montre la même page (vérifié le 9 octobre 2026). Après &lt;code&gt;actions/setup-python@v7&lt;/code&gt; avec &lt;code&gt;python-version: &amp;quot;3.13&amp;quot;&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;      - run: pip install locust
      - run: &amp;gt;
          locust -f tests/load/locustfile.py --headless
          -u 20 -r 5 -t 2m -H &amp;quot;$BASE_URL&amp;quot;
          --csv results --html report.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt; tourne sans interface grâce à &lt;code&gt;-n&lt;/code&gt;, et les &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;options de ligne de commande de son manuel&lt;/a&gt; ne prévoient aucun seuil de réussite ou d&amp;#39;échec (vérifié le 9 octobre 2026). Une courte étape peut lire le fichier de résultats, au format CSV avec une colonne &lt;code&gt;success&lt;/code&gt; par défaut, et faire échouer le job elle-même :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;      - uses: actions/setup-java@v6
        with:
          distribution: temurin
          java-version: &amp;quot;21&amp;quot;
      - name: Install JMeter 5.6.3
        env:
          JM_BASE: https://archive.apache.org/dist/jmeter/binaries
        run: curl -sSL &amp;quot;$JM_BASE/apache-jmeter-5.6.3.tgz&amp;quot; | tar -xzf -
      - name: Run the test plan
        run: &amp;gt;
          apache-jmeter-5.6.3/bin/jmeter -n -t tests/load/plan.jmx
          -l results.jtl -e -o report
      - name: Fail above 1% errors
        run: |
          python3 - &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
          import csv, sys
          rows = list(csv.DictReader(open(&amp;quot;results.jtl&amp;quot;)))
          bad = sum(r[&amp;quot;success&amp;quot;] != &amp;quot;true&amp;quot; for r in rows)
          print(f&amp;quot;{bad} of {len(rows)} samples failed&amp;quot;)
          sys.exit(1 if not rows or bad &amp;gt; 0.01 * len(rows) else 0)
          EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Comment faire échouer le job quand le test manque un objectif ?&lt;/h2&gt;
&lt;p&gt;Inscrivez les objectifs dans le test sous forme de seuils et laissez le code de sortie faire le reste. GitHub marque une étape en échec quand sa commande se termine avec un code non nul, et le job échoue avec elle.&lt;/p&gt;
&lt;p&gt;Commencez par un taux d&amp;#39;erreur strict et un percentile de latence généreux, puis resserrez la limite de latence une fois que vous savez de combien vos chiffres varient d&amp;#39;une exécution à l&amp;#39;autre. Le &lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;guide pas à pas du test de charge&lt;/a&gt; explique comment choisir ces objectifs.&lt;/p&gt;
&lt;h2&gt;Où ranger les résultats de chaque exécution ?&lt;/h2&gt;
&lt;p&gt;Envoyez-les comme artefact du workflow, avec &lt;code&gt;if: always()&lt;/code&gt; pour qu&amp;#39;un test en échec garde quand même son rapport. Les artefacts sont conservés 90 jours par défaut, et &lt;code&gt;retention-days&lt;/code&gt; raccourcit cette durée.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/actions/upload-artifact&quot;&gt;README d&amp;#39;upload-artifact&lt;/a&gt; documente les 90 jours par défaut (vérifié le 9 octobre 2026). Réglez &lt;code&gt;if-no-files-found: error&lt;/code&gt; pour qu&amp;#39;un rapport manquant fasse nettement échouer l&amp;#39;étape.&lt;/p&gt;
&lt;h2&gt;Quelle charge un runner hébergé par GitHub peut-il générer ?&lt;/h2&gt;
&lt;p&gt;Assez pour un smoke test ou un petit contrôle de régression. Un runner Linux standard dispose de 4 CPU et 16 Go de RAM dans les dépôts publics, de 2 CPU et 8 Go dans les dépôts privés, et un job s&amp;#39;arrête au bout de 6 heures.&lt;/p&gt;
&lt;p&gt;Ces chiffres viennent de la &lt;a href=&quot;https://docs.github.com/en/actions/reference/runners/github-hosted-runners&quot;&gt;référence des runners&lt;/a&gt; et des &lt;a href=&quot;https://docs.github.com/en/actions/reference/limits&quot;&gt;limites d&amp;#39;Actions&lt;/a&gt; de GitHub (vérifié le 9 octobre 2026), qui ne donnent aucun chiffre de bande passante réseau.&lt;/p&gt;
&lt;p&gt;Un job tourne sur une seule machine et forme donc un seul générateur de charge : si son CPU sature, les temps de réponse incluent le temps d&amp;#39;attente sur le runner lui-même. Chaque requête part aussi de cette machine, si bien que les limiteurs de débit qui comptent par adresse client voient un seul client très actif. GitHub déconseille de mettre en liste d&amp;#39;autorisation les plages d&amp;#39;adresses IP Azure de ses runners Ubuntu ; les runners plus puissants (larger runners) des offres Team et Enterprise Cloud ajoutent du CPU, de la mémoire et des adresses IP statiques.&lt;/p&gt;
&lt;h2&gt;Quand la charge doit-elle venir d&amp;#39;ailleurs ?&lt;/h2&gt;
&lt;p&gt;Quand il vous faut plus de charge qu&amp;#39;une machine n&amp;#39;en produit, du trafic depuis plusieurs régions ou des exécutions plus longues que la limite d&amp;#39;un job.&lt;/p&gt;
&lt;p&gt;Avec k6, &lt;a href=&quot;https://github.com/grafana/run-k6-action&quot;&gt;&lt;code&gt;run-k6-action&lt;/code&gt;&lt;/a&gt; exécute le test sur Grafana Cloud k6 si vous réglez &lt;code&gt;cloud-run-locally: false&lt;/code&gt; et fournissez &lt;code&gt;K6_CLOUD_TOKEN&lt;/code&gt;, &lt;code&gt;K6_CLOUD_PROJECT_ID&lt;/code&gt; et, avec k6 v2, &lt;code&gt;K6_CLOUD_STACK_ID&lt;/code&gt;. Une &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/environment-variables/&quot;&gt;exécution cloud&lt;/a&gt; ignore par défaut l&amp;#39;environnement du runner : ajoutez donc &lt;code&gt;-e BASE_URL=${{ vars.STAGING_URL }}&lt;/code&gt; à &lt;code&gt;flags&lt;/code&gt; (vérifié le 10 octobre 2026). &lt;a href=&quot;https://www.artillery.io/docs/cicd/github-actions&quot;&gt;L&amp;#39;action d&amp;#39;Artillery&lt;/a&gt; peut appeler &lt;code&gt;run-fargate&lt;/code&gt; ou &lt;code&gt;run-lambda&lt;/code&gt; pour générer la charge depuis votre propre compte AWS (les deux vérifiés le 9 octobre 2026). La &lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;comparaison k6 vs Artillery&lt;/a&gt; couvre les deux.&lt;/p&gt;
&lt;p&gt;Pour JMeter, LoadFocus documente une &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/jmeter-load-testing/jmeter-integration-ci-cd/github-actions?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-testing-in-github-actions&quot;&gt;intégration avec GitHub Actions&lt;/a&gt; fondée sur son client npm. Vous enregistrez le test dans votre compte LoadFocus, stockez la clé d&amp;#39;API et l&amp;#39;ID d&amp;#39;équipe comme secrets, puis appelez &lt;code&gt;run-test&lt;/code&gt;. Les options ci-dessous suivent l&amp;#39;aide du client :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;      - run: npm install -g @loadfocus/loadfocus-api-client
      - env:
          LF_KEY: ${{ secrets.LOADFOCUS_API_KEY }}
          LF_TEAM: ${{ secrets.LOADFOCUS_TEAM_ID }}
        run: |
          test -n &amp;quot;$LF_KEY&amp;quot;
          test -n &amp;quot;$LF_TEAM&amp;quot;
          loadfocus-api config set \
            --apikey &amp;quot;$LF_KEY&amp;quot; --teamid &amp;quot;$LF_TEAM&amp;quot;
          loadfocus-api jmeter run-test --name checkout-api \
            --thresholds &amp;quot;avgresponse&amp;lt;=200,errors==0,p95&amp;lt;=250&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le client attend jusqu&amp;#39;à 1 800 secondes par défaut (&lt;code&gt;--wait-timeout&lt;/code&gt; change cette durée) : donnez donc au job un &lt;code&gt;timeout-minutes&lt;/code&gt; supérieur à 30, par exemple 40. Il se termine avec le code 1 quand un seuil n&amp;#39;est pas tenu et avec le code 0 quand la clé d&amp;#39;API ou l&amp;#39;ID d&amp;#39;équipe manque, d&amp;#39;où les lignes &lt;code&gt;test -n&lt;/code&gt;, qui font échouer l&amp;#39;étape dès qu&amp;#39;un secret est vide. La charge vient de LoadFocus, qui &lt;a href=&quot;https://loadfocus.com/fr-fr/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-testing-in-github-actions&quot;&gt;exécute des scripts JMeter depuis 25 régions cloud&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Combien de temps doit durer un test de charge dans une pull request ?&lt;/strong&gt;
Quelques minutes : assez pour dépasser la montée en charge et obtenir un percentile stable, assez peu pour que personne ne l&amp;#39;attende.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A-t-on le droit de lancer des tests de charge depuis les runners hébergés par GitHub ?&lt;/strong&gt;
Les &lt;a href=&quot;https://docs.github.com/en/site-policy/github-terms/github-terms-for-additional-products-and-features&quot;&gt;conditions de GitHub pour Actions&lt;/a&gt; interdisent de perturber un service et réservent les runners hébergés au travail sur le projet du dépôt (vérifié le 9 octobre 2026). Tester la préproduction de ce même projet, sans surcharger les serveurs de GitHub, correspond au type de test que décrivent ces conditions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Puis-je utiliser un runner auto-hébergé à la place ?&lt;/strong&gt;
Oui. Il tourne sur votre propre matériel et votre propre réseau, et la page des limites de GitHub autorise un job jusqu&amp;#39;à 5 jours sur ce type de runner. Il reste un seul générateur de charge.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;Critères de réussite d&amp;#39;un test de charge : comment les fixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;Comment faire un test de charge : le guide pas à pas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery : quel outil de test de charge choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Test de charge Locust : l&apos;outil Python passé en revue</title><link>https://loadtest.app/fr/locust-load-testing/</link><guid isPermaLink="true">https://loadtest.app/fr/locust-load-testing/</guid><description>Test de charge Locust : locustfiles Python, interface web et mode headless, mode distribué, CI, limites, autres outils Python et quand préférer k6.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Locust est un outil de test de charge Python, gratuit et sous licence MIT, dans lequel chaque test est un programme Python, exécuté par des utilisateurs légers depuis une interface web ou la ligne de commande. Le test de charge Locust convient aux équipes qui écrivent du Python et testent surtout des services HTTP. Celles qui ont besoin de nombreux protocoles prêts à l&amp;#39;emploi ou d&amp;#39;un éditeur de tests graphique seront mieux servies par JMeter, et celles qui écrivent du JavaScript par k6.&lt;/p&gt;
&lt;p&gt;Nous n&amp;#39;avons pas exécuté Locust pour cette revue. Les faits proviennent de la documentation, du dépôt et de la page PyPI de Locust, vérifiés le 9 octobre 2026, et les appréciations sont les nôtres.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sujet&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environnement&lt;/td&gt;
&lt;td&gt;Python 3.11 ou plus récent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version actuelle&lt;/td&gt;
&lt;td&gt;2.46.7 (4 octobre 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format des tests&lt;/td&gt;
&lt;td&gt;Classes Python dans un locustfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exécution&lt;/td&gt;
&lt;td&gt;Interface web sur le port 8089, ou headless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocoles intégrés&lt;/td&gt;
&lt;td&gt;HTTP et HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Répartition&lt;/td&gt;
&lt;td&gt;Un master et autant de workers que nécessaire&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Résultats&lt;/td&gt;
&lt;td&gt;Graphiques en direct, CSV, HTML, JSON, OpenTelemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI&lt;/td&gt;
&lt;td&gt;Code de sortie 1 dès qu&amp;#39;une requête échoue&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qui développe Locust, et le projet est-il toujours maintenu ?&lt;/h2&gt;
&lt;p&gt;Lars Holmberg maintient Locust, et Microsoft sponsorise ce travail. Les versions se succèdent vite : 17 depuis le début de 2026.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;README de Locust&lt;/a&gt; cite les deux. &lt;a href=&quot;https://pypi.org/project/locust/&quot;&gt;PyPI&lt;/a&gt; indique la 2.46.7, publiée le 4 octobre 2026, comme dernière version, avec Python 3.11 ou plus récent requis (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Comment fonctionne un locustfile ?&lt;/h2&gt;
&lt;p&gt;Un locustfile est un module Python ordinaire qui contient au moins une classe d&amp;#39;utilisateur. Chaque utilisateur simulé exécute ses tâches l&amp;#39;une après l&amp;#39;autre et marque une pause entre deux, selon son &lt;code&gt;wait_time&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;D&amp;#39;après le &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;guide du locustfile&lt;/a&gt;, &lt;code&gt;HttpUser&lt;/code&gt; donne à chaque utilisateur un &lt;code&gt;client&lt;/code&gt; qui encapsule python-requests, conserve les cookies et enregistre chaque requête. Les méthodes marquées &lt;code&gt;@task&lt;/code&gt; sont tirées au hasard, pondérées par le nombre passé au décorateur, et &lt;code&gt;on_start&lt;/code&gt; s&amp;#39;exécute une fois par utilisateur. Cet utilisateur se connecte, parcourt le catalogue quatre fois plus souvent qu&amp;#39;il ne passe commande, et lance au plus une tâche toutes les 10 secondes :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from locust import HttpUser, task, constant_pacing


class Shopper(HttpUser):
    wait_time = constant_pacing(10)

    def on_start(self):
        self.client.post(&amp;quot;/login&amp;quot;, json={&amp;quot;user&amp;quot;: &amp;quot;demo&amp;quot;})

    @task(4)
    def browse(self):
        self.client.get(&amp;quot;/products?page=2&amp;quot;, name=&amp;quot;/products&amp;quot;)

    @task
    def checkout(self):
        with self.client.post(
            &amp;quot;/checkout&amp;quot;, catch_response=True
        ) as resp:
            if &amp;quot;order_id&amp;quot; not in resp.text:
                resp.failure(&amp;quot;no order id&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;catch_response&lt;/code&gt; permet de faire échouer une requête d&amp;#39;après son contenu, et &lt;code&gt;name&lt;/code&gt; regroupe les URL variables sur une seule ligne des statistiques. Les autres fonctions d&amp;#39;attente sont &lt;code&gt;constant&lt;/code&gt;, &lt;code&gt;between&lt;/code&gt;, &lt;code&gt;constant_throughput&lt;/code&gt; et, depuis la &lt;a href=&quot;https://github.com/locustio/locust/releases/tag/2.46.6&quot;&gt;version 2.46.6&lt;/a&gt;, &lt;code&gt;poisson&lt;/code&gt; ; notre guide sur le &lt;a href=&quot;https://loadtest.app/fr/think-time-in-load-testing/&quot;&gt;temps de réflexion en test de charge&lt;/a&gt; explique comment ces pauses façonnent la charge. La documentation précise que le temps d&amp;#39;attente peut seulement limiter le débit et ne lance pas de nouveaux utilisateurs pour atteindre un rythme cible. Un test Locust est donc un groupe fixe d&amp;#39;utilisateurs : un &lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;modèle de charge fermé&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Faut-il utiliser l&amp;#39;interface web ou le mode headless ?&lt;/h2&gt;
&lt;p&gt;L&amp;#39;interface web pour explorer, le mode headless pour des exécutions reproductibles.&lt;/p&gt;
&lt;p&gt;La commande &lt;code&gt;locust&lt;/code&gt; lance une &lt;a href=&quot;https://docs.locust.io/en/stable/quickstart.html&quot;&gt;interface web&lt;/a&gt; sur le port 8089. Vous y indiquez l&amp;#39;hôte, le nombre d&amp;#39;utilisateurs et la montée en charge, suivez des graphiques en direct et modifiez la charge en cours de test. Le &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;mode headless&lt;/a&gt; reprend les mêmes réglages sous forme d&amp;#39;options :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;locust -f locustfile.py --headless -u 200 -r 10 -t 10m \
  --host https://staging.example.com \
  --csv results --html report.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-u&lt;/code&gt; fixe le nombre d&amp;#39;utilisateurs, &lt;code&gt;-r&lt;/code&gt; le nombre d&amp;#39;utilisateurs démarrés par seconde et &lt;code&gt;-t&lt;/code&gt; la durée, montée en charge comprise. Les mêmes réglages peuvent aussi être définis dans &lt;code&gt;locust.conf&lt;/code&gt; ou &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Comment fonctionne le mode distribué ?&lt;/h2&gt;
&lt;p&gt;Un processus master gère l&amp;#39;interface web et coordonne, tandis que des processus workers exécutent les utilisateurs et lui renvoient leurs statistiques. Il faut un worker par cœur de CPU, car un processus Python ne peut pas exploiter pleinement plus d&amp;#39;un cœur.&lt;/p&gt;
&lt;p&gt;D&amp;#39;après la &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;documentation sur la charge distribuée&lt;/a&gt;, un seul processus dépasse mille requêtes par seconde sur un plan de test simple ; pour aller plus loin, on répartit la charge :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# sur la machine master
locust -f locustfile.py --master
# sur chaque machine worker, un worker par cœur
locust -f - --worker --master-host 10.0.0.5 --processes -1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-f -&lt;/code&gt; récupère le locustfile auprès du master. &lt;code&gt;--processes&lt;/code&gt; repose sur &lt;code&gt;fork()&lt;/code&gt; et ne fonctionne donc pas sous Windows, et toute modification du locustfile impose de redémarrer tous les processus. La documentation décrit aussi un &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;opérateur Kubernetes&lt;/a&gt; et &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;Azure Load Testing&lt;/a&gt; (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, l&amp;#39;éditeur de ce site, n&amp;#39;exécute pas de tests Locust. Il &lt;a href=&quot;https://loadfocus.com/fr-fr/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-load-testing&quot;&gt;exécute des plans de test JMeter et des scripts k6&lt;/a&gt; depuis 25 régions cloud ; pour Locust, les voies ci-dessus restent donc les moyens de monter en charge.&lt;/p&gt;
&lt;h2&gt;Locust peut-il tester d&amp;#39;autres protocoles que HTTP ?&lt;/h2&gt;
&lt;p&gt;Oui, à condition d&amp;#39;apporter un client Python pour le protocole. Seuls HTTP et HTTPS sont intégrés.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;page consacrée aux autres protocoles&lt;/a&gt; montre comment encapsuler un client pour que chaque appel soit enregistré, avec des exemples pour XML-RPC et gRPC et des classes d&amp;#39;utilisateur expérimentales pour MQTT, Socket.IO et OpenAI. Le projet distinct &lt;a href=&quot;https://github.com/SvenskaSpel/locust-plugins&quot;&gt;locust-plugins&lt;/a&gt; ajoute des utilisateurs pour Kafka, FTP, Selenium et Playwright (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;Pour HTTP, il existe aussi &lt;a href=&quot;https://docs.locust.io/en/stable/increase-performance.html&quot;&gt;&lt;code&gt;FastHttpUser&lt;/code&gt;&lt;/a&gt;, qui s&amp;#39;appuie sur geventhttpclient et consomme beaucoup moins de CPU. Dans le meilleur des cas, selon la documentation, un processus atteint environ 16 000 requêtes par seconde, contre 4 000 avec &lt;code&gt;HttpUser&lt;/code&gt;. &lt;code&gt;FastHttpUser&lt;/code&gt; ne rend pas chaque requête plus rapide, et il ne vérifie pas les certificats TLS par défaut.&lt;/p&gt;
&lt;h2&gt;Quels rapports Locust fournit-il, et comment s&amp;#39;intègre-t-il à la CI ?&lt;/h2&gt;
&lt;p&gt;Vous obtenez des graphiques en direct dans l&amp;#39;interface web et, à la demande, des fichiers de résultats. En CI, Locust se termine avec le code 1 si une requête a échoué.&lt;/p&gt;
&lt;p&gt;D&amp;#39;après la &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;référence de configuration&lt;/a&gt;, &lt;code&gt;--csv&lt;/code&gt; écrit des fichiers de statistiques, d&amp;#39;historique et d&amp;#39;échecs, &lt;code&gt;--html&lt;/code&gt; enregistre un rapport et &lt;code&gt;--json&lt;/code&gt; affiche les statistiques finales. &lt;code&gt;--otel&lt;/code&gt; exporte vers un backend &lt;a href=&quot;https://docs.locust.io/en/stable/telemetry.html&quot;&gt;OpenTelemetry&lt;/a&gt;. La documentation du mode headless montre un listener qui fait échouer l&amp;#39;exécution selon le taux d&amp;#39;échec, le temps de réponse moyen ou le 95e percentile, et notre guide du &lt;a href=&quot;https://loadtest.app/fr/load-testing-in-github-actions/&quot;&gt;test de charge dans GitHub Actions&lt;/a&gt; l&amp;#39;intègre à un workflow.&lt;/p&gt;
&lt;h2&gt;Quels sont les points forts de Locust, et où sont ses limites ?&lt;/h2&gt;
&lt;p&gt;Locust brille par sa logique de test et avec de nombreux utilisateurs simultanés qui attendent la plupart du temps. Il est plus faible sur le nombre de requêtes par processus et sur les protocoles qu&amp;#39;il faut brancher soi-même.&lt;/p&gt;
&lt;p&gt;Comme les tests sont du Python pur, boucles, conditions, données générées et votre propre client d&amp;#39;API fonctionnent tous, et les tests vivent dans le contrôle de version. La page &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; explique que le faible coût de chaque utilisateur convient aux charges très concurrentes, tout en admettant que d&amp;#39;autres outils peuvent envoyer plus de requêtes par seconde sur le même matériel.&lt;/p&gt;
&lt;p&gt;Les limites que la documentation reconnaît elle-même :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un processus Python n&amp;#39;utilise qu&amp;#39;un seul cœur de CPU.&lt;/li&gt;
&lt;li&gt;Les bibliothèques qui font leurs E/S en C bloquent le processus, sauf si gevent peut les patcher.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HttpUser&lt;/code&gt; n&amp;#39;analyse pas le HTML et ne charge pas les ressources des pages.&lt;/li&gt;
&lt;li&gt;Le temps d&amp;#39;attente ne peut pas ajouter d&amp;#39;utilisateurs pour tenir un débit de requêtes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quels autres outils Python existent pour les tests de charge ?&lt;/h2&gt;
&lt;p&gt;Locust est le moteur Python activement développé. Molotov, la principale alternative, n&amp;#39;a publié aucune version sur PyPI depuis 2022, et Taurus exécute Locust via l&amp;#39;un de ses exécuteurs.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tarekziade/molotov&quot;&gt;Molotov&lt;/a&gt; est un outil pour Python 3.8+ construit sur asyncio et aiohttp ; sa &lt;a href=&quot;https://pypi.org/project/molotov/&quot;&gt;dernière version sur PyPI&lt;/a&gt; est la 2.6, du 21 octobre 2022, et le dernier commit de sa branche principale date de novembre 2023 (vérifié le 21 octobre 2026). &lt;a href=&quot;https://gettaurus.org/docs/Locust/&quot;&gt;Taurus&lt;/a&gt; exécute un locustfile, ou de simples requêtes GET et POST écrites en YAML, via son exécuteur &lt;code&gt;locust&lt;/code&gt;. Vous installez Locust vous-même, en mode distribué Taurus ne lance que le master, et son réglage &lt;code&gt;throughput&lt;/code&gt; n&amp;#39;a aucun effet avec cet exécuteur (vérifié le 21 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quand choisir plutôt k6, JMeter ou Gatling ?&lt;/h2&gt;
&lt;p&gt;Choisissez un autre outil quand son langage, ses protocoles ou son modèle de charge conviennent mieux à votre équipe.&lt;/p&gt;
&lt;p&gt;Notre panorama des &lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;outils de test de charge open source&lt;/a&gt; place Locust à côté de cinq autres.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;k6&lt;/strong&gt; si votre équipe écrit du JavaScript, veut des critères de réussite sous forme de &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; dans le script, ou a besoin d&amp;#39;un modèle de charge ouvert, que fournissent les &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;exécuteurs arrival-rate&lt;/a&gt; de k6 (vérifié le 9 octobre 2026). LoadFocus &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-load-testing&quot;&gt;exécute des scripts k6&lt;/a&gt; depuis 25 régions cloud, mais lance les scénarios arrival-rate avec un nombre fixe d&amp;#39;utilisateurs : pour tenir un débit de requêtes, exécutez-les avec k6 lui-même.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;JMeter&lt;/strong&gt; si vous avez besoin de JDBC, JMS, LDAP ou FTP prêts à l&amp;#39;emploi, comme le liste son &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt;, ou si vos testeurs construisent leurs tests dans une interface graphique. &lt;a href=&quot;https://loadtest.app/fr/locust-vs-jmeter/&quot;&gt;Locust vs JMeter&lt;/a&gt; compare les deux en détail.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt &lt;strong&gt;Gatling&lt;/strong&gt; si votre équipe travaille sur la JVM et veut des &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;profils d&amp;#39;injection&lt;/a&gt; ouverts et fermés dans une même API (vérifié le 9 octobre 2026). &lt;a href=&quot;https://loadtest.app/fr/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter&lt;/a&gt; le présente plus en détail.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Locust est-il gratuit pour un usage commercial ?&lt;/strong&gt;
Oui. Locust est publié sous licence MIT, qui autorise l&amp;#39;usage commercial, la modification et la redistribution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle version de Python faut-il pour Locust ?&lt;/strong&gt;
Python 3.11 ou plus récent, d&amp;#39;après ses métadonnées PyPI. Installez-le avec &lt;code&gt;pip install locust&lt;/code&gt;, ou lancez-le dans un environnement temporaire avec &lt;code&gt;uvx locust&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des tests Locust ?&lt;/strong&gt;
Non. LoadFocus exécute des plans de test JMeter et des scripts k6. Pour monter un test Locust en charge, utilisez son mode master et workers, l&amp;#39;opérateur Kubernetes ou Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-vs-jmeter/&quot;&gt;Locust vs JMeter : scripts Python ou plans de test JMeter ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;Outils de test de charge open source : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/k6-vs-locust/&quot;&gt;k6 vs Locust : scripts JavaScript ou utilisateurs Python ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-locust/&quot;&gt;Gatling vs Locust : simulations JVM ou locustfiles Python ?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Locust vs JMeter : scripts Python ou plans de test JMeter ?</title><link>https://loadtest.app/fr/locust-vs-jmeter/</link><guid isPermaLink="true">https://loadtest.app/fr/locust-vs-jmeter/</guid><description>Locust et JMeter comparés : licence, scripts, protocoles, exécution distribuée, CI et rapports, avec des conseils clairs pour savoir lequel choisir.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Locust et Apache JMeter sont deux outils de test de charge gratuits et open source, et le bon choix dépend surtout de la façon dont votre équipe veut construire ses tests. Choisissez Locust si votre équipe écrit du Python et veut une logique de test sous forme de code ordinaire, exécutée par des utilisateurs légers et événementiels. Choisissez JMeter si vous avez besoin de protocoles au-delà de HTTP comme JDBC, JMS ou LDAP, si vous préférez construire vos tests dans une interface graphique, ou si vous avez déjà une bibliothèque de plans de test &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Les informations de ce comparatif Locust vs JMeter viennent de la documentation et du dépôt de chaque projet, vérifiées le 9 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;th&gt;Apache JMeter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Apache 2.0 (&lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environnement d&amp;#39;exécution&lt;/td&gt;
&lt;td&gt;Python 3.11 ou plus récent&lt;/td&gt;
&lt;td&gt;Java 8 ou plus récent (version 5.6.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests écrits en&lt;/td&gt;
&lt;td&gt;Code Python dans un locustfile&lt;/td&gt;
&lt;td&gt;Plans de test construits dans une interface graphique, enregistrés en XML (&lt;code&gt;.jmx&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface graphique&lt;/td&gt;
&lt;td&gt;Interface web pour lancer, ajuster et suivre un test en cours&lt;/td&gt;
&lt;td&gt;IDE de bureau pour enregistrer, construire et déboguer des plans de test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocoles intégrés&lt;/td&gt;
&lt;td&gt;HTTP et HTTPS ; les autres via un client Python&lt;/td&gt;
&lt;td&gt;HTTP(S), SOAP/REST, FTP, JDBC, LDAP, JMS, mail, TCP, commandes shell, objets Java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Utilisateurs virtuels&lt;/td&gt;
&lt;td&gt;Un greenlet par utilisateur sur gevent (événementiel)&lt;/td&gt;
&lt;td&gt;Un thread Java par utilisateur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mode distribué&lt;/td&gt;
&lt;td&gt;Un master et autant de workers que nécessaire&lt;/td&gt;
&lt;td&gt;Un client qui pilote des serveurs JMeter distants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI et exécution sans interface&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--headless&lt;/code&gt;, code de sortie 1 si des requêtes échouent&lt;/td&gt;
&lt;td&gt;Mode CLI (&lt;code&gt;jmeter -n&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rapports&lt;/td&gt;
&lt;td&gt;Graphiques en direct dans l&amp;#39;interface web, fichiers CSV, rapport HTML&lt;/td&gt;
&lt;td&gt;Tableau de bord HTML, résultats en direct via un Backend Listener&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelle est la différence entre Locust et JMeter ?&lt;/h2&gt;
&lt;p&gt;Dans Locust, un test est un programme Python. Dans JMeter, un test est un plan que vous assemblez dans une interface graphique de bureau puis enregistrez dans un fichier, et la plupart des autres différences en découlent.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;README&lt;/a&gt; de Locust décrit des tests écrits avec des boucles, des conditions et des bibliothèques Python ordinaires. Locust s&amp;#39;installe avec &lt;code&gt;pip install locust&lt;/code&gt; et demande Python 3.11 ou plus récent, d&amp;#39;après ses &lt;a href=&quot;https://github.com/locustio/locust/blob/master/pyproject.toml&quot;&gt;métadonnées de paquet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Un test JMeter est un arbre d&amp;#39;éléments : un Thread Group pour les utilisateurs, des samplers pour les requêtes, des assertions et des listeners pour les résultats. JMeter 5.6.3, la version actuelle sur la &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;page de téléchargement&lt;/a&gt;, demande Java 8 ou plus récent. Le README de la &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/README.md&quot;&gt;branche de développement&lt;/a&gt; de JMeter exige déjà Java 17 (vérifié le 10 octobre 2026). Quand une étape a besoin d&amp;#39;une vraie logique, un sampler JSR223 exécute un script Groovy à l&amp;#39;intérieur du plan.&lt;/p&gt;
&lt;h2&gt;Comment écrit-on un test avec chaque outil ?&lt;/h2&gt;
&lt;p&gt;Dans Locust, vous écrivez une classe Python pour chaque type d&amp;#39;utilisateur, avec des méthodes marquées comme tâches. Dans JMeter, vous ajoutez un Thread Group et des samplers dans l&amp;#39;interface graphique, vous enregistrez le plan puis vous le lancez en ligne de commande.&lt;/p&gt;
&lt;p&gt;Un utilisateur Locust qui attend une à trois secondes entre deux tâches et consulte la liste des utilisateurs trois fois plus souvent qu&amp;#39;une fiche individuelle :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from locust import HttpUser, task, between


class ApiUser(HttpUser):
    wait_time = between(1, 3)

    @task(3)
    def list_users(self):
        self.client.get(&amp;quot;/api/users&amp;quot;)

    @task
    def view_user(self):
        self.client.get(&amp;quot;/api/users/42&amp;quot;, name=&amp;quot;/api/users/[id]&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lancement sans interface avec 50 utilisateurs, cinq nouveaux par seconde, pendant cinq minutes :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;locust -f locustfile.py --headless -u 50 -r 5 \
  --run-time 5m --host https://staging.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans JMeter, le même test est un Thread Group de 50 threads avec une durée de montée en charge, qui contient deux samplers HTTP Request. Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;guide de démarrage&lt;/a&gt; lance un plan enregistré en mode CLI, et &lt;code&gt;-e -o&lt;/code&gt; ajoute le rapport HTML à la fin :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;jmeter -n -t api-users.jmx -l results.jtl -e -o report/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le fichier &lt;code&gt;.jmx&lt;/code&gt; est du XML, comme le montrent les &lt;a href=&quot;https://raw.githubusercontent.com/apache/jmeter/master/bin/examples/CSVSample.jmx&quot;&gt;exemples livrés avec JMeter&lt;/a&gt;, et il se relit moins facilement en pull request que du Python. JMeter sait aussi enregistrer un plan depuis un navigateur ; l&amp;#39;équivalent côté Locust est &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;har2locust&lt;/a&gt;, un convertisseur d&amp;#39;enregistrements HAR en locustfile encore en bêta (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Quels protocoles chaque outil peut-il tester ?&lt;/h2&gt;
&lt;p&gt;JMeter couvre beaucoup plus de protocoles d&amp;#39;origine. Locust fournit HTTP et HTTPS et vous laisse apporter un client Python pour tout le reste.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt; de JMeter cite HTTP et HTTPS, SOAP et REST, FTP, les bases de données via JDBC, LDAP, la messagerie JMS, le mail en SMTP, POP3 et IMAP, TCP, les commandes natives et les objets Java. JDBC et JMS demandent les fichiers JAR du pilote, fournis par l&amp;#39;éditeur de votre base de données ou de votre solution JMS.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;page sur les autres protocoles&lt;/a&gt; de la documentation Locust montre comment encapsuler une bibliothèque de protocole, avec des exemples pour gRPC, XML-RPC et MQTT, et renvoie à locust-plugins pour Kafka, Selenium et Playwright (vérifié le 9 octobre 2026). La bibliothèque doit être compatible avec gevent, car des entrées-sorties faites en code C compilé bloquent tout le processus ; la documentation cite le pilote PostgreSQL psycopg2, qui a besoin d&amp;#39;un paquet supplémentaire. Pour tester une base de données sous charge, le sampler JDBC de JMeter est le chemin le plus court.&lt;/p&gt;
&lt;h2&gt;Comment fonctionnent les utilisateurs virtuels dans Locust et JMeter ?&lt;/h2&gt;
&lt;p&gt;JMeter exécute chaque utilisateur virtuel dans un thread Java. Locust exécute chaque utilisateur dans un greenlet sur la boucle d&amp;#39;événements de gevent, ce qui réduit le coût de chaque utilisateur.&lt;/p&gt;
&lt;p&gt;Chaque thread d&amp;#39;un &lt;a href=&quot;https://jmeter.apache.org/usermanual/test_plan.html&quot;&gt;Thread Group&lt;/a&gt; JMeter exécute tout le plan de façon indépendante. JMeter démarre par défaut avec un tas (heap) de 1 Go, ce qui, selon son guide, peut ne pas suffire pour des plans plus lourds et de nombreux threads.&lt;/p&gt;
&lt;p&gt;D&amp;#39;après son README, un seul processus Locust peut gérer plusieurs milliers d&amp;#39;utilisateurs simultanés. La &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;documentation sur la charge distribuée&lt;/a&gt; précise qu&amp;#39;un processus Python ne peut pas exploiter pleinement plus d&amp;#39;un cœur de processeur : on lance donc un worker par cœur, ce que &lt;code&gt;--processes&lt;/code&gt; fait pour vous sur une seule machine.&lt;/p&gt;
&lt;h2&gt;Comment répartir un test sur plusieurs machines ?&lt;/h2&gt;
&lt;p&gt;Les deux outils ont un mode distribué intégré. Dans Locust, un master pilote des workers qui exécutent les utilisateurs, et dans JMeter, le client lance le plan de test complet sur chaque serveur distant.&lt;/p&gt;
&lt;p&gt;Dans Locust, un processus lancé avec &lt;code&gt;--master&lt;/code&gt; fait tourner l&amp;#39;interface web et indique aux processus &lt;code&gt;--worker&lt;/code&gt; quand démarrer et arrêter des utilisateurs. La documentation de Locust présente aussi un &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;opérateur Kubernetes&lt;/a&gt; et &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;Azure Load Testing&lt;/a&gt;, un service Microsoft qui exécute des tests Locust dans le cloud (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;mode de test distant&lt;/a&gt; de JMeter permet à un client de piloter autant de serveurs que nécessaire via RMI. Chaque serveur exécute tout le plan : 1 000 threads sur six serveurs donnent donc 6 000 threads. Tous les nœuds devraient utiliser la même version de JMeter et de Java, RMI a besoin d&amp;#39;un keystore sauf si SSL est désactivé, et les fichiers de données doivent être copiés sur chaque serveur.&lt;/p&gt;
&lt;p&gt;Il existe une troisième voie pour les plans de test JMeter. LoadFocus, l&amp;#39;éditeur de ce site, &lt;a href=&quot;https://loadfocus.com/fr-fr/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-vs-jmeter&quot;&gt;exécute vos plans de test JMeter existants&lt;/a&gt; sans modification depuis 25 régions cloud, sans serveurs distants à configurer. LoadFocus n&amp;#39;exécute pas les tests Locust : pour Locust, les options ci-dessus restent les moyens de monter en charge.&lt;/p&gt;
&lt;h2&gt;Comment s&amp;#39;intègrent-ils à la CI, et quels rapports obtient-on ?&lt;/h2&gt;
&lt;p&gt;Les deux s&amp;#39;exécutent sans interface, en ligne de commande. Locust se termine en plus avec le code de sortie 1 quand des requêtes échouent, et JMeter produit le rapport HTML le plus complet.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;documentation du mode headless&lt;/a&gt; de Locust montre un court écouteur d&amp;#39;événement qui fixe le code de sortie selon le taux d&amp;#39;échec, le temps de réponse moyen ou le 95e percentile, ainsi qu&amp;#39;un exemple pour GitHub Actions. Les options &lt;code&gt;--csv&lt;/code&gt; et &lt;code&gt;--html&lt;/code&gt; enregistrent les résultats et un rapport après l&amp;#39;exécution.&lt;/p&gt;
&lt;p&gt;La documentation de JMeter est claire : les tests de charge se lancent en mode CLI, et l&amp;#39;interface graphique sert à construire et à déboguer. Son README renvoie à des bibliothèques tierces pour Maven, Gradle et Jenkins. Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;tableau de bord JMeter&lt;/a&gt; comprend une table APDEX, un tableau de statistiques avec trois percentiles configurables, des synthèses d&amp;#39;erreurs et des graphiques de temps de réponse.&lt;/p&gt;
&lt;h2&gt;Quel outil choisir ?&lt;/h2&gt;
&lt;p&gt;Choisissez Locust si votre équipe écrit du Python et veut relire ses tests de charge comme le reste de son code. Choisissez plutôt JMeter si vous avez besoin de protocoles au-delà de HTTP, si vos testeurs préfèrent une interface graphique ou si vous avez déjà des plans &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Locust convient aux scénarios avec des boucles, des branchements et des données générées, aux tests qui réutilisent un client Python interne pour votre API, et à une forte concurrence d&amp;#39;utilisateurs qui passent la plupart de leur temps à attendre.&lt;/p&gt;
&lt;p&gt;JMeter est le meilleur choix pour tester JDBC, JMS, LDAP, FTP ou le mail, là où Locust demanderait un client à maintenir vous-même, ainsi que pour les testeurs qui enregistrent un parcours dans le navigateur et l&amp;#39;affinent visuellement. Une entreprise qui utilise déjà JMeter conserve en outre ses plans et son savoir-faire.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Locust est-il plus rapide que JMeter ?&lt;/strong&gt;
Nous ne l&amp;#39;avons pas mesuré nous-mêmes, donc nous ne désignerons pas de gagnant. La comparaison honnête consiste à lancer le même scénario avec les deux outils sur votre propre matériel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust peut-il exécuter des fichiers .jmx de JMeter ?&lt;/strong&gt;
Pas d&amp;#39;après sa documentation, qui décrit les tests uniquement comme des locustfiles Python. Passer un plan de test JMeter à Locust revient à le réécrire en Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des tests Locust ?&lt;/strong&gt;
Non. LoadFocus exécute des scripts JMeter et k6. Pour étendre un test Locust au-delà d&amp;#39;une machine, utilisez le mode master et workers de Locust, son opérateur Kubernetes ou Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-load-testing/&quot;&gt;Test de charge Locust : l&amp;#39;outil Python passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter : du code ou un plan de test graphique ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery : quel outil de test de charge choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/k6-vs-locust/&quot;&gt;k6 vs Locust : scripts JavaScript ou utilisateurs Python ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-locust/&quot;&gt;Gatling vs Locust : simulations JVM ou locustfiles Python ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/jmeter-vs-postman/&quot;&gt;JMeter vs Postman : quel outil pour tester la charge ?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Modèle de charge ouvert ou fermé : lequel choisir ?</title><link>https://loadtest.app/fr/open-vs-closed-workload-model/</link><guid isPermaLink="true">https://loadtest.app/fr/open-vs-closed-workload-model/</guid><description>Modèle de charge ouvert ou fermé : pourquoi un test fermé masque la saturation et comment k6, Gatling, Locust et JMeter expriment chaque modèle.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;Choisir un modèle de charge ouvert ou fermé dépend surtout de la façon dont les utilisateurs atteignent votre système. Prenez le modèle ouvert, qui démarre de nouvelles itérations à un taux d&amp;#39;arrivée fixé, pour les sites et API publics où les utilisateurs continuent d&amp;#39;arriver même quand vous ralentissez, et le modèle fermé, un nombre fixe d&amp;#39;utilisateurs virtuels qui attendent chacun la fin de leur itération précédente, seulement là où le système plafonne lui-même la concurrence. Le choix pèse surtout en saturation, quand un test fermé freine sa propre charge et fait paraître le système plus sain qu&amp;#39;il ne l&amp;#39;est.&lt;/p&gt;
&lt;p&gt;Les faits sur les outils viennent de la documentation de chaque projet, vérifiée le 9 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Modèle ouvert&lt;/th&gt;
&lt;th&gt;Modèle fermé&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Vous fixez&lt;/td&gt;
&lt;td&gt;Nouvelles itérations ou nouveaux utilisateurs par seconde&lt;/td&gt;
&lt;td&gt;Utilisateurs virtuels simultanés&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quand les réponses ralentissent&lt;/td&gt;
&lt;td&gt;Le travail continue d&amp;#39;arriver, les files d&amp;#39;attente grossissent&lt;/td&gt;
&lt;td&gt;Les utilisateurs attendent, la charge envoyée baisse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Systèmes réels de ce type&lt;/td&gt;
&lt;td&gt;La plupart des sites et API publics&lt;/td&gt;
&lt;td&gt;Centres d&amp;#39;appels, files de billetterie, pools de workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant-arrival-rate&lt;/code&gt;, &lt;code&gt;ramping-arrival-rate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant-vus&lt;/code&gt;, &lt;code&gt;ramping-vus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;injectClosed&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Approché avec &lt;code&gt;constant_throughput&lt;/code&gt; ou &lt;code&gt;poisson&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Utilisateurs avec un &lt;code&gt;wait_time&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Open Model Thread Group, plugin Arrivals&lt;/td&gt;
&lt;td&gt;Thread Group&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelle est la différence entre un modèle de charge ouvert et un modèle fermé ?&lt;/h2&gt;
&lt;p&gt;Dans un modèle ouvert, c&amp;#39;est le générateur de charge qui décide quand le travail arrive, et dans un modèle fermé, c&amp;#39;est le temps de réponse du système.&lt;/p&gt;
&lt;p&gt;La documentation de k6 le dit clairement : dans le &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;modèle fermé&lt;/a&gt;, l&amp;#39;itération suivante d&amp;#39;un utilisateur virtuel ne démarre qu&amp;#39;une fois la précédente terminée, alors que dans le modèle ouvert les nouvelles itérations arrivent indépendamment de la fin des précédentes (vérifié le 9 octobre 2026). Un test fermé avec 50 &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/what-are-virtual-users-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-vs-closed-workload-model&quot;&gt;utilisateurs virtuels&lt;/a&gt; n&amp;#39;a jamais plus de 50 itérations en cours. Un test ouvert à 50 itérations par seconde en lance 50 de plus chaque seconde, et si chacune dure plus longtemps, davantage se chevauchent.&lt;/p&gt;
&lt;h2&gt;Pourquoi un modèle fermé masque-t-il la latence quand le système sature ?&lt;/h2&gt;
&lt;p&gt;Parce que le test ralentit en même temps que le système. Quand les réponses prennent plus de temps, chaque utilisateur d&amp;#39;un modèle fermé envoie moins de requêtes, et la charge baisse au moment précis où vous vouliez la voir monter.&lt;/p&gt;
&lt;p&gt;La documentation de k6 décrit l&amp;#39;effet : des réponses plus lentes allongent les itérations et réduisent le taux d&amp;#39;arrivée des nouvelles. La &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;page de Gatling sur les modèles de charge&lt;/a&gt; va plus loin et qualifie de test cassé, qui vérifie un comportement imaginaire, un modèle fermé appliqué à un système en réalité ouvert (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;Un test fermé montre donc des temps de réponse qui plafonnent, car il ne peut jamais y avoir plus de requêtes en cours que d&amp;#39;utilisateurs. Un test ouvert montre la file qui grossit, avec des temps de réponse qui montent tant que les arrivées dépassent ce que le système traite. C&amp;#39;est cette seconde image que vos utilisateurs verraient, et les &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-vs-closed-workload-model&quot;&gt;temps de réponse p95 et p99&lt;/a&gt; que vous lisez à la fin ne valent que ce que vaut le modèle de charge qui les a produits.&lt;/p&gt;
&lt;p&gt;La documentation de k6 note qu&amp;#39;une partie de la littérature sur les tests appelle ce problème &lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;. Un article USENIX de 2006 cité par la documentation de Gatling, &lt;a href=&quot;https://www.usenix.org/legacy/event/nsdi06/tech/full_papers/schroeder/schroeder.pdf&quot;&gt;Open Versus Closed: A Cautionary Tale&lt;/a&gt;, conclut que les deux modèles donnent des résultats nettement différents, même avec la même charge et les mêmes demandes de service.&lt;/p&gt;
&lt;h2&gt;Quel modèle correspond à votre trafic réel ?&lt;/h2&gt;
&lt;p&gt;Prenez un modèle ouvert pour tout ce que le public peut atteindre, et un modèle fermé seulement là où le système limite lui-même le nombre d&amp;#39;utilisateurs actifs en même temps.&lt;/p&gt;
&lt;p&gt;La documentation de Gatling cite comme systèmes fermés les centres d&amp;#39;appels où tous les opérateurs sont occupés et les sites de billetterie qui placent les utilisateurs dans une file d&amp;#39;attente à pleine capacité, et indique que la plupart des sites web se comportent comme des systèmes ouverts. Un traitement par lots avec un nombre fixe de workers, ou un consommateur de file à concurrence fixée, est fermé lui aussi. Les API publiques, les pages web et les webhooks sont ouverts : rien ne retient la requête suivante parce que la précédente a été lente.&lt;/p&gt;
&lt;p&gt;Beaucoup de systèmes se situent entre les deux : une cliente arrive à son propre rythme, puis attend chaque page pendant sa visite. L&amp;#39;article cité plus haut parle de modèle partiellement ouvert. Dans k6 ou Gatling, fixez le taux d&amp;#39;arrivée des sessions et faites de chaque itération un parcours utilisateur complet, avec ses propres pauses.&lt;/p&gt;
&lt;h2&gt;Comment régler chaque modèle dans k6 ?&lt;/h2&gt;
&lt;p&gt;Par l&amp;#39;executor. &lt;code&gt;constant-vus&lt;/code&gt; et &lt;code&gt;ramping-vus&lt;/code&gt; donnent un modèle fermé, &lt;code&gt;constant-arrival-rate&lt;/code&gt; et &lt;code&gt;ramping-arrival-rate&lt;/code&gt; un modèle ouvert.&lt;/p&gt;
&lt;p&gt;Un scénario fermé définit &lt;code&gt;executor: &amp;quot;constant-vus&amp;quot;&lt;/code&gt; avec un nombre de &lt;code&gt;vus&lt;/code&gt; et une &lt;code&gt;duration&lt;/code&gt;. Un scénario ouvert fixe plutôt un taux, et vous préallouez assez d&amp;#39;utilisateurs virtuels pour le tenir :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;export const options = {
  scenarios: {
    open_model: {
      executor: &amp;quot;constant-arrival-rate&amp;quot;,
      rate: 50,
      timeUnit: &amp;quot;1s&amp;quot;,
      duration: &amp;quot;5m&amp;quot;,
      preAllocatedVUs: 100,
    },
  },
  thresholds: {
    dropped_iterations: [&amp;quot;count&amp;lt;10&amp;quot;],
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;k6 &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/arrival-rate-vu-allocation/&quot;&gt;ne démarre une itération que s&amp;#39;il dispose d&amp;#39;un utilisateur virtuel libre&lt;/a&gt;, et sa documentation déconseille de compter sur &lt;code&gt;maxVUs&lt;/code&gt;, car ajouter des utilisateurs en cours de test peut surcharger le générateur de charge. Quand aucun utilisateur n&amp;#39;est libre, k6 enregistre une &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;itération abandonnée&lt;/a&gt;, ce qui, tard dans un test, signifie souvent que le système ralentit. Le seuil ci-dessus fait échouer l&amp;#39;exécution à partir de dix. Ne mettez pas de &lt;code&gt;sleep()&lt;/code&gt; à la fin d&amp;#39;une itération à taux d&amp;#39;arrivée, puisque l&amp;#39;executor cadence déjà les démarrages (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;Si vous exécutez des scripts k6 sur LoadFocus, son &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-vs-closed-workload-model&quot;&gt;exécution k6 dans le cloud&lt;/a&gt; prend la charge dans les réglages du test, et son validateur de script prévient que les scénarios à taux d&amp;#39;arrivée y tournent avec un nombre fixe d&amp;#39;utilisateurs, si bien que le débit de requêtes n&amp;#39;est pas maintenu. Pour un vrai test en modèle ouvert, lancez les executors à taux d&amp;#39;arrivée avec k6 lui-même, ou sur un service qui les exécute tels qu&amp;#39;ils sont écrits.&lt;/p&gt;
&lt;h2&gt;Comment Gatling, Locust et JMeter expriment-ils chaque modèle ?&lt;/h2&gt;
&lt;p&gt;Gatling sépare les deux modèles dans son API, JMeter propose les deux à travers des thread groups différents, et Locust est construit autour d&amp;#39;un nombre fixe d&amp;#39;utilisateurs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; Un scénario utilise soit &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;, soit &lt;code&gt;injectClosed&lt;/code&gt;&lt;/a&gt;. Les étapes ouvertes comme &lt;code&gt;constantUsersPerSec&lt;/code&gt; et &lt;code&gt;rampUsersPerSec&lt;/code&gt; fixent des taux d&amp;#39;arrivée, les étapes fermées comme &lt;code&gt;constantConcurrentUsers&lt;/code&gt; et &lt;code&gt;rampConcurrentUsers&lt;/code&gt; fixent la concurrence. &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;Un même profil d&amp;#39;injection ne peut pas mélanger les deux&lt;/a&gt; (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust.&lt;/strong&gt; Vous fixez un nombre d&amp;#39;utilisateurs, et le &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;wait_time&lt;/code&gt;&lt;/a&gt; de chaque utilisateur règle la pause entre les tâches. &lt;code&gt;constant_throughput&lt;/code&gt; et &lt;code&gt;constant_pacing&lt;/code&gt; ajustent cette pause pour que chaque utilisateur exécute au plus un nombre donné de tâches par seconde, mais la documentation précise que le temps d&amp;#39;attente ne peut que limiter le débit et ne lance pas de nouveaux utilisateurs pour atteindre une cible. &lt;code&gt;poisson()&lt;/code&gt; tire des pauses aléatoires, que la documentation juge plus proches des arrivées réelles. L&amp;#39;exemple de la documentation pour 500 itérations de tâche par seconde est &lt;code&gt;constant_throughput(0.1)&lt;/code&gt; avec 5 000 utilisateurs, un pool fermé avec beaucoup de marge (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Le &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; classique est un pool fermé de threads. Les timers Constant Throughput et Precise Throughput cadencent ce pool vers un taux cible, et la référence prévient que le débit baisse si le serveur ne suit pas ou s&amp;#39;il n&amp;#39;y a pas assez de threads. Pour les arrivées, JMeter 5.5 a ajouté l&amp;#39;&lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Open_Model_Thread_Group&quot;&gt;Open Model Thread Group&lt;/a&gt;, toujours marqué comme expérimental, avec des plannings comme &lt;code&gt;rate(10/sec) random_arrivals(1 min)&lt;/code&gt;. Le plugin communautaire &lt;a href=&quot;https://jmeter-plugins.org/wiki/ArrivalsThreadGroup/&quot;&gt;Arrivals Thread Group&lt;/a&gt; démarre de nouveaux threads quand tous les threads existants sont occupés, avec une limite de concurrence comme soupape de sécurité (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;h2&gt;Que surveiller pendant un test en modèle ouvert ?&lt;/h2&gt;
&lt;p&gt;Surveillez le générateur de charge d&amp;#39;aussi près que le système testé. En modèle ouvert, un système lent signifie plus d&amp;#39;utilisateurs simultanés de votre côté, et ils coûtent de la mémoire et du CPU.&lt;/p&gt;
&lt;p&gt;Fixez un plafond, par exemple &lt;code&gt;maxVUs&lt;/code&gt; dans k6 ou la limite de concurrence du plugin JMeter, et considérez le fait de l&amp;#39;atteindre comme un résultat : le système n&amp;#39;a pas pu absorber le taux demandé.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Un modèle de charge fermé est-il parfois le bon choix ?&lt;/strong&gt;
Oui. Utilisez-le quand le système réel plafonne la concurrence, par exemple avec un pool fixe de workers, un consommateur de file ou un centre d&amp;#39;appels, ou quand vous voulez savoir combien de sessions simultanées un composant supporte. Pour le trafic web public, un modèle ouvert convient mieux.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ajouter du temps de réflexion transforme-t-il un modèle fermé en modèle ouvert ?&lt;/strong&gt;
Non. Le temps de réflexion réduit la fréquence des requêtes de chaque utilisateur, mais chaque utilisateur attend toujours la réponse précédente, donc un système lent freine quand même le test. Seul un taux d&amp;#39;arrivée fixé indépendamment des temps de réponse donne un modèle ouvert.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combien d&amp;#39;utilisateurs virtuels faut-il pour un test à taux d&amp;#39;arrivée ?&lt;/strong&gt;
Assez pour couvrir toutes les itérations en cours au même moment. La documentation de k6 suggère la durée médiane d&amp;#39;une itération multipliée par le taux cible, plus une marge pour la variabilité, à trouver par de courts essais avant le test complet.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/coordinated-omission/&quot;&gt;Coordinated omission : ce que c&amp;#39;est et comment l&amp;#39;éviter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;Loi de Little en test de charge : dimensionner et vérifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/think-time-in-load-testing/&quot;&gt;Temps de réflexion en test de charge : bien le régler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/throughput-vs-latency/&quot;&gt;Débit vs latence : comment ils interagissent sous charge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/amdahls-law/&quot;&gt;Loi d&amp;#39;Amdahl : formule, exemples et limites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/queueing-theory/&quot;&gt;Théorie des files d&amp;#39;attente : ce qu&amp;#39;elle dit de la latence&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Temps de réflexion en test de charge : bien le régler</title><link>https://loadtest.app/fr/think-time-in-load-testing/</link><guid isPermaLink="true">https://loadtest.app/fr/think-time-in-load-testing/</guid><description>Temps de réflexion en test de charge : pourquoi les pauses changent la charge, en quoi il diffère du pacing et comment le régler dans k6, JMeter et Locust.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;Le temps de réflexion en test de charge est la pause qu&amp;#39;un utilisateur virtuel marque entre deux actions, qui représente les secondes qu&amp;#39;une vraie personne passe à lire une page ou à remplir un formulaire. Il fixe la pression qu&amp;#39;exerce chaque utilisateur virtuel : plus la pause est longue, moins le même nombre d&amp;#39;utilisateurs envoie de requêtes par seconde. Mesurez-le à partir des données de vrais utilisateurs, faites-le varier au hasard autour de cette valeur et écrivez-le dans le script avec la commande de pause de votre outil.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Temps de réflexion par boucle&lt;/th&gt;
&lt;th&gt;Une boucle dure&lt;/th&gt;
&lt;th&gt;Requêtes par seconde pour 100 utilisateurs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0 s&lt;/td&gt;
&lt;td&gt;0,5 s&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 s&lt;/td&gt;
&lt;td&gt;1,5 s&lt;/td&gt;
&lt;td&gt;environ 67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 s&lt;/td&gt;
&lt;td&gt;3,5 s&lt;/td&gt;
&lt;td&gt;environ 29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 s&lt;/td&gt;
&lt;td&gt;5,5 s&lt;/td&gt;
&lt;td&gt;environ 18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 s&lt;/td&gt;
&lt;td&gt;10,5 s&lt;/td&gt;
&lt;td&gt;environ 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Ce n&amp;#39;est qu&amp;#39;un calcul, sans test derrière : une requête par boucle, une réponse en 0,5 seconde, et le nombre d&amp;#39;utilisateurs divisé par (temps de réponse + temps de réflexion).&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce que le temps de réflexion en test de charge ?&lt;/h2&gt;
&lt;p&gt;Le temps de réflexion est l&amp;#39;attente volontaire qu&amp;#39;un script de test insère entre les étapes d&amp;#39;un parcours utilisateur. Il reproduit la part humaine d&amp;#39;une session : lire, comparer, taper.&lt;/p&gt;
&lt;p&gt;Dans le script d&amp;#39;une boutique, il se place entre « ouvrir la fiche produit » et « ajouter au panier », en dehors de toute requête. Le &lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/what-is-delay-when-running-a-load-test?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=think-time-in-load-testing&quot;&gt;guide de LoadFocus sur les délais en test de charge&lt;/a&gt; le distingue du délai de montée en charge, qui ajoute les utilisateurs progressivement, et du délai de démarrage entre deux utilisateurs, et note que beaucoup d&amp;#39;outils désignent par le simple mot « delay » le délai de montée en charge. Quand un outil propose un champ « delay », vérifiez lequel des trois il désigne.&lt;/p&gt;
&lt;h2&gt;Pourquoi le temps de réflexion change-t-il la charge à nombre d&amp;#39;utilisateurs égal ?&lt;/h2&gt;
&lt;p&gt;Avec un nombre fixe d&amp;#39;utilisateurs virtuels, chacun attend une réponse, fait une pause, et seulement ensuite envoie la requête suivante. Sa boucle dure le temps de réponse plus le temps de réflexion, donc chaque seconde de pause en plus réduit le nombre de requêtes que chaque utilisateur envoie par seconde.&lt;/p&gt;
&lt;p&gt;Cent utilisateurs sans pause envoient 200 requêtes par seconde avec une réponse en 0,5 seconde ; avec une pause de 5 secondes, ils en envoient environ 18, si bien que deux tests « à 100 utilisateurs » peuvent être très différents. La documentation de k6 décrit le même effet pour son &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;modèle fermé&lt;/a&gt; : l&amp;#39;itération suivante ne démarre que lorsque la précédente est terminée, donc des réponses plus lentes font aussi baisser le rythme (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;Réduire le temps de réflexion pour tirer plus de charge de moins d&amp;#39;utilisateurs a un coût : vingt utilisateurs sans pause peuvent atteindre la cadence de requêtes de plusieurs centaines d&amp;#39;utilisateurs qui marquent des pauses, tout en gardant bien moins de sessions et de connexions ouvertes que la production.&lt;/p&gt;
&lt;h2&gt;Quelle est la différence entre temps de réflexion et pacing ?&lt;/h2&gt;
&lt;p&gt;Le temps de réflexion est une pause après une étape, donc une boucle s&amp;#39;allonge dès que les réponses ralentissent. Le pacing fixe l&amp;#39;intervalle entre le début d&amp;#39;une boucle et le début de la suivante, et raccourcit l&amp;#39;attente quand le travail a pris plus de temps.&lt;/p&gt;
&lt;p&gt;Avec un pacing de 30 secondes, un utilisateur lance une boucle toutes les 30 secondes, que ses requêtes aient pris 2 secondes ou 20, ce qui convient à un test construit à partir de volumes métier comme « 500 commandes par heure ». La documentation de &lt;a href=&quot;https://docs.locust.io/en/stable/api.html&quot;&gt;&lt;code&gt;constant_pacing&lt;/code&gt;&lt;/a&gt; dans Locust précise le cas limite : si la tâche dure plus longtemps que l&amp;#39;intervalle, l&amp;#39;attente tombe à zéro (vérifié le 9 octobre 2026). Beaucoup de scripts combinent les deux, avec du temps de réflexion entre les étapes et un pacing sur la boucle entière.&lt;/p&gt;
&lt;h2&gt;Le temps de réflexion doit-il être fixe ou aléatoire ?&lt;/h2&gt;
&lt;p&gt;Aléatoire, autour d&amp;#39;une moyenne mesurée. Une pause fixe maintient synchronisés les utilisateurs partis ensemble, qui arrivent sur la même page au même moment, boucle après boucle.&lt;/p&gt;
&lt;p&gt;Ces vagues synchronisées peuvent créer des pics que la production ne connaît pas, et une pause aléatoire disperse les utilisateurs. Gardez la moyenne là où vos données la placent : une pause uniforme entre 2 et 8 secondes fait 5 en moyenne, soit la même charge moyenne qu&amp;#39;une pause fixe de 5 secondes. La loi uniforme est le choix simple par défaut ; une loi normale (gaussienne) regroupe les pauses autour d&amp;#39;une valeur typique, et une loi exponentielle donne beaucoup d&amp;#39;attentes courtes et quelques longues.&lt;/p&gt;
&lt;h2&gt;Comment choisir les valeurs du temps de réflexion ?&lt;/h2&gt;
&lt;p&gt;Tirez-les de ce que font les vrais utilisateurs à chaque étape, grâce à vos outils d&amp;#39;analyse web, vos logs d&amp;#39;accès ou un outil de suivi des utilisateurs réels (RUM). Prenez une valeur par étape, car lire une fiche produit prend plus de temps que cliquer sur un bouton.&lt;/p&gt;
&lt;p&gt;Le temps passé sur la page dans vos outils d&amp;#39;analyse, ou l&amp;#39;écart entre deux requêtes successives d&amp;#39;une même session dans les logs d&amp;#39;accès, s&amp;#39;approche du temps de réflexion de cette étape. Prenez la médiane comme pause moyenne et la dispersion pour fixer la plage aléatoire, et écartez les temps morts comme un onglet resté ouvert pendant le déjeuner.&lt;/p&gt;
&lt;p&gt;Une API appelée par d&amp;#39;autres programmes n&amp;#39;a pas d&amp;#39;humain dans la boucle : modélisez directement sa cadence de requêtes. Sans données, notez les valeurs supposées dans le plan de test pour qu&amp;#39;un test ultérieur les remplace ; le &lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;guide pas à pas du test de charge&lt;/a&gt; montre où elles s&amp;#39;insèrent.&lt;/p&gt;
&lt;h2&gt;Comment ajouter du temps de réflexion dans k6, JMeter, Gatling, Locust et Artillery ?&lt;/h2&gt;
&lt;p&gt;Chaque outil a sa propre commande de pause, et la plupart proposent aussi un pacing ou un réglage de débit.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Pause fixe&lt;/th&gt;
&lt;th&gt;Pause aléatoire&lt;/th&gt;
&lt;th&gt;Pacing ou débit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sleep(3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sleep(2 + Math.random() * 6)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exécuteurs arrival-rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Constant Timer&lt;/td&gt;
&lt;td&gt;Uniform ou Gaussian Random Timer&lt;/td&gt;
&lt;td&gt;Constant Throughput Timer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pause(3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pause(2, 8)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pace(30)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant(3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;between(2, 8)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant_pacing&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;&lt;code&gt;think: 3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;think&lt;/code&gt; + &lt;code&gt;jitter&lt;/code&gt; (dans &lt;code&gt;config.http.defaults&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Taux d&amp;#39;arrivée par phase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Les informations du tableau ci-dessus et des notes ci-dessous viennent de la documentation de chaque projet, vérifiées le 9 octobre 2026 ; les cinq outils figurent dans notre tour d&amp;#39;horizon des &lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;outils de test de charge open source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6.&lt;/strong&gt; &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6/sleep/&quot;&gt;&lt;code&gt;sleep(t)&lt;/code&gt;&lt;/a&gt; met l&amp;#39;utilisateur virtuel en pause pendant &lt;code&gt;t&lt;/code&gt; secondes ; la documentation construit des pauses aléatoires avec &lt;code&gt;Math.random()&lt;/code&gt; ou avec &lt;code&gt;randomIntBetween()&lt;/code&gt; de k6-utils :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { sleep } from &amp;quot;k6&amp;quot;;

export default function () {
  http.get(&amp;quot;https://example.com/products&amp;quot;);
  sleep(2 + Math.random() * 6); // 2 à 8 secondes
  http.get(&amp;quot;https://example.com/cart&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Parmi les &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#timers&quot;&gt;timers&lt;/a&gt;, le Constant Timer prend un délai en millisecondes, les Uniform et Gaussian Random Timers ajoutent une part aléatoire à un décalage fixe, et le Constant Throughput Timer fait varier ses pauses pour tenir un objectif d&amp;#39;échantillons par minute. Un timer s&amp;#39;exécute avant chaque sampler de sa portée, donc un seul timer au niveau du Thread Group fait une pause avant chaque requête.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; &lt;a href=&quot;https://docs.gatling.io/concepts/scenario/&quot;&gt;&lt;code&gt;pause(2, 8)&lt;/code&gt;&lt;/a&gt; attend un temps aléatoire uniforme, et &lt;code&gt;pace(30)&lt;/code&gt; dans une boucle l&amp;#39;exécute au plus une fois toutes les 30 secondes. Au &lt;a href=&quot;https://docs.gatling.io/concepts/simulation/&quot;&gt;niveau de la simulation&lt;/a&gt;, vous pouvez passer toutes les pauses à une loi normale ou exponentielle, ou les couper avec &lt;code&gt;disablePauses()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust.&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;wait_time&lt;/code&gt;&lt;/a&gt; s&amp;#39;applique après chaque tâche, donc une tâche de deux requêtes sous &lt;code&gt;constant_throughput(2)&lt;/code&gt; envoie quatre requêtes par seconde et par utilisateur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery.&lt;/strong&gt; Une &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/http&quot;&gt;étape &lt;code&gt;think&lt;/code&gt;&lt;/a&gt; fait une pause d&amp;#39;un nombre de secondes donné, et un réglage &lt;code&gt;think.jitter&lt;/code&gt; sous &lt;code&gt;config.http.defaults&lt;/code&gt; ajoute une variation aléatoire à chaque étape think. Pour deux de ces outils face à face, voyez &lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Le temps de réflexion compte-t-il dans un test à taux d&amp;#39;arrivée ?&lt;/h2&gt;
&lt;p&gt;Moins, pour ce qui est de la cadence de requêtes. Quand l&amp;#39;outil lance de nouvelles itérations à un rythme fixé, les pauses déterminent combien de temps chaque utilisateur reste, et donc combien sont actifs en même temps.&lt;/p&gt;
&lt;p&gt;Les &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;exécuteurs arrival-rate&lt;/a&gt; de k6 cadencent les itérations par leur taux, et la documentation déconseille un &lt;code&gt;sleep&lt;/code&gt; en fin d&amp;#39;itération ; les &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;phases de charge&lt;/a&gt; d&amp;#39;Artillery créent de même un nombre fixe de nouveaux utilisateurs virtuels par seconde (vérifié le 9 octobre 2026 pour les deux). Le temps de réflexion entre les étapes façonne malgré tout chaque session.&lt;/p&gt;
&lt;h2&gt;Comment les outils de script de LoadFocus fixent-ils le temps de réflexion ?&lt;/h2&gt;
&lt;p&gt;Ils l&amp;#39;écrivent dans le script k6 ou JMeter comme valeur de départ, à ajuster ensuite.&lt;/p&gt;
&lt;p&gt;L&amp;#39;&lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/k6-load-testing/import-to-k6-from-curl-har-postman-openapi?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=think-time-in-load-testing&quot;&gt;import depuis cURL, HAR, Postman ou OpenAPI&lt;/a&gt; transforme une requête capturée en script k6 qui termine chaque itération par &lt;code&gt;sleep(1)&lt;/code&gt; ; considérez cette seconde comme une valeur provisoire à remplacer par vos mesures. Le générateur de tests par IA de LoadFocus a pour consigne de donner un temps de réflexion à chaque étape, l&amp;#39;écrit sous forme de &lt;code&gt;sleep()&lt;/code&gt; pour k6 ou de Constant Timer pour JMeter, et prévient quand un scénario à plusieurs étapes n&amp;#39;en a aucun.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Peut-on lancer un test de charge sans temps de réflexion ?&lt;/strong&gt;
Oui, pour trouver le débit maximal d&amp;#39;un endpoint ou pour un test de stress, à condition de présenter le résultat en requêtes par seconde. Il en dit peu sur le nombre de vrais utilisateurs que le système peut servir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le temps de réflexion compte-t-il dans le temps de réponse ?&lt;/strong&gt;
Pas dans les temps des requêtes. Dans k6, &lt;code&gt;http_req_duration&lt;/code&gt; couvre l&amp;#39;envoi, l&amp;#39;attente et la réception, tandis que &lt;code&gt;iteration_duration&lt;/code&gt; couvre toute la boucle (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;référence des métriques&lt;/a&gt;, vérifié le 9 octobre 2026). Un Transaction Controller de JMeter exclut les timers de son temps, sauf si vous cochez l&amp;#39;option qui les inclut.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-vs-closed-workload-model/&quot;&gt;Modèle de charge ouvert ou fermé : lequel choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/littles-law-load-testing/&quot;&gt;Loi de Little en test de charge : dimensionner et vérifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;Comment faire un test de charge : le guide pas à pas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/queueing-theory/&quot;&gt;Théorie des files d&amp;#39;attente : ce qu&amp;#39;elle dit de la latence&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Outils de test de charge WebSocket : six options</title><link>https://loadtest.app/fr/websocket-load-testing-tools/</link><guid isPermaLink="true">https://loadtest.app/fr/websocket-load-testing-tools/</guid><description>Outils de test de charge WebSocket comparés : k6, Artillery, Gatling, JMeter, Locust et Tsung, ce que chacun gère nativement et quand en choisir un autre.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Parmi les outils de test de charge WebSocket, k6, Artillery, Gatling et Tsung gèrent le protocole nativement, tandis que JMeter a besoin du plugin WebSocket Samplers et Locust de code client que vous écrivez ou de son utilisateur Socket.IO expérimental. Choisissez selon le langage de votre équipe, puis selon la rigueur avec laquelle vous devez vérifier les messages que le serveur renvoie.&lt;/p&gt;
&lt;p&gt;Pour cet article, nous n&amp;#39;avons pas lancé ces outils contre un serveur WebSocket. Les informations viennent de la documentation et du dépôt de chaque projet, vérifiées le 9 octobre 2026, et les conseils « Choisissez plutôt » sont notre jugement.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Prise en charge de WebSocket&lt;/th&gt;
&lt;th&gt;Tests écrits en&lt;/th&gt;
&lt;th&gt;Vérifier ce que le serveur envoie&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;Intégrée : &lt;code&gt;k6/websockets&lt;/code&gt;, ancien &lt;code&gt;k6/ws&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Gestionnaires d&amp;#39;événements dans votre script&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;Moteurs intégrés &lt;code&gt;ws&lt;/code&gt; et &lt;code&gt;socketio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;YAML, plus des fonctions JavaScript&lt;/td&gt;
&lt;td&gt;Réponses et accusés de réception Socket.IO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Fait partie du SDK HTTP&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript&lt;/td&gt;
&lt;td&gt;Checks qui attendent un message précis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache JMeter&lt;/td&gt;
&lt;td&gt;Plugin WebSocket Samplers&lt;/td&gt;
&lt;td&gt;Plans de test construits dans l&amp;#39;interface graphique&lt;/td&gt;
&lt;td&gt;Samplers request-response et de lecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Votre propre client, ou le &lt;code&gt;SocketIOUser&lt;/code&gt; expérimental&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Ce que votre code remonte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tsung&lt;/td&gt;
&lt;td&gt;Type de session intégré &lt;code&gt;ts_websocket&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;XML&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ack&lt;/code&gt; attend une réponse du serveur&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;En quoi la charge WebSocket diffère-t-elle de la charge HTTP ?&lt;/h2&gt;
&lt;p&gt;Un utilisateur WebSocket ouvre une connexion et la garde pendant toute la session, et le serveur peut envoyer des messages quand il le veut. Un test a donc deux leviers, les connexions ouvertes et les messages par seconde, et chacun sollicite le serveur à sa façon.&lt;/p&gt;
&lt;p&gt;Le &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/websockets/&quot;&gt;guide WebSocket de k6&lt;/a&gt; décrit un trafic full-duplex sur une seule connexion TCP et explique qu&amp;#39;un utilisateur virtuel y exécute une boucle d&amp;#39;événements tant que le socket reste ouvert, sans plus boucler sur la fonction principale. La &lt;a href=&quot;https://docs.gatling.io/reference/script/websocket/&quot;&gt;référence WebSocket de Gatling&lt;/a&gt; ajoute que le trafic circule dans les deux sens, si bien que le modèle requête-réponse de HTTP ne convient plus.&lt;/p&gt;
&lt;p&gt;Prévoyez trois formes de test. Beaucoup de connexions inactives montrent combien de sockets vos serveurs peuvent tenir. Un groupe plus restreint de clients bavards teste le traitement des messages. Une diffusion, où un message part vers tous les abonnés, teste le chemin du push.&lt;/p&gt;
&lt;h2&gt;Que faut-il mesurer dans un test de charge WebSocket ?&lt;/h2&gt;
&lt;p&gt;Mesurez le temps de connexion, la latence des messages et les connexions perdues, ainsi que le nombre de connexions qui restent ouvertes. Ce sont ces valeurs que ressentent les utilisateurs d&amp;#39;une application temps réel.&lt;/p&gt;
&lt;p&gt;Les &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;métriques intégrées de k6&lt;/a&gt; comprennent &lt;code&gt;ws_connecting&lt;/code&gt;, &lt;code&gt;ws_ping&lt;/code&gt;, &lt;code&gt;ws_session_duration&lt;/code&gt;, &lt;code&gt;ws_sessions&lt;/code&gt; et des compteurs de messages. Aucune ne chronomètre un message applicatif : le délai entre le message d&amp;#39;un client et la réponse du serveur demande une métrique Trend personnalisée. Le moteur &lt;code&gt;ws&lt;/code&gt; d&amp;#39;Artillery remonte le nombre et le débit des messages, et son moteur Socket.IO ajoute &lt;code&gt;socketio.response_time&lt;/code&gt;, de l&amp;#39;émission d&amp;#39;un message à la réception de la réponse.&lt;/p&gt;
&lt;p&gt;Pour les connexions perdues, comptez les événements close et error que votre script n&amp;#39;a pas provoqués, et comparez les sessions ouvertes à celles encore actives à la fin de chaque palier.&lt;/p&gt;
&lt;h2&gt;Quand k6 est-il le bon outil WebSocket ?&lt;/h2&gt;
&lt;p&gt;Quand votre équipe écrit du JavaScript et que chaque utilisateur virtuel doit tenir plusieurs sockets à la fois. k6 intègre WebSocket d&amp;#39;origine, sans extension à installer.&lt;/p&gt;
&lt;p&gt;Le module &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-websockets/&quot;&gt;&lt;code&gt;k6/websockets&lt;/code&gt;&lt;/a&gt; suit l&amp;#39;API WebSocket du navigateur et utilise une boucle d&amp;#39;événements globale, qui permet à un utilisateur virtuel de garder plusieurs connexions ouvertes. L&amp;#39;ancien module &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-ws/&quot;&gt;&lt;code&gt;k6/ws&lt;/code&gt;&lt;/a&gt; reste documenté, mais k6 recommande &lt;code&gt;k6/websockets&lt;/code&gt; pour les nouveaux tests, et &lt;code&gt;k6/experimental/websockets&lt;/code&gt; est déprécié.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import { WebSocket } from &amp;#39;k6/websockets&amp;#39;;

export default function () {
  const ws = new WebSocket(&amp;#39;wss://example.com/ws&amp;#39;);
  ws.onopen = () =&amp;gt; ws.send(&amp;#39;hello&amp;#39;);
  ws.onmessage = (e) =&amp;gt; {
    console.log(e.data);
    ws.close();
  };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; fonctionnent aussi sur les métriques personnalisées : un objectif de latence manqué donne donc à la CI un code de sortie non nul. Choisissez plutôt Artillery quand votre serveur parle Socket.IO et que vous voulez vérifier émissions et accusés de réception sans écrire de code client. Notre comparatif &lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; couvre les autres différences.&lt;/p&gt;
&lt;h2&gt;Quand Artillery a-t-il du sens ?&lt;/h2&gt;
&lt;p&gt;Quand vous voulez des scénarios YAML courts, ou quand votre serveur utilise Socket.IO. Les deux moteurs sont fournis avec Artillery.&lt;/p&gt;
&lt;p&gt;Un scénario sur le &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/websocket&quot;&gt;moteur WebSocket&lt;/a&gt; se compose de cinq actions : &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;send&lt;/code&gt;, &lt;code&gt;think&lt;/code&gt;, &lt;code&gt;loop&lt;/code&gt; et &lt;code&gt;function&lt;/code&gt;. Le &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/socketio&quot;&gt;moteur Socket.IO&lt;/a&gt; va plus loin : un &lt;code&gt;emit&lt;/code&gt; peut déclarer la réponse attendue, valider un accusé de réception par une correspondance JSONPath et partager un scénario avec des requêtes HTTP, ce qui convient aux applications qui se connectent en HTTP avant d&amp;#39;ouvrir un socket.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt k6 ou Gatling quand un test doit vérifier ce qu&amp;#39;un serveur WebSocket brut renvoie, car la documentation du moteur &lt;code&gt;ws&lt;/code&gt; ne décrit aucune étape qui attende ou compare une réponse.&lt;/p&gt;
&lt;h2&gt;À qui s&amp;#39;adresse Gatling pour les WebSockets ?&lt;/h2&gt;
&lt;p&gt;Aux équipes sur la JVM, ou sur le SDK JavaScript de Gatling, qui veulent écrire les vérifications de messages dans le scénario. La prise en charge de WebSocket fait partie du SDK HTTP de Gatling, si bien que les étapes HTTP et WebSocket partagent une même simulation.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/reference/script/websocket/&quot;&gt;référence&lt;/a&gt; couvre &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;sendText&lt;/code&gt;, &lt;code&gt;sendBytes&lt;/code&gt; et &lt;code&gt;close&lt;/code&gt;, ainsi que des checks qui bloquent jusqu&amp;#39;à l&amp;#39;arrivée du message attendu ou l&amp;#39;expiration d&amp;#39;un délai. Les réglages du protocole permettent de reconnecter un socket fermé par le serveur, de répondre automatiquement à certains messages texte comme un ping et de garder en mémoire tampon les messages qu&amp;#39;aucun check n&amp;#39;a reconnus. Le &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;dépôt&lt;/a&gt; range WebSocket dans la Community Edition sous Apache 2.0, sans limite.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt k6 si vous préférez traiter les messages poussés dans des gestionnaires d&amp;#39;événements que dans des checks bloquants.&lt;/p&gt;
&lt;h2&gt;JMeter peut-il tester la charge des WebSockets ?&lt;/h2&gt;
&lt;p&gt;Oui, avec un plugin. JMeter n&amp;#39;a pas de sampler WebSocket, et l&amp;#39;extension habituelle est WebSocket Samplers de Peter Doornbosch.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html&quot;&gt;référence des composants&lt;/a&gt; de JMeter ne mentionne jamais WebSocket. Le &lt;a href=&quot;https://bitbucket.org/pjtr/jmeter-websocket-samplers/src/master/&quot;&gt;dépôt du plugin&lt;/a&gt; décrit six samplers : ouverture de connexion, request-response, ping-pong, lecture simple, écriture simple et fermeture. Ils tournent sur le thread du groupe de threads, gèrent &lt;code&gt;wss&lt;/code&gt; et les trames binaires, et peuvent filtrer les trames sans intérêt pour le test. On l&amp;#39;installe via le Plugins Manager ou en copiant son jar dans &lt;code&gt;lib/ext&lt;/code&gt;, et la version 1.3.2 a été taguée en janvier 2026 (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;Choisissez un autre outil si vous préférez ne pas maintenir un plugin tiers sur chaque générateur de charge.&lt;/p&gt;
&lt;h2&gt;Et Locust et Tsung ?&lt;/h2&gt;
&lt;p&gt;Locust n&amp;#39;atteint les WebSockets bruts que par du code client que vous ajoutez, et Tsung les prend en charge dans sa configuration XML mais publie rarement de nouvelles versions. Les deux fonctionnent, au prix de plus d&amp;#39;efforts.&lt;/p&gt;
&lt;p&gt;Selon la &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;documentation de Locust&lt;/a&gt;, l&amp;#39;outil ne gère d&amp;#39;origine que HTTP et HTTPS ; les autres protocoles s&amp;#39;ajoutent en enveloppant une bibliothèque cliente et en déclenchant un événement request après chaque appel. La bibliothèque doit pouvoir être patchée par gevent, sinon elle bloque tout le processus. Pour Socket.IO, il existe un &lt;code&gt;SocketIOUser&lt;/code&gt; expérimental. Choisissez Locust si votre équipe écrit du Python et accepte de maintenir ce code client.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/processone/tsung&quot;&gt;Tsung&lt;/a&gt; est un projet Erlang qui se présente comme un outil de test de charge distribué et multi-protocole. Sa &lt;a href=&quot;https://github.com/processone/tsung/blob/develop/docs/conf-sessions.rst&quot;&gt;documentation des sessions&lt;/a&gt; définit pour WebSocket les requêtes &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;message&lt;/code&gt; et &lt;code&gt;close&lt;/code&gt;, avec un attribut &lt;code&gt;ack&lt;/code&gt; pour attendre une réponse. Sa &lt;a href=&quot;https://github.com/processone/tsung/tags&quot;&gt;dernière version taguée&lt;/a&gt;, la 1.8.0, date de mars 2023.&lt;/p&gt;
&lt;h2&gt;Où se situe un service hébergé comme LoadFocus ?&lt;/h2&gt;
&lt;p&gt;Tenir beaucoup de sockets ouverts depuis vos propres machines demande du travail, et un service hébergé prend en charge la génération de charge. Il convient surtout quand vos tests sont déjà des scripts k6.&lt;/p&gt;
&lt;p&gt;LoadFocus, l&amp;#39;éditeur de ce site, &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=websocket-load-testing-tools&quot;&gt;exécute des scripts k6&lt;/a&gt; depuis 25 régions cloud, et sa page k6 cite les connexions WebSocket parmi les fonctionnalités k6 prises en charge. Il propose aussi un &lt;a href=&quot;https://loadfocus.com/fr-fr/templates/load-testing-for-websocket-ramp-up-and-ramp-down?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=websocket-load-testing-tools&quot;&gt;modèle de test WebSocket avec montée et descente en charge&lt;/a&gt;. Nous n&amp;#39;avons pas vérifié s&amp;#39;il exécute des plugins JMeter comme WebSocket Samplers, nous n&amp;#39;affirmons donc rien à ce sujet.&lt;/p&gt;
&lt;h2&gt;Comment choisir entre eux ?&lt;/h2&gt;
&lt;p&gt;Partez du langage de votre équipe, puis demandez-vous si vous testez des WebSockets bruts ou Socket.IO et avec quelle rigueur vous devez vérifier les messages poussés. Il reste en général un ou deux candidats.&lt;/p&gt;
&lt;p&gt;Écrivez le même test court de connexion, d&amp;#39;envoi et de réception dans les deux, puis comparez le temps de connexion et la latence des messages à faible charge. Notre guide &lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;Comment faire un test de charge&lt;/a&gt; détaille les étapes, et le panorama des &lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;outils de test de charge open source&lt;/a&gt; compare ces projets au-delà des WebSockets.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Par quel outil de test de charge WebSocket commencer ?&lt;/strong&gt;
Si votre équipe écrit du JavaScript, commencez par k6, qui intègre WebSocket. Pour les applications Socket.IO, le moteur d&amp;#39;Artillery demande le moins de code, et les équipes JVM seront à l&amp;#39;aise avec Gatling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter peut-il tester les WebSockets sans plugin ?&lt;/strong&gt;
Sa référence des composants ne cite aucun sampler WebSocket : la voie pratique est donc le plugin WebSocket Samplers, installé via le Plugins Manager ou comme jar dans &lt;code&gt;lib/ext&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faut-il utiliser k6/ws ou k6/websockets ?&lt;/strong&gt;
Prenez &lt;code&gt;k6/websockets&lt;/code&gt; pour les nouveaux tests, comme le recommande la documentation de k6. L&amp;#39;ancien module &lt;code&gt;k6/ws&lt;/code&gt; reste documenté pour les scripts existants.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;Outils de test de charge open source : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/how-to-load-test-a-graphql-api/&quot;&gt;Test de charge d&amp;#39;une API GraphQL : guide pratique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/http-benchmarking-tools/&quot;&gt;Outils de benchmark HTTP : wrk, hey, oha, ab et autres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/grpc-load-testing/&quot;&gt;Test de charge gRPC : outils, mise en place et mesures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/artillery-load-testing/&quot;&gt;Test de charge Artillery : l&amp;#39;outil Node.js passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tsung-load-testing/&quot;&gt;Test de charge Tsung : l&amp;#39;outil Erlang passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Comment faire un test de charge : le guide pas à pas</title><link>https://loadtest.app/fr/how-to-run-a-load-test/</link><guid isPermaLink="true">https://loadtest.app/fr/how-to-run-a-load-test/</guid><description>Comment faire un test de charge de bout en bout : fixer un objectif, scripter un parcours, le valider, monter en charge et lire les bons résultats.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, un service de test de charge mentionné dans cet article.&lt;/p&gt;&lt;p&gt;Pour faire un test de charge, décidez à quoi ressemble un bon résultat, scriptez un parcours utilisateur réaliste, vérifiez ce script avec un seul utilisateur, puis augmentez la charge par paliers en surveillant les temps de réponse et les erreurs. Comparez ce que vous avez mesuré avec l&amp;#39;objectif fixé au départ, et ne changez qu&amp;#39;une chose à la fois avant le test suivant.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Étape&lt;/th&gt;
&lt;th&gt;Ce que vous faites&lt;/th&gt;
&lt;th&gt;Terminé quand&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1. Fixer l&amp;#39;objectif&lt;/td&gt;
&lt;td&gt;Choisir la charge visée et les chiffres qui valent réussite&lt;/td&gt;
&lt;td&gt;Vous pouvez écrire les critères en une phrase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Scripter un parcours&lt;/td&gt;
&lt;td&gt;Transformer un vrai parcours utilisateur en script&lt;/td&gt;
&lt;td&gt;Le script tourne sans erreur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Test de fumée&lt;/td&gt;
&lt;td&gt;Le lancer avec un utilisateur virtuel&lt;/td&gt;
&lt;td&gt;Toutes les vérifications passent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Monter en charge&lt;/td&gt;
&lt;td&gt;Augmenter la charge par paliers et tenir la cible&lt;/td&gt;
&lt;td&gt;Vous atteignez la cible ou une condition d&amp;#39;arrêt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Lire les résultats&lt;/td&gt;
&lt;td&gt;Comparer percentiles et erreurs avec l&amp;#39;objectif&lt;/td&gt;
&lt;td&gt;Vous savez si c&amp;#39;est réussi et quoi changer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Que faut-il décider avant de lancer un test de charge ?&lt;/h2&gt;
&lt;p&gt;Décidez quelle charge vous testez et quel résultat compte comme une réussite. Sans les deux, un test de charge produit des chiffres, mais pas de réponse.&lt;/p&gt;
&lt;p&gt;Partez du trafic réel si vous en avez. Vos outils d&amp;#39;analyse ou vos logs d&amp;#39;accès indiquent l&amp;#39;heure la plus chargée, le nombre de requêtes par seconde et les pages ou endpoints qui en reçoivent le plus. Placez la cible au-dessus de ce pic, puisque le but est de savoir que vous avez de la marge. Écrivez ensuite les critères sous forme de chiffres, par exemple : le 95e percentile du temps de réponse reste sous 500 ms et moins de 1 % des requêtes échouent, à 200 utilisateurs virtuels.&lt;/p&gt;
&lt;p&gt;Deux décisions pratiques se prennent aussi à ce moment. Choisissez un environnement proche de la production en taille et en configuration, car un serveur de préproduction avec un quart de la capacité en dit peu sur la production. Et assurez-vous d&amp;#39;avoir le droit de le tester : tester un système qui ne vous appartient pas, ou partagé avec d&amp;#39;autres équipes, sans prévenir ressemble exactement à une attaque.&lt;/p&gt;
&lt;h2&gt;Comment scripter un parcours utilisateur réaliste ?&lt;/h2&gt;
&lt;p&gt;Scriptez le parcours qui compte le plus pour l&amp;#39;activité, étape par étape, avec des pauses là où une vraie personne lirait ou taperait. Un script qui appelle une seule URL aussi vite que possible mesure quelque chose, mais rarement ce qui vous intéresse.&lt;/p&gt;
&lt;p&gt;Pour une boutique, cela peut être : ouvrir l&amp;#39;accueil, chercher, ouvrir un produit, l&amp;#39;ajouter au panier. Pour une API : se connecter, lister des éléments, en récupérer un. Ajoutez une courte pause entre les étapes (temps de réflexion), utilisez des données de test variées pour que les caches se comportent comme en conditions réelles, et vérifiez chaque réponse pour qu&amp;#39;une page d&amp;#39;erreur ne passe pas pour une réponse rapide.&lt;/p&gt;
&lt;p&gt;Voici le script utilisé pour l&amp;#39;exemple de ce guide, écrit pour k6. Il monte à 10 utilisateurs virtuels, maintient la charge puis redescend, avec deux critères de réussite intégrés :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { check, sleep } from &amp;quot;k6&amp;quot;;

export const options = {
  stages: [
    { duration: &amp;quot;10s&amp;quot;, target: 10 },
    { duration: &amp;quot;20s&amp;quot;, target: 10 },
    { duration: &amp;quot;5s&amp;quot;, target: 0 },
  ],
  thresholds: {
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
  },
};

export default function () {
  const res = http.get(&amp;quot;http://127.0.0.1:8765/&amp;quot;);
  check(res, { &amp;quot;status is 200&amp;quot;: (r) =&amp;gt; r.status === 200 });
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un vrai parcours comporte plusieurs requêtes et de vraies URL. Celui-ci reste minuscule exprès, pour que les étapes soient faciles à suivre.&lt;/p&gt;
&lt;h2&gt;Pourquoi lancer d&amp;#39;abord un test de fumée à un seul utilisateur ?&lt;/h2&gt;
&lt;p&gt;Un test de fumée avec un utilisateur virtuel prouve que le script fonctionne avant de mettre une vraie charge sur quoi que ce soit. C&amp;#39;est le moyen le moins cher de repérer une mauvaise URL, un jeton de connexion manquant ou une vérification qui échoue toujours.&lt;/p&gt;
&lt;p&gt;Avec k6, vous pouvez &lt;a href=&quot;https://grafana.com/docs/k6/latest/get-started/running-k6/&quot;&gt;remplacer la charge depuis la ligne de commande&lt;/a&gt;, si bien que le même script s&amp;#39;exécute une fois avec un seul utilisateur :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;k6 run --vus 1 --iterations 1 script.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lors de notre essai, l&amp;#39;unique vérification est passée : le script était prêt pour la charge. Si une vérification échoue à ce stade, corrigez le script avant d&amp;#39;aller plus loin : une erreur à un utilisateur devient du bruit à cent.&lt;/p&gt;
&lt;h2&gt;Comment augmenter la charge ?&lt;/h2&gt;
&lt;p&gt;Augmentez la charge par paliers et tenez chaque palier assez longtemps pour qu&amp;#39;il se stabilise, au lieu de sauter directement à la cible. Une montée par paliers montre à partir de quel niveau les choses se dégradent.&lt;/p&gt;
&lt;p&gt;Une forme courante consiste à monter à un premier palier, le tenir quelques minutes, monter au suivant, le tenir à nouveau, et ainsi de suite jusqu&amp;#39;à la cible, puis redescendre. En regardant chaque palier séparément, vous voyez si les temps de réponse augmentent régulièrement avec la charge ou restent stables puis décrochent. Ce décrochage, le point où chaque utilisateur supplémentaire ralentit chaque requête, est ce qu&amp;#39;un test de charge peut trouver de plus utile. Notre exemple ne monte qu&amp;#39;à 10 utilisateurs et tient 20 secondes, assez pour montrer les paliers mais bien trop court pour un vrai test.&lt;/p&gt;
&lt;h2&gt;Que faut-il surveiller pendant le test ?&lt;/h2&gt;
&lt;p&gt;Surveillez les percentiles du temps de réponse, le taux d&amp;#39;erreur et le débit côté générateur de charge, ainsi que le CPU, la mémoire et la charge de la base de données côté système testé. Les trois premiers indiquent ce que ressentiraient les utilisateurs, les trois derniers expliquent pourquoi.&lt;/p&gt;
&lt;p&gt;Fixez des conditions d&amp;#39;arrêt avant de commencer, par exemple : arrêter si le taux d&amp;#39;erreur dépasse 5 % ou si les temps de réponse atteignent plusieurs secondes. Insister sur un système déjà tombé n&amp;#39;apprend rien, et sur un environnement partagé cela gêne le travail des autres.&lt;/p&gt;
&lt;p&gt;Surveillez aussi le générateur de charge. S&amp;#39;il tourne à 100 % de CPU, les réponses lentes peuvent venir de votre propre ordinateur plutôt que du serveur.&lt;/p&gt;
&lt;h2&gt;Comment lire les résultats d&amp;#39;un test de charge ?&lt;/h2&gt;
&lt;p&gt;Lisez les percentiles et le taux d&amp;#39;erreur au regard des critères notés au départ. Le temps de réponse moyen est le chiffre le moins utile du rapport.&lt;/p&gt;
&lt;p&gt;Voici ce qu&amp;#39;a rapporté notre exemple (35 secondes, jusqu&amp;#39;à 10 utilisateurs virtuels, une petite page statique servie sur un portable, le 8 octobre 2026) :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrique&lt;/th&gt;
&lt;th&gt;Valeur&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Requêtes&lt;/td&gt;
&lt;td&gt;282 (8 par seconde)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requêtes en échec&lt;/td&gt;
&lt;td&gt;0 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temps de réponse moyen&lt;/td&gt;
&lt;td&gt;0,69 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90e percentile&lt;/td&gt;
&lt;td&gt;0,66 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95e percentile&lt;/td&gt;
&lt;td&gt;0,71 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99e percentile&lt;/td&gt;
&lt;td&gt;2,68 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requête la plus lente&lt;/td&gt;
&lt;td&gt;15,98 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thresholds&lt;/td&gt;
&lt;td&gt;Tous deux réussis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Les chiffres sont minuscules parce que la cible était un fichier statique sur la même machine : ce n&amp;#39;est pas un benchmark. La leçon est dans la forme : la moyenne est ressortie au-dessus du 90e percentile, parce qu&amp;#39;une poignée de requêtes lentes l&amp;#39;a tirée vers le haut. Les percentiles décrivent ce qu&amp;#39;a vécu la plupart des requêtes, et le 99e percentile et la requête la plus lente montrent la traîne que subissent quelques utilisateurs. Jugez le test sur le percentile de vos critères, et servez-vous de la traîne pour décider si quelque chose mérite d&amp;#39;être examiné de plus près.&lt;/p&gt;
&lt;p&gt;Si un test manque son objectif, changez une seule chose (une requête, un réglage de cache, une taille d&amp;#39;instance) et relancez le même test, pour savoir ce qui a fait la différence.&lt;/p&gt;
&lt;h2&gt;Quand faut-il lancer le test depuis le cloud ?&lt;/h2&gt;
&lt;p&gt;Déplacez le générateur de charge dans le cloud quand une seule machine ne peut pas produire la charge nécessaire, ou quand la localisation de vos utilisateurs compte. Un portable sur le Wi-Fi du bureau mesure votre connexion autant que votre serveur.&lt;/p&gt;
&lt;p&gt;Le même script k6 peut tourner sur une infrastructure que vous gérez, sur le service hébergé de Grafana, ou sur &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-run-a-load-test&quot;&gt;LoadFocus, qui exécute les scripts k6 depuis 25 régions cloud&lt;/a&gt;. Ses rapports détaillent les résultats par localisation et tracent le temps de réponse en fonction du nombre d&amp;#39;utilisateurs virtuels, là où le décrochage décrit plus haut devient visible (&lt;a href=&quot;https://loadfocus.com/docs/fr-fr/guides/load-testing/analyzing-load-test-results?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-run-a-load-test&quot;&gt;lire les résultats dans LoadFocus&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Combien de temps doit durer un test de charge ?&lt;/strong&gt;
Assez longtemps pour tenir la charge cible plusieurs minutes après la montée, afin que de brefs pics ne décident pas du résultat. Tenir au moins 10 minutes est un bon point de départ, et bien plus longtemps si vous cherchez des fuites mémoire ou une dégradation lente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;De combien d&amp;#39;utilisateurs virtuels ai-je besoin ?&lt;/strong&gt;
Déduisez-le du trafic réel. Prenez les requêtes par seconde de l&amp;#39;heure la plus chargée, estimez combien de requêtes fait un parcours et combien de temps il dure, et dimensionnez les utilisateurs virtuels pour que le test produise ce débit avec une marge en plus.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Peut-on tester la production sans risque ?&lt;/strong&gt;
C&amp;#39;est possible, avec prudence : tester à une heure calme, prévenir les personnes qui exploitent le système, fixer des conditions d&amp;#39;arrêt et démarrer bien en dessous du pic attendu. Beaucoup d&amp;#39;équipes préfèrent un environnement de préproduction de la taille de la production, pour qu&amp;#39;un test raté ne touche aucun client.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-test-pass-fail-criteria/&quot;&gt;Critères de réussite d&amp;#39;un test de charge : comment les fixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-testing-in-github-actions/&quot;&gt;Test de charge dans GitHub Actions : guide pratique&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>k6 vs Artillery : quel outil de test de charge choisir ?</title><link>https://loadtest.app/fr/k6-vs-artillery/</link><guid isPermaLink="true">https://loadtest.app/fr/k6-vs-artillery/</guid><description>k6 et Artillery comparés : scripts, protocoles, critères de réussite, tests distribués et licences, avec des conseils clairs pour choisir chaque outil.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;k6 et Artillery sont deux outils de test de charge open source où les tests s&amp;#39;écrivent sous forme de code, et l&amp;#39;un comme l&amp;#39;autre testera correctement une API HTTP sous charge. Choisissez k6 si vous voulez un binaire unique, une logique de test en JavaScript et des seuils de réussite intégrés. Choisissez Artillery si votre équipe vit déjà dans Node.js, préfère des scénarios YAML courts, ou veut des tests navigateur avec Playwright et des exécutions distribuées sur AWS ou Azure depuis la ligne de commande.&lt;/p&gt;
&lt;p&gt;Les informations ci-dessous viennent de la documentation et du dépôt de chaque projet, vérifiées le 8 octobre 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;k6&lt;/th&gt;
&lt;th&gt;Artillery&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licence&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MPL-2.0, certains modules Azure sous BSL (&lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;dépôt&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environnement d&amp;#39;exécution&lt;/td&gt;
&lt;td&gt;Un binaire Go avec un moteur JavaScript intégré&lt;/td&gt;
&lt;td&gt;Node.js, dernière version LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de test&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;YAML, TypeScript ou JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocoles principaux&lt;/td&gt;
&lt;td&gt;HTTP, WebSockets, gRPC&lt;/td&gt;
&lt;td&gt;HTTP, WebSocket, Socket.IO (gRPC et Kinesis via des moteurs additionnels)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests navigateur&lt;/td&gt;
&lt;td&gt;Module navigateur intégré&lt;/td&gt;
&lt;td&gt;Playwright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critères de réussite&lt;/td&gt;
&lt;td&gt;Thresholds&lt;/td&gt;
&lt;td&gt;Plugin &lt;code&gt;ensure&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Montée en charge distribuée&lt;/td&gt;
&lt;td&gt;k6-operator sur Kubernetes, ou Grafana Cloud k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run-lambda&lt;/code&gt; ou &lt;code&gt;run-fargate&lt;/code&gt; sur AWS, &lt;code&gt;run-aci&lt;/code&gt; sur Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelle est la différence entre k6 et Artillery ?&lt;/h2&gt;
&lt;p&gt;Ils diffèrent surtout par leur environnement d&amp;#39;exécution et par la façon de décrire la charge. k6 est un outil Go compilé qui exécute du code de test JavaScript, alors qu&amp;#39;Artillery est un outil Node.js qui lit des scénarios YAML ou JavaScript.&lt;/p&gt;
&lt;p&gt;Cette différence se voit dès le premier jour. Installer k6 revient à installer un paquet ou &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;un binaire autonome&lt;/a&gt;, sans environnement d&amp;#39;exécution à maintenir. Artillery &lt;a href=&quot;https://www.artillery.io/docs/get-started/get-artillery&quot;&gt;a besoin de Node.js&lt;/a&gt; et s&amp;#39;installe avec npm, ce qui est naturel dans un projet JavaScript et ajoute un environnement de plus à tenir à jour partout ailleurs.&lt;/p&gt;
&lt;p&gt;Côté protocoles, le socle commun couvre l&amp;#39;essentiel du travail web : les deux parlent HTTP et WebSockets d&amp;#39;origine. k6 fournit aussi gRPC, et Artillery Socket.IO. Artillery obtient gRPC et Kinesis par des &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;moteurs additionnels&lt;/a&gt; à installer séparément (vérifié le 9 octobre 2026), et k6 va plus loin grâce à son écosystème d&amp;#39;extensions.&lt;/p&gt;
&lt;h2&gt;Comment écrit-on un test avec chaque outil ?&lt;/h2&gt;
&lt;p&gt;Avec k6, vous écrivez un module JavaScript avec les options en haut et une fonction par défaut que chaque utilisateur virtuel exécute. Avec Artillery, vous écrivez le plus souvent un fichier YAML avec un bloc &lt;code&gt;config&lt;/code&gt; pour la charge et un bloc &lt;code&gt;scenarios&lt;/code&gt; pour ce que fait chaque utilisateur virtuel.&lt;/p&gt;
&lt;p&gt;Un test k6 qui monte à 20 utilisateurs virtuels et échoue si le 95e percentile du temps de réponse dépasse 500 ms :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { check, sleep } from &amp;quot;k6&amp;quot;;

export const options = {
  stages: [
    { duration: &amp;quot;30s&amp;quot;, target: 20 },
    { duration: &amp;quot;1m&amp;quot;, target: 20 },
    { duration: &amp;quot;15s&amp;quot;, target: 0 },
  ],
  thresholds: { http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;] },
};

export default function () {
  const res = http.get(&amp;quot;https://staging.example.com/api/users&amp;quot;);
  check(res, { &amp;quot;status is 200&amp;quot;: (r) =&amp;gt; r.status === 200 });
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La même idée dans &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;le format YAML d&amp;#39;Artillery&lt;/a&gt;, avec dix nouveaux utilisateurs virtuels par seconde pendant une minute :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  target: &amp;quot;https://staging.example.com&amp;quot;
  phases:
    - duration: 60
      arrivalRate: 10
  plugins:
    ensure:
      thresholds:
        - &amp;quot;http.response_time.p95&amp;quot;: 500
scenarios:
  - flow:
      - get:
          url: &amp;quot;/api/users&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les deux exemples modélisent la charge différemment. Le script k6 fixe un nombre d&amp;#39;utilisateurs virtuels simultanés, et le fichier Artillery fixe combien de nouveaux utilisateurs virtuels arrivent chaque seconde. k6 sait aussi piloter un taux d&amp;#39;arrivée grâce à ses &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;executors de scénarios&lt;/a&gt;, et Artillery peut plafonner la concurrence avec &lt;code&gt;maxVusers&lt;/code&gt; : choisissez donc le modèle qui correspond à la façon dont le vrai trafic arrive sur votre système, plutôt que celui que chaque outil montre en premier.&lt;/p&gt;
&lt;h2&gt;Comment k6 et Artillery décident-ils qu&amp;#39;un test a réussi ?&lt;/h2&gt;
&lt;p&gt;Les deux traduisent un objectif de performance en code de sortie, ce dont un pipeline CI a besoin. Un objectif manqué termine l&amp;#39;exécution avec un code de sortie non nul dans les deux outils.&lt;/p&gt;
&lt;p&gt;Dans k6, les objectifs s&amp;#39;appellent des &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; et se placent dans les options du script, comme dans l&amp;#39;exemple ci-dessus. Dans Artillery, ils se trouvent dans le &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;plugin &lt;code&gt;ensure&lt;/code&gt;&lt;/a&gt;, qui accepte des seuils simples et des conditions combinant plusieurs métriques.&lt;/p&gt;
&lt;p&gt;La différence pratique tient à l&amp;#39;endroit où vivent les objectifs. Les thresholds de k6 sont dans le même fichier que la logique de test. Les vérifications d&amp;#39;Artillery sont dans le bloc &lt;code&gt;config&lt;/code&gt;, où quelqu&amp;#39;un qui ne touche jamais aux scénarios peut quand même les ajuster.&lt;/p&gt;
&lt;h2&gt;Comment lancer un test plus gros qu&amp;#39;une seule machine ne peut générer ?&lt;/h2&gt;
&lt;p&gt;Les deux outils savent répartir un test sur plusieurs machines, par des chemins très différents. k6 s&amp;#39;appuie sur Kubernetes ou sur le service hébergé de Grafana, et Artillery sur votre propre compte AWS ou Azure.&lt;/p&gt;
&lt;p&gt;Pour k6, le &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; répartit un test sur des pods d&amp;#39;un cluster Kubernetes, et Grafana Cloud k6 exécute les mêmes scripts en tant que service hébergé. Pour Artillery, les commandes &lt;code&gt;run-lambda&lt;/code&gt; et &lt;code&gt;run-fargate&lt;/code&gt; &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-lambda&quot;&gt;lancent des workers dans votre compte AWS&lt;/a&gt; après une configuration IAM unique via une pile CloudFormation. Sur Azure, &lt;code&gt;run-aci&lt;/code&gt; fait de même avec &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/azure-aci&quot;&gt;Azure Container Instances&lt;/a&gt;, mais exige un abonnement payant à Artillery au-delà d&amp;#39;une évaluation (vérifié le 9 octobre 2026). Si vous utilisez déjà Kubernetes, la voie de l&amp;#39;operator vous semblera familière. Si vous préférez ne rien exploiter vous-même, la voie serverless d&amp;#39;Artillery a moins de pièces mobiles, à condition que le test puisse tourner dans AWS ou Azure.&lt;/p&gt;
&lt;p&gt;Il existe une troisième voie pour les scripts k6. &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=k6-vs-artillery&quot;&gt;LoadFocus exécute les scripts k6&lt;/a&gt; sur sa propre infrastructure cloud depuis 25 régions, si bien que le script lancé sur votre portable devient un test distribué sans cluster ni compte AWS. LoadFocus n&amp;#39;exécute pas les scripts Artillery : pour Artillery, ses propres commandes AWS et Azure restent le moyen de monter en charge.&lt;/p&gt;
&lt;h2&gt;Où vont les résultats ?&lt;/h2&gt;
&lt;p&gt;Les deux outils affichent un résumé à la fin d&amp;#39;une exécution et peuvent envoyer leurs métriques vers d&amp;#39;autres systèmes pour les tableaux de bord et les alertes.&lt;/p&gt;
&lt;p&gt;D&amp;#39;après son &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;dépôt&lt;/a&gt;, k6 propose des statistiques résumées ou des métriques détaillées exportées vers le service de votre choix. Artillery annonce dans son &lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;dépôt&lt;/a&gt; plus de 20 intégrations pour le monitoring, l&amp;#39;observabilité et la CI/CD. Les deux peuvent donc alimenter les tableaux de bord que vous avez déjà. Vérifiez avant de vous engager que la sortie précise dont vous avez besoin figure dans la liste, car les deux listes changent d&amp;#39;une version à l&amp;#39;autre.&lt;/p&gt;
&lt;h2&gt;Lequel choisir ?&lt;/h2&gt;
&lt;p&gt;Choisissez k6 si vous voulez un binaire unique dans la CI, une logique de test JavaScript avec un vrai flux de contrôle, et des thresholds dans le même fichier que le test. Il convient aussi aux équipes qui utilisent déjà Grafana, puisque l&amp;#39;outil open source et le service hébergé partagent la même API de script.&lt;/p&gt;
&lt;p&gt;Choisissez plutôt Artillery si votre équipe écrit du Node.js tous les jours, si un court fichier YAML est plus facile à relire pour le reste de l&amp;#39;équipe qu&amp;#39;un script, ou si vous avez besoin de tests navigateur Playwright et de Socket.IO dans le même outil. Sa montée en charge serverless est aussi le chemin le plus court si votre infrastructure vit déjà dans AWS et que Kubernetes n&amp;#39;en fait pas partie.&lt;/p&gt;
&lt;p&gt;Si vous hésitez encore, écrivez le même test de fumée dans les deux outils. Vingt lignes suffisent pour voir lequel votre équipe lit le plus facilement en revue de code.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;k6 est-il gratuit ?&lt;/strong&gt;
Oui. k6 est open source sous licence AGPL-3.0 et tourne gratuitement sur vos propres machines. Grafana Cloud k6 est un service hébergé distinct, avec sa propre tarification.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery est-il gratuit ?&lt;/strong&gt;
En grande partie. L&amp;#39;essentiel d&amp;#39;Artillery est sous licence MPL-2.0, mais certains modules propres à Azure utilisent une licence source-available qui exige une licence commerciale pour un usage en production sur Azure, selon le dépôt du projet (vérifié le 8 octobre 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus peut-il exécuter des tests Artillery ?&lt;/strong&gt;
Non. LoadFocus exécute des scripts k6 et JMeter. Pour faire monter un test Artillery au-delà d&amp;#39;une machine, utilisez les commandes d&amp;#39;Artillery pour AWS Lambda, Fargate ou Azure Container Instances dans votre propre compte cloud.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quel outil consomme le moins de ressources sur le générateur de charge ?&lt;/strong&gt;
Nous ne l&amp;#39;avons pas mesuré nous-mêmes, donc nous ne désignons pas de gagnant. Le projet k6 indique que même des machines modestes peuvent simuler beaucoup de trafic, et la seule comparaison honnête consiste à lancer le même scénario avec les deux outils sur votre propre matériel.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-vs-k6/&quot;&gt;Gatling vs k6 : simulations JVM ou un seul binaire Go ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;Comment faire un test de charge : le guide pas à pas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/open-source-load-testing-tools/&quot;&gt;Outils de test de charge open source : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/load-testing-in-github-actions/&quot;&gt;Test de charge dans GitHub Actions : guide pratique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/k6-vs-locust/&quot;&gt;k6 vs Locust : scripts JavaScript ou utilisateurs Python ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/artillery-load-testing/&quot;&gt;Test de charge Artillery : l&amp;#39;outil Node.js passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Outils de test de charge open source : six options</title><link>https://loadtest.app/fr/open-source-load-testing-tools/</link><guid isPermaLink="true">https://loadtest.app/fr/open-source-load-testing-tools/</guid><description>Six outils de test de charge open source passés en revue : JMeter, k6, Gatling, Locust, Artillery et Vegeta, leurs forces et quand en choisir un autre.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Transparence : loadtest.app est publié par LoadFocus, qui vend un service de test de charge présenté dans cet article.&lt;/p&gt;&lt;p&gt;Six outils de test de charge open source très utilisés aujourd&amp;#39;hui sont Apache JMeter, k6, Gatling, Locust, Artillery et Vegeta. Choisissez selon le langage dans lequel votre équipe écrit ses tests et selon la façon dont vous devez monter en charge : JMeter pour la plus large couverture de protocoles, k6 ou Artillery pour JavaScript, Gatling pour la JVM, Locust pour Python et Vegeta pour des vérifications HTTP rapides à débit fixe.&lt;/p&gt;
&lt;p&gt;Pour cet article, nous n&amp;#39;avons pas comparé ces outils entre eux par des benchmarks. Les informations viennent du dépôt et de la documentation de chaque projet, vérifiées le 8 octobre 2026, et les mentions « Idéal pour » sont notre jugement.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Licence&lt;/th&gt;
&lt;th&gt;Tests écrits en&lt;/th&gt;
&lt;th&gt;Tourne sur&lt;/th&gt;
&lt;th&gt;Répartir la charge sur plusieurs machines&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Apache JMeter&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Plans de test construits dans une interface graphique&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Mode distant (client-serveur) intégré&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Un binaire Go&lt;/td&gt;
&lt;td&gt;k6-operator sur Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Apache 2.0 (certains composants sous licence entreprise)&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript, TypeScript&lt;/td&gt;
&lt;td&gt;JVM&lt;/td&gt;
&lt;td&gt;Édition Enterprise commerciale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Intégré&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;MPL-2.0 (certains modules Azure sous BSL)&lt;/td&gt;
&lt;td&gt;YAML, JavaScript, TypeScript&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;AWS Lambda, Fargate ou Azure ACI depuis la CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vegeta&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Ligne de commande ou code Go&lt;/td&gt;
&lt;td&gt;Un binaire Go&lt;/td&gt;
&lt;td&gt;Lancer plusieurs instances&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Apache JMeter vaut-il encore la peine ?&lt;/h2&gt;
&lt;p&gt;Oui, surtout si vous avez besoin de protocoles au-delà de HTTP. JMeter couvre le plus large éventail des six et s&amp;#39;appuie sur le plus grand stock de plans de test et de savoir-faire existants.&lt;/p&gt;
&lt;p&gt;JMeter est une application Java sous licence Apache 2.0. Sa &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;liste de protocoles&lt;/a&gt; couvre HTTP et HTTPS, les services web SOAP et REST, FTP, les bases de données via JDBC, LDAP, la messagerie JMS, le courrier et le TCP brut. Vous construisez les plans de test dans une interface graphique, vous les lancez sans interface depuis la ligne de commande pour les vrais tests, et le mode distant client-serveur répartit un test sur plusieurs machines.&lt;/p&gt;
&lt;p&gt;Idéal pour les systèmes multiprotocoles, les équipes qui ont déjà des plans JMeter et les testeurs qui préfèrent construire leurs tests visuellement. Choisissez autre chose si votre équipe veut des tests en code pur, relus comme l&amp;#39;application, car des plans XML construits dans une interface graphique sont difficiles à lire dans une pull request.&lt;/p&gt;
&lt;h2&gt;Quand k6 est-il le bon choix ?&lt;/h2&gt;
&lt;p&gt;Quand votre équipe écrit du JavaScript et veut des tests en code avec des seuils de réussite intégrés. k6 est livré sous forme d&amp;#39;un binaire Go unique, ce qui simplifie sa mise en place en CI.&lt;/p&gt;
&lt;p&gt;k6 est &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;sous licence AGPL-3.0&lt;/a&gt; et parle HTTP, WebSockets et gRPC, avec un module navigateur pour les vérifications front-end. Les thresholds transforment un objectif, comme une limite sur le 95e percentile, en code de sortie non nul pour la CI. Pour monter en charge, le &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; exécute des tests distribués sur Kubernetes, et Grafana vend un service hébergé.&lt;/p&gt;
&lt;p&gt;Idéal pour les développeurs qui gardent leurs tests d&amp;#39;API à côté du code, et pour les pipelines CI. Choisissez autre chose si votre équipe ne veut pas de JavaScript, ou si la licence AGPL ne convient pas à la façon dont vous intégrez ou distribuez l&amp;#39;outil. Nous le comparons en détail dans &lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;À qui s&amp;#39;adresse Gatling ?&lt;/h2&gt;
&lt;p&gt;Aux équipes sur la JVM qui veulent des tests en code et un rapport HTML détaillé sans rien ajouter. Il propose aussi un SDK JavaScript et TypeScript sur le même moteur.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;Gatling&lt;/a&gt; fait tourner les utilisateurs virtuels sur un moteur non bloquant construit sur Netty, si bien qu&amp;#39;une seule machine peut générer beaucoup de charge. Les simulations s&amp;#39;écrivent en Java, Kotlin, Scala, JavaScript ou TypeScript et se lancent via des plugins Maven, Gradle, sbt ou npm. L&amp;#39;édition communautaire est sous Apache 2.0 et couvre HTTP/1.1, HTTP/2, WebSocket, les Server-Sent Events et JMS, tandis que ses composants gRPC, MQTT et GraphQL relèvent de la licence entreprise de Gatling.&lt;/p&gt;
&lt;p&gt;Idéal pour les équipes Java et Scala, et pour quiconque veut des rapports riches sans outillage supplémentaire. Choisissez autre chose si vous devez répartir la charge sur plusieurs machines avec la seule édition open source : générer la charge depuis une infrastructure gérée ou privée est le rôle de Gatling Enterprise, l&amp;#39;édition commerciale.&lt;/p&gt;
&lt;h2&gt;Locust est-il un bon choix pour les équipes Python ?&lt;/h2&gt;
&lt;p&gt;Oui. Les tests Locust sont du Python pur : boucles, conditions et n&amp;#39;importe quelle bibliothèque Python fonctionnent comme dans du code ordinaire.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;Locust&lt;/a&gt; est sous licence MIT et fonctionne de manière événementielle avec gevent, ce qui permet à un seul processus de gérer beaucoup d&amp;#39;utilisateurs. Les tests se lancent en ligne de commande ou depuis une interface web qui affiche en direct le débit, les temps de réponse et les erreurs, et Locust répartit un test sur plusieurs machines de lui-même. HTTP est intégré, et les autres protocoles s&amp;#39;ajoutent en écrivant du Python.&lt;/p&gt;
&lt;p&gt;Idéal pour les équipes Python, les scénarios à logique complexe et ceux qui aiment suivre un test dans le navigateur. Choisissez autre chose si vous voulez des tests déclaratifs façon configuration, ou si un plugin prêt à l&amp;#39;emploi pour un protocole inhabituel compte plus que d&amp;#39;en écrire un vous-même.&lt;/p&gt;
&lt;h2&gt;Quand Artillery a-t-il du sens ?&lt;/h2&gt;
&lt;p&gt;Quand votre équipe vit dans Node.js, aime les scénarios YAML courts, ou veut des tests navigateur Playwright dans le même outil que ses tests d&amp;#39;API.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;Artillery&lt;/a&gt; est principalement sous MPL-2.0, avec certains modules Azure sous une licence source-available. Il gère d&amp;#39;origine HTTP, WebSocket et Socket.IO, ajoute gRPC et Kinesis par des &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;moteurs additionnels&lt;/a&gt;, et ses commandes &lt;code&gt;run-lambda&lt;/code&gt; et &lt;code&gt;run-fargate&lt;/code&gt; répartissent un test sur des workers dans votre propre compte AWS. La commande &lt;code&gt;run-aci&lt;/code&gt; fait de même sur Azure Container Instances, avec un abonnement payant à Artillery au-delà d&amp;#39;une évaluation (vérifié le 9 octobre 2026).&lt;/p&gt;
&lt;p&gt;Idéal pour les équipes Node.js, les tests mixtes API et navigateur, et les entreprises déjà sur AWS. Choisissez autre chose si vous préférez ne pas installer Node.js sur vos générateurs de charge, ou si de gros tests doivent tourner hors d&amp;#39;AWS et d&amp;#39;Azure.&lt;/p&gt;
&lt;h2&gt;À quoi sert Vegeta ?&lt;/h2&gt;
&lt;p&gt;À des vérifications HTTP rapides, à débit constant, depuis la ligne de commande. Il fait une seule chose, envoyer des requêtes à débit fixe, et la garde simple.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tsenart/vegeta&quot;&gt;Vegeta&lt;/a&gt; est un outil Go sous licence MIT qui fonctionne comme programme en ligne de commande ou comme bibliothèque Go, avec une CLI pensée pour se combiner avec les autres outils Unix. Comme il maintient le débit de requêtes constant au lieu de modéliser des utilisateurs, il répond mieux à des questions comme « que se passe-t-il à 500 requêtes par seconde ? » qu&amp;#39;il ne reproduit des parcours utilisateurs.&lt;/p&gt;
&lt;p&gt;Idéal pour vérifier rapidement un endpoint, faire des tests de capacité à débit fixe et écrire des scripts shell. Choisissez autre chose si vous avez besoin de parcours en plusieurs étapes, de temps de réflexion ou de rapports détaillés.&lt;/p&gt;
&lt;h2&gt;Où se situe un service hébergé comme LoadFocus ?&lt;/h2&gt;
&lt;p&gt;Aucun de ces outils n&amp;#39;a besoin d&amp;#39;un service hébergé, mais générer une charge importante ou répartie géographiquement depuis vos propres machines demande du travail. Un service hébergé prend en charge la génération de charge et laisse vos scripts tels quels.&lt;/p&gt;
&lt;p&gt;LoadFocus, l&amp;#39;éditeur de ce site, est l&amp;#39;un de ces services. Il &lt;a href=&quot;https://loadfocus.com/fr-fr/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-source-load-testing-tools&quot;&gt;exécute vos plans de test JMeter existants&lt;/a&gt; et vos &lt;a href=&quot;https://loadfocus.com/fr-fr/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-source-load-testing-tools&quot;&gt;scripts k6&lt;/a&gt; depuis 25 régions cloud. Il n&amp;#39;exécute pas les tests Gatling, Locust, Artillery ou Vegeta : pour ces outils, les options de montée en charge décrites plus haut s&amp;#39;appliquent. Grafana Cloud k6 et Gatling Enterprise sont les voies hébergées des éditeurs eux-mêmes pour k6 et Gatling.&lt;/p&gt;
&lt;h2&gt;Comment choisir entre eux ?&lt;/h2&gt;
&lt;p&gt;Partez du langage que votre équipe écrit déjà et des protocoles à tester, puis regardez comment chaque outil monte en charge. Cela ramène généralement six options à une ou deux.&lt;/p&gt;
&lt;p&gt;Écrivez ensuite le même petit test avec vos deux favoris. Les lire côte à côte tranche la plupart des débats plus vite que n&amp;#39;importe quel tableau comparatif, et notre guide &lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;Comment faire un test de charge&lt;/a&gt; accompagne ce premier test pas à pas.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quel outil de test de charge open source est le plus simple pour débuter ?&lt;/strong&gt;
Pour un seul endpoint HTTP, Vegeta ou k6 donnent un résultat en quelques minutes, car chacun tient en un seul binaire. Pour des parcours en plusieurs étapes, prenez l&amp;#39;outil dont le langage de test est déjà celui de votre équipe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les outils de test de charge open source peuvent-ils lancer des tests distribués ?&lt;/strong&gt;
Oui, par des voies différentes : JMeter a un mode distant intégré, Locust se répartit nativement sur plusieurs machines, k6 utilise le k6-operator sur Kubernetes et Artillery utilise AWS Lambda, Fargate ou Azure Container Instances. Pour Gatling, générer la charge depuis une infrastructure gérée ou privée fait partie de l&amp;#39;édition commerciale Enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter est-il meilleur que k6 ?&lt;/strong&gt;
Aucun n&amp;#39;est meilleur dans l&amp;#39;absolu. JMeter couvre plus de protocoles et convient à la conception de tests en interface graphique, tandis que k6 convient aux développeurs qui veulent des tests en code JavaScript dans la CI.&lt;/p&gt;
&lt;h2&gt;À lire aussi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/http-benchmarking-tools/&quot;&gt;Outils de benchmark HTTP : wrk, hey, oha, ab et autres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/locust-load-testing/&quot;&gt;Test de charge Locust : l&amp;#39;outil Python passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/gatling-load-testing/&quot;&gt;Test de charge Gatling : l&amp;#39;outil JVM passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/websocket-load-testing-tools/&quot;&gt;Outils de test de charge WebSocket : six options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/k6-vs-artillery/&quot;&gt;k6 vs Artillery : quel outil de test de charge choisir ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/how-to-run-a-load-test/&quot;&gt;Comment faire un test de charge : le guide pas à pas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/azure-load-testing/&quot;&gt;Azure Load Testing : le service de Microsoft passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/artillery-load-testing/&quot;&gt;Test de charge Artillery : l&amp;#39;outil Node.js passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/nbomber-load-testing/&quot;&gt;Test de charge NBomber : le framework .NET passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/tsung-load-testing/&quot;&gt;Test de charge Tsung : l&amp;#39;outil Erlang passé en revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/pgbench/&quot;&gt;pgbench : benchmark et test de charge de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/fr/sysbench/&quot;&gt;Utiliser sysbench : benchmarks CPU, disque et MySQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>