<?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>Lasttest-Tools im Überblick und im Vergleich, dazu Anleitungen für das Durchführen und Auswerten von Lasttests.</description><link>https://loadtest.app/</link><language>de-DE</language><item><title>Amdahlsches Gesetz: Formel, Beispiele und Grenzen</title><link>https://loadtest.app/de/amdahls-law/</link><guid isPermaLink="true">https://loadtest.app/de/amdahls-law/</guid><description>Das Amdahlsche Gesetz erklärt: Formel, Beschleunigungstabelle, Rechenbeispiele, dazu Gustafsons Gesetz, die USL und was alle drei für Lasttests bedeuten.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Das Amdahlsche Gesetz (Amdahl&amp;#39;s Law) besagt, dass die Beschleunigung durch parallele Ausführung von dem Teil begrenzt wird, der sich nicht parallelisieren lässt. Verteilt sich ein Anteil p der Arbeit auf n Prozessoren, Server oder Threads, beträgt die Beschleunigung S = 1 / ((1 − p) + p/n), und wie groß n auch wird, sie übersteigt nie 1 / (1 − p). Bei 95 % paralleler Arbeit liegt die Obergrenze beim 20-Fachen, selbst auf tausend Maschinen.&lt;/p&gt;
&lt;p&gt;Die Zahlen unten sind reine Arithmetik ohne Testlauf dahinter. Die zitierten Arbeiten wurden am 1. November 2026 geprüft.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paralleler Anteil 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;Was besagt das Gesetz in einfachen Worten?&lt;/h2&gt;
&lt;p&gt;Ein Job kann nicht schneller fertig werden als sein serieller Teil, also verkürzen zusätzliche Worker nur den Rest. Ist der parallele Teil erst klein im Vergleich zum seriellen, ändern weitere Worker die Gesamtzeit kaum noch.&lt;/p&gt;
&lt;p&gt;Nehmen Sie einen Job von 10 Sekunden, von denen 1 Sekunde seriell ist (ein Lock, ein einzelner Schreibvorgang) und sich 9 Sekunden gleichmäßig aufteilen, also p = 0,9. Acht Worker erledigen ihn in 1 + 9/8 = 2,125 Sekunden (4,71-mal schneller); vierundsechzig brauchen etwa 1,14 Sekunden. Unter 1 Sekunde kommt er nie, also ist 10 die Obergrenze.&lt;/p&gt;
&lt;h2&gt;Woher stammt das Gesetz?&lt;/h2&gt;
&lt;p&gt;Gene Amdahl trug das Argument 1967 auf der AFIPS Spring Joint Computer Conference vor, in einem Aufsatz, der den Ansatz mit einem einzelnen Prozessor verteidigte.&lt;/p&gt;
&lt;p&gt;Den Volltext von &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; haben wir nicht gelesen. Mark Hill und Michael Marty fassen ihn in &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) zusammen: ein Anteil unbegrenzt parallelisierbar ohne Scheduling-Overhead, der Rest vollständig sequenziell, und die Beschleunigung beschrieben, ohne eine Gleichung anzugeben („without presenting an equation“).&lt;/p&gt;
&lt;h2&gt;Was bedeutet es für Last- und Kapazitätstests?&lt;/h2&gt;
&lt;p&gt;Der Durchsatz wächst nicht mehr im gleichen Maß mit Servern, Threads oder Pods, sobald eine gemeinsame Komponente einen Teil jeder Anfrage nacheinander abarbeitet. Ein Lasttest zeigt das als Durchsatzkurve, die abflacht, während Sie weiter Kapazität hinzufügen.&lt;/p&gt;
&lt;p&gt;Neil Gunthers unten zitierter Aufsatz von 2008 schreibt dasselbe Gesetz als N / (1 + σ(N − 1)), mit σ als seriellem Anteil, und misst Skalierbarkeit als Durchsatz bei N geteilt durch den Durchsatz bei 1. In einem Websystem ist der serielle Teil alles, was jede Anfrage der Reihe nach passieren muss: ein Lock oder eine Zeile, die jede Anfrage aktualisiert, ein einzelner Datenbank-Primary, der alle Schreibvorgänge annimmt, ein einzelner Queue-Consumer oder eine Drittanbieter-API mit Rate-Limit.&lt;/p&gt;
&lt;h2&gt;Wie finden Sie den seriellen Teil in einem Lasttest?&lt;/h2&gt;
&lt;p&gt;Fahren Sie denselben Test auf mehreren Laststufen und beobachten Sie, welche Ressource in die Sättigung geht, während der Durchsatz abflacht. Die Komponente, die an ihrer Grenze ist, wenn zusätzliche Kapazität nichts mehr bringt, ist der serielle Teil oder die Warteschlange davor.&lt;/p&gt;
&lt;p&gt;Typische Anzeichen: Der Durchsatz stagniert, obwohl die App-Schicht noch freie CPU hat, Wartezeiten wachsen an einer gemeinsamen Stelle (Locks, Datenbankverbindungen, Queue-Tiefe), und die Antwortzeit steigt im Gleichschritt mit den Benutzern, also &lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law&lt;/a&gt; an einer Obergrenze. Ein Lauf mit konstanter Last kann das nicht zeigen, also steigern Sie die Last in Stufen. Die LoadFocus-Einstellung &lt;a href=&quot;https://loadfocus.com/docs/de-de/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; fügt virtuelle Benutzer in gleich großen Gruppen hinzu. Die &lt;a href=&quot;https://loadfocus.com/docs/de-de/guides/load-testing/reading-the-capacity-panel?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=amdahls-law&quot;&gt;Kapazitätsanzeige&lt;/a&gt; gruppiert einen abgeschlossenen Lauf nach aktiven virtuellen Benutzern und listet in bezahlten Tarifen für Läufe mit nur einem Lastgenerator p95, Anfragen pro Sekunde und Fehlerrate pro Stufe. Eine Kapazitätsstufe nennt sie nur, wenn der Lauf mindestens drei Stufen durchlaufen hat und die oberste mindestens doppelt so hoch lag wie die unterste. Ein Skalierbarkeitsmodell passt sie nicht an, die Anpassung unten übernehmen also Sie.&lt;/p&gt;
&lt;h2&gt;Was ist Gustafsons Gesetz?&lt;/h2&gt;
&lt;p&gt;Es ist der Gegenpol: Wächst das Problem mit der Maschine, bleibt der serielle Anteil klein und die Beschleunigung wächst fast linear. Amdahl hält die Arbeit fest, Gustafson die Laufzeit.&lt;/p&gt;
&lt;p&gt;John Gustafsons Notiz &lt;a href=&quot;https://doi.org/10.1145/42411.42415&quot;&gt;Reevaluating Amdahl&amp;#39;s law&lt;/a&gt; von 1988 berichtete Beschleunigungen von 1016 bis 1021 auf einem Hypercube mit 1024 Prozessoren in Sandia, für Anwendungen mit einem seriellen Anteil von 0,4 bis 0,8 Prozent, und argumentierte, dass Benutzer das Problem so weit vergrößern, bis es die verfügbare Zeit ausfüllt. Mit s&amp;#39; als seriellem Anteil, gemessen am parallelen Lauf, ist die skalierte Beschleunigung N + (1 − N)s&amp;#39;; die Notiz schreibt diese Formel E. Barsis in Sandia zu.&lt;/p&gt;
&lt;p&gt;Bei s&amp;#39; = 0,05 und 64 Prozessoren ergibt das 60,85 gegenüber 15,42 nach Amdahl, weil die beiden 5-%-Werte auf verschiedenen Maschinen gemessen werden. In einem Websystem passt Gustafson, wenn jeder zusätzliche Server mit seinem eigenen Teil der Daten arbeitet; Amdahl passt, wenn jeder zusätzliche Benutzer weiterhin dieselbe gemeinsame Zeile berührt.&lt;/p&gt;
&lt;h2&gt;Was ergänzt das Universal Scalability Law?&lt;/h2&gt;
&lt;p&gt;Einen zweiten Term für Kohärenz, also die Kosten, gemeinsame Daten zwischen Workern konsistent zu halten, die mit der Zahl der Worker-Paare wachsen. Damit kann der Durchsatz ein Maximum erreichen und danach sinken, während Sie Kapazität hinzufügen.&lt;/p&gt;
&lt;p&gt;Gunthers &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) formuliert das Universal Scalability Law (USL) so:&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;σ steht für Contention (Serialisierung oder Warteschlangen) und κ für Kohärenz (inkonsistente Kopien von Daten); mit κ = 0 ergibt sich Amdahls Formel. Zu Gunthers Beispielen für den ungünstigsten Fall gehört das Aktualisieren von Datenbankeinträgen, und Durchsatz jenseits von N* nennt er „retrograde“, also rückläufig. Mit den Beispielwerten σ = 0,05 und κ = 0,001 liegt das Maximum bei etwa 31 Workern: Der relative Durchsatz beträgt 9,03 bei 32 und 7,82 bei 64, wo der σ-Term allein 15,42 vorhersagt.&lt;/p&gt;
&lt;h2&gt;Wie passen Sie das USL an eine Lasttestreihe an?&lt;/h2&gt;
&lt;p&gt;Messen Sie den Durchsatz auf mehreren Nebenläufigkeitsstufen, teilen Sie jeden Wert durch den Durchsatz bei einem Benutzer und bestimmen Sie σ und κ mit der Methode der kleinsten Quadrate.&lt;/p&gt;
&lt;p&gt;Umgestellt lautet die Formel N / C − 1 = σ(N − 1) + κN(N − 1) und ist damit linear in σ und κ. Die Werte unten sind aus σ = 0,05 und κ = 0,001 erzeugt; tragen Sie Ihre eigenen Anfragen pro Sekunde pro Stufe in x ein:&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;Das Skript gibt &lt;code&gt;sigma=0.050&lt;/code&gt;, &lt;code&gt;kappa=0.0010&lt;/code&gt; und ein Maximum bei etwa 31 Benutzern aus. Ändern Sie zwischen den Stufen nur die Nebenläufigkeit und nehmen Sie eine Stufe mit einem Benutzer auf, denn jeder Punkt wird durch sie geteilt.&lt;/p&gt;
&lt;h2&gt;Wo sind diese Modelle nicht mehr nützlich?&lt;/h2&gt;
&lt;p&gt;Sie verdichten eine Durchsatzkurve auf ein oder zwei Konstanten, können also weder den schuldigen Lock benennen noch einem System folgen, das sich unter Last verändert. Nutzen Sie sie, um eine gemessene Kurve zu lesen und ein kurzes Stück fortzusetzen: Eine Anpassung auf Stufen weit unterhalb des Knicks sagt wenig über das Maximum.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Konstante Parameter. Ein Cache, der warm wird, ein Autoscaler oder ein Pool, der an seine Grenze stößt, verändert σ und κ mitten im Test.&lt;/li&gt;
&lt;li&gt;Nur Durchsatz. p95 und p99 können sich zuerst verschlechtern: Prüfen Sie auch die &lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Der Lastgenerator. Sättigt er zuerst, ist die flache Kurve seine eigene.&lt;/li&gt;
&lt;li&gt;Geschlossene Tests. Feste virtuelle Benutzer messen ein &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;geschlossenes System&lt;/a&gt;; echte Benutzer treffen in ihrem eigenen Tempo ein.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Können Sie das Amdahlsche Gesetz einfach erklären?&lt;/strong&gt;
Ein Job ist nur so schnell wie der Teil, der sich nicht aufteilen lässt. Muss ein Zehntel der Arbeit seriell laufen, macht keine Zahl zusätzlicher Worker den Job mehr als zehnmal schneller, weil dieses Zehntel gleich lange dauert.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Was ist Gustafsons Gesetz?&lt;/strong&gt;
Gustafsons Gesetz besagt, dass die Beschleunigung fast linear wächst, wenn das Problem mit der Zahl der Prozessoren wächst, nämlich als N + (1 − N)s&amp;#39;, mit s&amp;#39; als seriellem Anteil des parallelen Laufs. John Gustafson veröffentlichte es 1988 (die Formel schrieb er seinem Sandia-Kollegen E. Barsis zu) als Gegenpol zu Amdahls Annahme einer festen Problemgröße.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law im Lasttest: Tests dimensionieren und prüfen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/queueing-theory/&quot;&gt;Warteschlangentheorie: was sie ist und warum Latenz steigt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Warteschlangentheorie: was sie ist und warum Latenz steigt</title><link>https://loadtest.app/de/queueing-theory/</link><guid isPermaLink="true">https://loadtest.app/de/queueing-theory/</guid><description>Warteschlangentheorie erklärt: Ankünfte, Server, Kendall-Notation, warum Antwortzeiten nahe voller Auslastung steil steigen, was das für Lasttests heißt.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Die Warteschlangentheorie (englisch queueing theory) ist die Mathematik der Warteschlangen: Aus der Rate, mit der Arbeit eintrifft, der Dauer jedes Auftrags und der Zahl der Server sagt sie voraus, wie lange Aufträge warten und wie lang die Schlange wird. Für Software ist ihr nützlichstes Ergebnis, dass die Antwortzeit bei mittlerer Last langsam und dann steil wächst, wenn ein Server sich 100 % Auslastung nähert. Im einfachsten Modell antwortet ein Server, der 90 % der Zeit beschäftigt ist, im Schnitt zehnmal langsamer als ein Server im Leerlauf.&lt;/p&gt;
&lt;p&gt;Die Zahlen unten sind Arithmetik aus Standardformeln, mit einem Skript nachgerechnet, ohne Testlauf dahinter. Die Quellen wurden am 1. November 2026 geprüft.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Auslastung ρ&lt;/th&gt;
&lt;th&gt;Zeit im System W ÷ Bedienzeit S&lt;/th&gt;
&lt;th&gt;Bei 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;Das sind Mittelwerte für die M/M/1-Warteschlange: ein Server, Poisson-Ankünfte und exponentialverteilte Bedienzeiten.&lt;/p&gt;
&lt;h2&gt;Was ist Warteschlangentheorie?&lt;/h2&gt;
&lt;p&gt;Sie ist das Teilgebiet der Wahrscheinlichkeitsrechnung, das Arbeit modelliert, die eintrifft, wartet und bedient wird. Eine Warteschlange wird durch ihre Ankünfte, ihre Bedienzeiten, ihre Zahl der Server und ihre Warteschlangendisziplin beschrieben, also die Reihenfolge, in der wartende Aufträge drankommen.&lt;/p&gt;
&lt;p&gt;Larson und Odonis &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;, ein frei zugänglicher MIT-Text, nennt Bankschalter, Supermarktkassen und Mautstellen als klassische Fälle. Ein Webserver passt in denselben Rahmen: Anfragen treffen ein, Threads oder Kerne bedienen sie, und der Rest wartet in einer Schlange.&lt;/p&gt;
&lt;h2&gt;Woher kommt die Warteschlangentheorie?&lt;/h2&gt;
&lt;p&gt;Aus der Telefonvermittlung, wo A. K. Erlang die ersten Ergebnisse für die Kopenhagener Telefongesellschaft erarbeitete.&lt;/p&gt;
&lt;p&gt;Erlangs Aufsatz von 1909 zeigte, dass zufällig eingehende Anrufe der Poisson-Verteilung folgen, und seine Formel für Verluste und Wartezeiten von 1917 nutzten bald Telefongesellschaften in vielen Ländern, so die &lt;a href=&quot;https://mathshistory.st-andrews.ac.uk/Biographies/Erlang/&quot;&gt;MacTutor-Biografie&lt;/a&gt;. David Kendalls Aufsatz von 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;, führte die bis heute gebräuchliche Notation ein, wie Geoffrey Grimmetts &lt;a href=&quot;https://arxiv.org/abs/0810.1091&quot;&gt;Darstellung seines Werks&lt;/a&gt; festhält. Littles &lt;a href=&quot;https://doi.org/10.1287/opre.9.3.383&quot;&gt;Beweis von L = λW&lt;/a&gt; und Kingmans Ergebnisse zu hoher Last folgten 1961.&lt;/p&gt;
&lt;h2&gt;Was bedeutet die Kendall-Notation wie M/M/1?&lt;/h2&gt;
&lt;p&gt;Sie benennt eine Warteschlange in drei Teilen, A/S/c: die Verteilung der Abstände zwischen Ankünften, die der Bedienzeiten und die Zahl der Server. M/M/1 heißt zufällige Ankünfte, exponentielle Bedienzeiten und ein Server.&lt;/p&gt;
&lt;p&gt;M steht für memoryless, also gedächtnislos (Poisson-Ankünfte oder exponentielle Zeiten), D für deterministisch und G für general, also eine beliebige Verteilung: M/D/1 ist ein Server mit konstanter Bedienzeit.&lt;/p&gt;
&lt;h2&gt;Wie wächst die Antwortzeit mit der Auslastung?&lt;/h2&gt;
&lt;p&gt;In einer M/M/1-Warteschlange ist die mittlere Zeit im System W = 1/(μ − λ), also S/(1 − ρ). Nähert sich die Auslastung ρ dem Wert 1, wächst W unbegrenzt.&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 und Odoni leiten das für eine &lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.6.1.html&quot;&gt;Telefonzentrale mit einer Vermittlungskraft&lt;/a&gt; her und zeigen, dass es bei ρ ≥ 1 keinen stationären Zustand gibt: Die Schlange wächst immer weiter. Dieselbe Quelle zeigt, dass die Zeit im System exponentialverteilt ist. Jedes Perzentil wächst also mit demselben Faktor 1/(1 − ρ), und das p95 liegt bei etwa dem Dreifachen des Mittelwerts: 600 ms in der Zeile 0,9 oben.&lt;/p&gt;
&lt;h2&gt;Warum zeigt die Latenz einen Knick, bevor die CPU 100 % erreicht?&lt;/h2&gt;
&lt;p&gt;Weil eine Anfrage immer dann wartet, wenn sie den Server beschäftigt vorfindet, und das geschieht mit steigender Auslastung öfter. Unter M/M/1-Annahmen hat sich die Antwortzeit bei 50 % Auslastung schon verdoppelt.&lt;/p&gt;
&lt;p&gt;Die Ressource, die sättigt, kann auch ein Connection-Pool, ein Datenbank-Lock oder eine Event-Loop mit nur einem Thread sein, und die am stärksten ausgelastete bestimmt die Kurve. Wegen des frühen Knicks liegt die Zielauslastung deutlich unter 100 %. Rechnen Sie vom Latenzbudget zurück: Mit S = 20 ms und einem Mittelwertziel von 100 ms erlaubt die Tabelle etwa 80 %, ein Ziel von 60 ms etwa 67 %, bevor Lastspitzen ihren Teil verlangen.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://loadfocus.com/docs/de-de/guides/load-testing/reading-the-capacity-panel?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=queueing-theory&quot;&gt;Kapazitätsanzeige&lt;/a&gt; von LoadFocus gruppiert einen abgeschlossenen Lauf nach der Zahl aktiver virtueller Benutzer und nennt die letzte Stufe, die hielt, bevor die Fehlerrate 1 % überschritt oder das p95 über das Doppelte der besten Stufe stieg, sofern sich keine höhere Stufe wieder erholte. Dafür braucht sie einen Lauf mit einem einzigen Lastgenerator, der mindestens drei Laststufen hochfährt, wobei die höchste mindestens doppelt so hoch ist wie die niedrigste. Nach der Rechnung oben greift die Verdopplung knapp oberhalb von 50 % Auslastung, wenn die leichteste Stufe den Engpass fast im Leerlauf ließ; hatte die leichteste Stufe ihn schon auf ρ0 ausgelastet, greift sie später, unter M/M/1 oberhalb von (1 + ρ0)/2.&lt;/p&gt;
&lt;h2&gt;Warum zählt Streuung so viel wie Auslastung?&lt;/h2&gt;
&lt;p&gt;Warteschlangen entstehen durch Zufall: Ankünfte in Schüben und gelegentlich langsame Aufträge. Unter hoher Last wächst die Wartezeit mit der Streuung beider, multipliziert mit einem Term ρ/(1 − ρ).&lt;/p&gt;
&lt;p&gt;Kingmans Aufsatz von 1961, &lt;a href=&quot;https://doi.org/10.1017/S0305004100036094&quot;&gt;The single server queue in heavy traffic&lt;/a&gt;, zeigt, dass bei einer Verkehrsintensität eines einzelnen Servers nahe 1 die Schlange lang und die Wartezeit annähernd exponentialverteilt ist. Vorlesungsunterlagen der &lt;a href=&quot;https://www.win.tue.nl/~iadan/2V050/h10.pdf&quot;&gt;TU Eindhoven&lt;/a&gt; und des &lt;a href=&quot;https://serveng.technion.ac.il/files/Lectures/Lecture_GGQ&apos;s_FULL_Marked.pdf&quot;&gt;Technion&lt;/a&gt; geben eine Näherung für ihren Mittelwert an (das Technion nennt sie Allen-Cunneen-Näherung; weithin bekannt ist sie auch als Kingman-Formel):&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 ist die Wartezeit, bevor die Bedienung beginnt, und ca, cs sind die Variationskoeffizienten. Exponentielle Zeiten haben c² = 1, was die M/M/1-Wartezeit von 9S bei 90 % Auslastung ergibt. Eine konstante Bedienzeit halbiert sie auf 4,5S; cs² = 4, wie es eine Mischung aus Cache-Treffern und langsamen Datenbankaufrufen erzeugen kann, hebt sie auf 22,5S. Gleichmäßiger synthetischer Verkehr streut weniger als der Produktivbetrieb, also zeigt ein Test meist weniger Warteschlange, als echte Lastspitzen erzeugen.&lt;/p&gt;
&lt;h2&gt;Wie helfen mehr Server (M/M/c)?&lt;/h2&gt;
&lt;p&gt;Mehrere Server mit einer gemeinsamen Warteschlange fangen zufällige Schübe viel besser ab als dieselben Server mit je einer eigenen, sodass jeder Server bei gleicher Wartezeit stärker ausgelastet sein kann.&lt;/p&gt;
&lt;p&gt;Nach Larson und Odonis &lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.6.2.html&quot;&gt;M/M/m-Formeln&lt;/a&gt; beträgt W bei 90 % Auslastung jedes Servers 10S für einen Server, 5,3S für zwei mit gemeinsamer Schlange und 3,0S für vier. Vier Instanzen hinter einem Balancer, der eine freie wählt, verhalten sich wie der letzte Fall; vier, die jeweils ein zufälliges Viertel des Verkehrs bekommen, wie getrennte M/M/1-Warteschlangen mit 10S.&lt;/p&gt;
&lt;h2&gt;Wie passt Little&amp;#39;s Law dazu?&lt;/h2&gt;
&lt;p&gt;Little&amp;#39;s Law, L = λW, verknüpft die durchschnittliche Zahl der Anfragen in einem System mit ihrer Ankunftsrate und ihrer Verweilzeit, unabhängig von den Verteilungen. Die Warteschlangentheorie liefert W, und Little&amp;#39;s Law macht daraus L.&lt;/p&gt;
&lt;p&gt;In der Zeile 0,9 bedeuten 45 Anfragen pro Sekunde bei W = 200 ms im Schnitt 9 Anfragen im System. Unser &lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Artikel zu Little&amp;#39;s Law&lt;/a&gt; nutzt dasselbe Gesetz, um Lasttests zu dimensionieren und zu prüfen.&lt;/p&gt;
&lt;h2&gt;Wo versagen diese Modelle im Lasttest?&lt;/h2&gt;
&lt;p&gt;Sie setzen einen offenen Strom unabhängiger Ankünfte und einen stationären Zustand voraus. Ein Test mit fester Zahl virtueller Benutzer ist ein geschlossenes System, in dem die Ankünfte langsamer werden, sobald die Antworten es werden.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Geschlossene Tests. Bei N virtuellen Benutzern sind höchstens N Anfragen im System, also fällt die Anfragerate dort, wo eine offene Schlange wachsen würde, und &lt;a href=&quot;https://loadtest.app/de/think-time-in-load-testing/&quot;&gt;Think Time&lt;/a&gt; senkt sie weiter. Unser Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; erklärt, warum das eine Sättigung verbirgt.&lt;/li&gt;
&lt;li&gt;LoadFocus führt &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=queueing-theory&quot;&gt;k6-Skripte&lt;/a&gt; aus, aber Arrival-Rate-Szenarien laufen dort mit einer festen Zahl von Benutzern, worauf der Skript-Validator hinweist. Lesen Sie solche Läufe als geschlossene Tests: Hinter dem Knick sind eine flache Anfragerate und steigende Antwortzeiten zu erwarten.&lt;/li&gt;
&lt;li&gt;Stationärer Zustand. Aufwärmphase, Caches und Autoscaling ändern die Bedienrate während des Laufs, also vergleichen Sie Stufen, die lange genug gehalten wurden.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Heißt es queueing theory oder queuing theory?&lt;/strong&gt;
Beide englischen Schreibweisen sind korrekt und bezeichnen dasselbe Gebiet. Kingmans Aufsatz von 1961 schreibt „queueing time“, während Littles Beweis aus demselben Jahr „Queuing Formula“ im Titel trägt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Braucht die Warteschlangentheorie Poisson-Ankünfte?&lt;/strong&gt;
Nur für exakte M/M/1-Ergebnisse. G/G/1-Näherungen wie die Kingman-Formel arbeiten mit Mittelwert und Streuung der Ankunftsabstände und Bedienzeiten, und Little&amp;#39;s Law braucht keine Annahme über die Verteilungen.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law im Lasttest: Tests dimensionieren und prüfen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/think-time-in-load-testing/&quot;&gt;Think Time im Lasttest: was sie ist und wie man sie wählt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>SLO vs. SLA: der Unterschied, SLIs und Fehlerbudgets</title><link>https://loadtest.app/de/slo-vs-sla/</link><guid isPermaLink="true">https://loadtest.app/de/slo-vs-sla/</guid><description>SLO vs. SLA erklärt: wer was festlegt, was ein SLI ist, wie Fehlerbudgets wirken, welche Ausfallzeit 99,9 % erlaubt und wie ein Lasttest ein SLO prüft.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Ein SLA (Service Level Agreement) ist ein Vertrag mit einem Kunden, der festlegt, was passiert, wenn ein Dienst ein zugesagtes Niveau verfehlt, meist eine Gutschrift (Service Credit). Ein SLO (Service Level Objective) ist das interne Ziel, an dem ein Team den Dienst ausrichtet; das SRE-Buch rät, es strenger anzusetzen als das SLA, damit Probleme behoben sind, bevor der Vertrag verletzt wird. Ein SLI (Service Level Indicator) ist die Messgröße, in der beide formuliert sind, etwa der Anteil erfolgreicher Anfragen.&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;Was es ist&lt;/td&gt;
&lt;td&gt;Eine Messgröße&lt;/td&gt;
&lt;td&gt;Ein Ziel für einen SLI&lt;/td&gt;
&lt;td&gt;Ein Vertrag auf Basis von SLOs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Festgelegt von&lt;/td&gt;
&lt;td&gt;Engineering&lt;/td&gt;
&lt;td&gt;Product Owner und Engineering&lt;/td&gt;
&lt;td&gt;Fachbereich und Rechtsabteilung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bei Verfehlung&lt;/td&gt;
&lt;td&gt;Für sich allein nichts&lt;/td&gt;
&lt;td&gt;Fehlerbudget verbraucht&lt;/td&gt;
&lt;td&gt;Gutschriften oder Vertragsstrafen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beispiel&lt;/td&gt;
&lt;td&gt;Erfolgreiche Checkout-Aufrufe&lt;/td&gt;
&lt;td&gt;99,95 % über vier Wochen&lt;/td&gt;
&lt;td&gt;99,9 % pro Monat, sonst Gutschrift&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Die Beispiele dienen der Veranschaulichung; die Quellen sind Googles SRE-Buch und SRE-Workbook sowie das AWS-Compute-SLA, geprüft am 1. November 2026.&lt;/p&gt;
&lt;h2&gt;Wofür stehen SLI, SLO und SLA?&lt;/h2&gt;
&lt;p&gt;Service Level Indicator, Service Level Objective und Service Level Agreement. Der Indikator ist das, was Sie messen, das Ziel der Wert, den Sie anstreben, und die Vereinbarung das, was Sie jemand anderem zusagen, mit Konsequenzen.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://sre.google/sre-book/service-level-objectives/&quot;&gt;Kapitel „Service Level Objectives“ im SRE-Buch&lt;/a&gt; definiert ein SLA als „ausdrücklichen oder stillschweigenden Vertrag mit Ihren Nutzern, der Konsequenzen für das Einhalten (oder Verfehlen) der darin enthaltenen SLOs vorsieht“. Der Test des Kapitels ist eine einzige Frage: Was passiert, wenn die SLOs verfehlt werden? Gibt es keine ausdrückliche Konsequenz, haben Sie es fast sicher mit einem SLO zu tun.&lt;/p&gt;
&lt;p&gt;Das Kapitel ergänzt, dass die meisten Leute SLO meinen, wenn sie SLA sagen, und dass eine echte SLA-Verletzung als Vertragsbruch vor Gericht enden kann. Wenn eine Besprechung also in einen Streit über SLA vs. SLO kippt, fragen Sie zuerst, ob eine Konsequenz, meist Geld, in einem Vertrag festgeschrieben ist.&lt;/p&gt;
&lt;p&gt;Das SRE-Buch rät zu einer Sicherheitsmarge: „Ein strengeres internes SLO als das den Nutzern kommunizierte SLO gibt Ihnen Raum, auf chronische Probleme zu reagieren, bevor sie nach außen sichtbar werden.“ Sein Kapitel „Embracing Risk“ wendet denselben Gedanken auf einen Vertrag an: ein externes Ziel von 99,9 %, abgesichert durch ein strengeres internes.&lt;/p&gt;
&lt;h2&gt;Was ist ein Fehlerbudget?&lt;/h2&gt;
&lt;p&gt;Es ist 100 % minus das SLO: der Anteil der Anfragen oder der Zeit, der im Zeitfenster fehlschlagen darf. Solange Budget übrig ist, liefert das Team weiter aus; ist es verbraucht, hat Zuverlässigkeitsarbeit Vorrang.&lt;/p&gt;
&lt;p&gt;Das Kapitel &lt;a href=&quot;https://sre.google/workbook/implementing-slos/&quot;&gt;„Implementing SLOs“ im SRE-Workbook&lt;/a&gt; rechnet es vor: Bei einem SLO von 99,9 % darf ein Dienst, der in vier Wochen 3 Millionen Anfragen erhält, bei 3.000 davon scheitern; ein einzelner Ausfall mit 1.500 Fehlern verbraucht also das halbe Budget. Das Kapitel &lt;a href=&quot;https://sre.google/sre-book/embracing-risk/&quot;&gt;„Embracing Risk“&lt;/a&gt; des Buchs erklärt den Zweck: Das Produktmanagement legt das SLO fest, das Monitoring misst die tatsächliche Uptime, und die Differenz ist die Unzuverlässigkeit, die für das Quartal bleibt. Ist dieses Budget aufgebraucht, werden Releases gestoppt oder verlangsamt.&lt;/p&gt;
&lt;h2&gt;Wie viel Ausfallzeit erlaubt 99,9 %?&lt;/h2&gt;
&lt;p&gt;Etwa 43 Minuten in einem Zeitfenster von 30 Tagen. Jede weitere Neun teilt den Spielraum durch zehn, 99,99 % lassen also knapp über 4 Minuten.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SLO&lt;/th&gt;
&lt;th&gt;Fehlerbudget&lt;/th&gt;
&lt;th&gt;Ausfallzeit pro 30 Tage&lt;/th&gt;
&lt;th&gt;Fehler pro 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;Multiplizieren Sie die 43.200 Minuten eines 30-Tage-Fensters mit dem Fehlerbudget. Beachten Sie die Warnung des Workbooks: Jede weitere Neun kostet mehr, während ihr Nutzen für die Anwender gegen null geht.&lt;/p&gt;
&lt;h2&gt;Wie sieht ein echtes SLA aus?&lt;/h2&gt;
&lt;p&gt;Es nennt einen gemessenen Prozentsatz, einen Abrechnungszeitraum, eine Staffel für Gutschriften und das, was nicht zählt. Das AWS-Compute-SLA ist ein kurzes öffentliches Beispiel.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://aws.amazon.com/compute/sla/&quot;&gt;Amazon Compute Service Level Agreement&lt;/a&gt; (zuletzt aktualisiert am 25. Mai 2022; geprüft am 1. November 2026) sagt eine Monthly Uptime Percentage von mindestens 99,99 % pro Region für EC2-Instanzen zu, die über zwei oder mehr Availability Zones verteilt sind, und 99,5 % für eine einzelne Instanz. Die Uptime ist 100 % minus der Anteil der Minuten, in denen EC2 nicht verfügbar war. Nach dem Region-Level SLA beträgt die Gutschrift unter 99,99 % 10 % der EC2-Monatsrechnung in der Region, unter 99,0 % 30 % und unter 95,0 % 100 %; bei einer einzelnen Instanz beginnt die 10-%-Stufe unter 99,5 %. Gutschriften werden mit künftigen Zahlungen verrechnet, müssen über den AWS Support beantragt werden und sind der „einzige und ausschließliche“ Rechtsbehelf, sofern die Kundenvereinbarung nichts anderes vorsieht.&lt;/p&gt;
&lt;p&gt;Verglichen mit der Ausfalltabelle reicht die 10-%-Stufe des Region-Level SLA von etwa 4 Minuten bis 7 Stunden Nichtverfügbarkeit in einem 30-Tage-Monat. Ein SLA begrenzt, was der Anbieter schuldet; Ausfälle von Ihren Nutzern fernzuhalten, ist die Aufgabe Ihrer eigenen Ziele.&lt;/p&gt;
&lt;h2&gt;Wie wählt man SLIs für Latenz und Verfügbarkeit?&lt;/h2&gt;
&lt;p&gt;Messen Sie die Latenz als Perzentil und die Verfügbarkeit als gute Ereignisse geteilt durch alle Ereignisse, so nah am Nutzer wie möglich. Durchschnitte und reine Serverwerte verbergen die Anfragen, über die sich Leute beschweren.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latenz.&lt;/strong&gt; Das SRE-Buch zieht Perzentile dem Mittelwert vor, weil ein Durchschnitt flach bleiben kann, während die langsamsten Anfragen deutlich langsamer werden. Das Workbook schreibt Latenz-SLIs als Verhältnis, etwa Aufrufe unter 100 ms geteilt durch alle Aufrufe. „99 % der Checkout-Aufrufe unter 400 ms“ heißt also über das Zeitfenster dasselbe wie „p99 des Checkouts unter 400 ms“ und lässt sich direkt in einen Test übernehmen. Unser Artikel zur &lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz&lt;/a&gt; erklärt, warum p99 zählt, sobald eine Seite mehrere Dienste aufruft.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verfügbarkeit.&lt;/strong&gt; Zeitbasierte Verfügbarkeit zählt Minuten mit Uptime, wie das AWS-SLA. Anfragebasierte Verfügbarkeit zählt erfolgreiche Anfragen: „Embracing Risk“ beschreibt einen Dienst mit 2,5 Millionen Anfragen am Tag und einem Tagesziel von 99,99 %, der 250 Fehler liefern darf und das Ziel trotzdem erreicht.&lt;/p&gt;
&lt;h2&gt;Wo gehen SLOs schief?&lt;/h2&gt;
&lt;p&gt;Meist an zu vielen Zielen, an Zielen von 100 % und an Indikatoren, die dort messen, wo die Nutzer nicht sind. Jeder dieser Fehler ergibt eine Zahl, nach der niemand handelt, oder eine, die gut aussieht, während die Nutzer leiden.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zu viele SLOs.&lt;/strong&gt; Das SRE-Buch rät zu so wenigen wie möglich: Wenn sich mit einem SLO nie eine Diskussion über Prioritäten gewinnen lässt, lohnt es sich wahrscheinlich nicht.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ziele von 100 %.&lt;/strong&gt; Das Workbook nennt 100 % das falsche Ziel: Komponenten fallen aus, Änderungen sind die Hauptursache von Ausfällen, und ein SLO von 100 % lässt nur Zeit zum Reagieren.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nur am Server messen.&lt;/strong&gt; Servermetriken übersehen Probleme, die Nutzer spüren, etwa ein langsames Skript in der Seite. Das Workbook empfiehlt, am Load Balancer oder beim Client zu messen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Was hat Lasttesten mit SLOs zu tun?&lt;/h2&gt;
&lt;p&gt;Ein SLO liefert einem Lasttest seine Pass/Fail-Kriterien, und ein Test bei der erwarteten Spitzenlast zeigt, ob das Latenz-SLO hält, bevor dieser Verkehr eintrifft. Das Monitoring in Produktion sagt es Ihnen erst hinterher.&lt;/p&gt;
&lt;p&gt;Das SRE-Buch stellt fest, dass mehr Anfragen pro Sekunde (QPS) oft zu höheren Latenzen führen und Dienste jenseits einer bestimmten Lastschwelle häufig eine Leistungsklippe haben. Ein Lasttest kann diese Klippe finden, wenn er bei der erwarteten Spitzenlast mit einem realistischen Anfragemix läuft und denselben SLI misst, den das SLO nutzt. Setzen Sie jeden Schwellenwert im Test etwas strenger als das SLO, wie unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests&lt;/a&gt; beschreibt. Ein Lauf dauert Minuten und kann daher keine monatliche Verfügbarkeit messen.&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, bewertet Lasttests anhand von &lt;a href=&quot;https://loadfocus.com/docs/de-de/guides/load-testing/pass-fail-thresholds?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=slo-vs-sla&quot;&gt;Pass/Fail-Schwellenwerten&lt;/a&gt;, die am Test gespeichert sind: Max P95 und Max P99 der Antwortzeit, eine maximale Fehlerrate und ein Mindestdurchsatz, für Cloud-, JMeter- und k6-Tests. Sein API-Monitoring bietet &lt;a href=&quot;https://loadfocus.com/docs/de-de/guides/api-monitoring/sla-slo-reports?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=slo-vs-sla&quot;&gt;SLA-/SLO-Berichte&lt;/a&gt;, die pro Monitor ein SLO-Ziel festlegen und Uptime, verbrauchtes Fehlerbudget und einen Status OK oder Breached zeigen.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Wofür steht SLO?&lt;/strong&gt;
Service Level Objective: ein Zielwert für ein gemessenes Serviceniveau, etwa 99,9 % erfolgreiche Anfragen über vier Wochen. Es wird intern festgelegt, von Produkt und Engineering, und zieht für sich allein keine vertragliche Strafe nach sich.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann man ein SLO ohne SLA haben?&lt;/strong&gt;
Ja. Das SRE-Buch nennt die Google-Suche als wichtigen Dienst ohne öffentliches SLA, der trotzdem mit SLIs und SLOs gesteuert wird.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sollte ein SLO jemals 100 % betragen?&lt;/strong&gt;
Nein. Ein Ziel von 100 % lässt kein Fehlerbudget übrig, jeder Fehler verletzt es also, und keine Änderung lässt sich je gefahrlos ausliefern.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests: so legen Sie sie fest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/apdex-score/&quot;&gt;Apdex-Score: was er bedeutet und wie man ihn berechnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>TPC-H: was der Benchmark misst und wie Sie ihn ausführen</title><link>https://loadtest.app/de/tpc-h/</link><guid isPermaLink="true">https://loadtest.app/de/tpc-h/</guid><description>TPC-H erklärt: 8 Tabellen, 22 Abfragen, Skalierungsfaktor, QphH, Power- und Durchsatztest, auditierte und informelle Läufe und wann TPC-DS besser passt.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;TPC-H ist der Benchmark für Entscheidungsunterstützung des Transaction Processing Performance Council (TPC): 22 geschäftliche Abfragen und zwei Refresh-Funktionen laufen gegen acht Tabellen, die das TPC-Programm dbgen bei einem gewählten Skalierungsfaktor füllt, wobei Faktor 1 etwa 1 GB entspricht. Seine Kennzahl QphH@Size kombiniert einen Power-Test (ein einzelner Abfragestrom) mit einem Durchsatztest (mehrere Abfrageströme), und offizielle Ergebnisse nennen zusätzlich einen Preis pro kQphH@Size. Nur auditierte, auf tpc.org veröffentlichte Ergebnisse gelten als offiziell; jede außerhalb von tpc.org veröffentlichte Zahl im Stil von TPC-H gilt nach den Fair-Use-Regeln des TPC als abgeleiteter Workload und darf nicht mit offiziellen Ergebnissen verglichen werden.&lt;/p&gt;
&lt;p&gt;Wir haben den Benchmark für diesen Leitfaden nicht selbst ausgeführt. Die Fakten stammen von tpc.org, aus der Spezifikation in Revision 3.0.1, die tpc.org als aktuell führt, und aus der Dokumentation der jeweiligen Tools, alles geprüft am 1. November 2026. Die Einschätzungen sind unsere eigenen.&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;Workload&lt;/td&gt;
&lt;td&gt;Entscheidungsunterstützung: Ad-hoc-Abfragen plus Datenaktualisierungen&lt;/td&gt;
&lt;td&gt;OLTP: Bestellungen eines Großhändlers&lt;/td&gt;
&lt;td&gt;Entscheidungsunterstützung: Abfragen plus Datenpflege&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Umfang&lt;/td&gt;
&lt;td&gt;8 Tabellen, 22 Abfragen, 2 Refresh-Funktionen&lt;/td&gt;
&lt;td&gt;9 Tabellentypen, 5 Transaktionstypen&lt;/td&gt;
&lt;td&gt;Snowflake-Schema, 7 Faktentabellen, 99 Abfragen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primäre Kennzahl&lt;/td&gt;
&lt;td&gt;QphH@Size und $/kQphH@Size&lt;/td&gt;
&lt;td&gt;tpmC&lt;/td&gt;
&lt;td&gt;QphDS@SF und $/kQphDS@SF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aktuelle Version&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;Was misst TPC-H?&lt;/h2&gt;
&lt;p&gt;Wie schnell ein System komplexe analytische Abfragen über einen großen Datenbestand beantwortet, während neue Verkäufe eintreffen und alte gelöscht werden. Eine einzige Spezifikation legt Schema, Abfragen, Daten und Regeln fest.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://www.tpc.org/tpch/&quot;&gt;TPC-H-Seite&lt;/a&gt; beschreibt eine Reihe geschäftsorientierter Ad-hoc-Abfragen mit gleichzeitigen Datenänderungen (geprüft am 1. November 2026). Die &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf&quot;&gt;Spezifikation&lt;/a&gt; definiert acht Tabellen: PART, PARTSUPP, LINEITEM, ORDERS, CUSTOMER, SUPPLIER, NATION und REGION. Alle außer den letzten beiden wachsen mit dem Skalierungsfaktor; LINEITEM, die größte, enthält etwa 6.000.000 Zeilen pro Einheit. Die Refresh-Funktion RF1 fügt neue Zeilen in ORDERS und LINEITEM ein, RF2 entfernt alte Verkäufe (geprüft am 1. November 2026).&lt;/p&gt;
&lt;h2&gt;Wie wird das TPC-H-Ergebnis berechnet?&lt;/h2&gt;
&lt;p&gt;Ein Lauf besteht aus einem Power-Test und einem anschließenden Durchsatztest, und QphH@Size ist das geometrische Mittel beider Ergebnisse. Die Preiskennzahl ist der Gesamtpreis des Systems geteilt durch QphH@Size, mal 1.000.&lt;/p&gt;
&lt;p&gt;Im Power-Test führt ein Refresh-Strom RF1 aus, eine einzelne Abfragesitzung führt alle 22 Abfragen einmal aus, dann führt der Refresh-Strom RF2 aus. Power@Size ist 3.600 mal der Skalierungsfaktor, geteilt durch das geometrische Mittel dieser 24 Zeiten. Im Durchsatztest laufen mehrere Abfrageströme neben einem Refresh-Strom: mindestens 2 bei Faktor 1, bis zu 11 bei Faktor 100.000. Throughput@Size sind die Abfragen pro Stunde über alle Ströme, mal den Skalierungsfaktor. Ein vollständiger Test hat zwei Läufe, und der Sponsor meldet den mit dem niedrigeren QphH (alles laut &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf&quot;&gt;Spezifikation&lt;/a&gt;, geprüft am 1. November 2026).&lt;/p&gt;
&lt;p&gt;Das geometrische Mittel gewichtet jede Abfrage gleich, daher hebt die Halbierung der Zeit einer einzigen Abfrage Power nur um etwa 3 %. Ein offizielles Ergebnis nutzt einen Skalierungsfaktor aus einer festen Liste: 1, 10, 30, 100 und so weiter bis 100.000.&lt;/p&gt;
&lt;h2&gt;Wer veröffentlicht TPC-H-Ergebnisse, und welche zählen?&lt;/h2&gt;
&lt;p&gt;Hersteller, die einen Test sponsern, veröffentlichen auditierte Ergebnisse auf tpc.org, und nur diese gelten als offiziell. Jeder andere Lauf ist ein abgeleiteter Workload mit eigenen Regeln.&lt;/p&gt;
&lt;p&gt;Die Spezifikation verlangt ein unabhängiges Audit durch einen vom TPC zertifizierten Auditor. Die &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/Fair_Use_Quick_Reference_v1.0.0.pdf&quot;&gt;Fair-Use-Kurzreferenz&lt;/a&gt; des TPC erlaubt den TPC-Namen neben Ergebnissen nur für offiziell veröffentlichte Ergebnisse. Alles andere braucht das Präfix „Derived from“, darf die TPC-Kennzahl nicht verwenden, muss einen Hinweis tragen, dass es mit veröffentlichten Ergebnissen nicht vergleichbar ist, sollte Umgebung und Abweichungen offenlegen und darf nicht mit offiziellen Ergebnissen verglichen werden (geprüft am 1. November 2026).&lt;/p&gt;
&lt;h2&gt;Wie führen Sie TPC-H selbst aus?&lt;/h2&gt;
&lt;p&gt;Erzeugen Sie Daten und Abfragetext, laden Sie die Tabellen und führen Sie dann den Power-Test und anschließend den Durchsatztest aus. Dafür eignen sich die Tools des TPC, ein Kit für eine bestimmte Datenbank oder eine Engine mit eingebautem Generator.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://www.tpc.org/tpc_documents_current_versions/current_specifications5.asp&quot;&gt;Seite mit den aktuellen Spezifikationen&lt;/a&gt; des TPC bietet ein kostenloses Tool-Paket an: Sie registrieren sich, akzeptieren eine Lizenz und erhalten den Link per E-Mail. Laut Spezifikation müssen DBGen die Daten und QGen den Abfragetext erzeugen (geprüft am 1. November 2026).&lt;/p&gt;
&lt;p&gt;Für PostgreSQL beschreibt die &lt;a href=&quot;https://wiki.postgresql.org/wiki/TPC-H&quot;&gt;TPC-H-Seite im Wiki&lt;/a&gt; kein Schritt-für-Schritt-Verfahren und verweist auf &lt;a href=&quot;https://wiki.postgresql.org/wiki/DBT-3&quot;&gt;DBT-3&lt;/a&gt;, ein vollständiges Kit, das die DBT-3-Seite des Wikis eine Fair-Use-Implementierung der Spezifikation nennt. &lt;strong&gt;HammerDB&lt;/strong&gt; bringt TPROC-H mit, das seine &lt;a href=&quot;https://www.hammerdb.com/docs/ch11s01.html&quot;&gt;Dokumentation&lt;/a&gt; als von TPC-H abgeleiteten Open-Source-Workload beschreibt, der mit veröffentlichten Ergebnissen nicht vergleichbar ist. Es läuft auf PostgreSQL, MySQL, Oracle und weiteren Engines, und die Dokumentation empfiehlt, das &lt;a href=&quot;https://www.hammerdb.com/docs/ch11s02.html&quot;&gt;geometrische Mittel der Abfragezeiten&lt;/a&gt; zu vergleichen, statt QphH zu berechnen (alles geprüft am 1. November 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DuckDB&lt;/strong&gt; hat eine Extension &lt;code&gt;tpch&lt;/code&gt;, die laut ihrer &lt;a href=&quot;https://duckdb.org/docs/stable/core_extensions/tpch&quot;&gt;Dokumentation&lt;/a&gt; den Datengenerator und die Abfragen implementiert. Diese Zeilen erzeugen Faktor 1, führen Abfrage 4 aus und listen die 22 Abfragen auf:&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;Dieselbe Seite warnt, dass die Daten leicht von der Spezifikation abweichen, dass jede Abfrage mit festen Parametern läuft und dass &lt;code&gt;dbgen&lt;/code&gt; bestehende Tabellen nicht löscht. Für vollständig konforme Daten verweist sie auf &lt;code&gt;tpchgen-cli&lt;/code&gt; (geprüft am 1. November 2026).&lt;/p&gt;
&lt;h2&gt;Wie lesen Sie TPC-H-Ergebnisse ehrlich?&lt;/h2&gt;
&lt;p&gt;Vergleichen Sie Ergebnisse nur bei gleichem Skalierungsfaktor und gleicher Benchmark-Version, und lesen Sie jede Kennzahl mit ihrem Größensuffix. Ein Diagramm einzelner Abfragezeiten zeigt weder den Power-Test noch den Durchsatztest.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://www.tpc.org/tpch/results/tpch_results5.asp&quot;&gt;Ergebnisseite&lt;/a&gt; gruppiert die Ergebnisse nach Datenbankgröße und enthält drei Hinweise: Ergebnisse der Versionen 2 und 3 sind nicht vergleichbar, Preis-Leistung in verschiedenen Währungen sollte nicht verglichen werden, und Vergleiche über Datenbankgrößen hinweg sind irreführend (geprüft am 1. November 2026). Die Spezifikation ergänzt, dass Ergebnisse mit unterschiedlicher Zahl von Strömen bei gleicher Datenbankgröße vergleichbar sind.&lt;/p&gt;
&lt;p&gt;Achten Sie bei einem informellen Lauf auf das, was die Fair-Use-Regeln verlangen: Hardware und Arbeitsspeicher, Änderungen an Schema oder Abfragetext und ob Refresh-Funktionen liefen. Ein Beitrag, der die 22 Abfragen einmal mit warmem Cache und ohne Refresh-Strom misst, bildet nur die Abfragehälfte eines Power-Tests ab, wobei ein solcher Lauf für die eigene Regressionskontrolle trotzdem hilft. Zum Verhältnis von Abfragerate und Antwortzeit siehe &lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Wann sollten Sie etwas anderes als TPC-H nutzen?&lt;/h2&gt;
&lt;p&gt;Wenn der Workload transaktional ist, wenn Sie einen neueren Analytics-Benchmark möchten oder wenn es darum geht, was Benutzer erleben. Der Benchmark bildet einen analytischen Workload ab, ohne kurze Transaktionen und ohne Anwendungsschicht.&lt;/p&gt;
&lt;p&gt;Wählen Sie &lt;strong&gt;TPC-DS&lt;/strong&gt; für einen breiteren Test der Entscheidungsunterstützung: Die &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-DS_v4.0.0.pdf&quot;&gt;Spezifikation in Version 4.0.0&lt;/a&gt; nutzt ein Snowflake-Schema mit sieben Faktentabellen und 99 Abfragen, und die &lt;a href=&quot;https://www.tpc.org/tpcds/&quot;&gt;Übersichtsseite&lt;/a&gt; sagt, dass Ergebnisse der Version 4 nicht mit früheren Versionen vergleichbar sind. Wählen Sie &lt;strong&gt;TPC-C&lt;/strong&gt; oder das TPROC-C von HammerDB für OLTP im Stil einer Auftragserfassung: Die &lt;a href=&quot;https://www.tpc.org/tpcc/&quot;&gt;TPC-C-Seite&lt;/a&gt; beschreibt fünf Transaktionstypen, gemessen in tpmC (alles geprüft am 1. November 2026). Für einen schnellen Check einer einzelnen Datenbank deckt &lt;a href=&quot;https://loadtest.app/de/pgbench/&quot;&gt;pgbench&lt;/a&gt; PostgreSQL ab und &lt;a href=&quot;https://loadtest.app/de/sysbench/&quot;&gt;sysbench&lt;/a&gt; MySQL.&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, führt TPC-H nicht aus; seine Tests zielen auf Web- und API-Endpoints. LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tpc-h&quot;&gt;führt JMeter-Testpläne und k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen aus, ohne JDBC-Treiber und ohne SQL-Modul, und kann sich daher nicht mit der Datenbank verbinden. Wählen Sie für diese Aufgabe statt LoadFocus ein Datenbank-Benchmark-Tool wie die DuckDB-Extension, DBT-3 oder HammerDB, und nutzen Sie LoadFocus für die Web- oder API-Schicht vor der Datenbank.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Was ist der Unterschied zwischen TPC-H und TPC-DS?&lt;/strong&gt;
Beide sind Benchmarks des TPC für Entscheidungsunterstützung. TPC-H nutzt 8 Tabellen und 22 Abfragen und meldet QphH@Size, TPC-DS nutzt ein Snowflake-Schema mit sieben Faktentabellen und 99 Abfragen und meldet QphDS@SF.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Was bedeutet QphH@Size in TPC-H?&lt;/strong&gt;
Es ist die zusammengesetzte Kennzahl für Abfragen pro Stunde: das geometrische Mittel der Ergebnisse von Power-Test und Durchsatztest bei einer Datenbankgröße. Das Suffix nennt diese Größe, etwa QphH@1000GB, und Ergebnisse bei verschiedenen Größen sollten nicht verglichen werden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus TPC-H ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter-Testpläne und k6-Skripte gegen Web- und API-Endpoints aus und hat keine SQL-Verbindung, nutzen Sie also für TPC-H ein Datenbank-Benchmark-Tool und LoadFocus für die Anwendungsschicht vor der Datenbank.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/pgbench/&quot;&gt;pgbench: PostgreSQL benchmarken und unter Last testen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/sysbench/&quot;&gt;sysbench nutzen: CPU-, Festplatten- und MySQL-Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/ycsb/&quot;&gt;YCSB: Workloads A-F, Ausführung und Grenzen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/redis-benchmark/&quot;&gt;redis-benchmark: richtig nutzen und die Zahlen lesen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>pgbench: PostgreSQL benchmarken und unter Last testen</title><link>https://loadtest.app/de/pgbench/</link><guid isPermaLink="true">https://loadtest.app/de/pgbench/</guid><description>pgbench erklärt: Initialisierung mit -s, Läufe mit -c, -j und -T, eigene Skripte, Drosselung mit -R und das Lesen von tps, Latenz und Fehlschlägen.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;pgbench ist das Benchmark-Programm, das mit PostgreSQL ausgeliefert wird: Es führt dieselbe SQL-Transaktion in mehreren gleichzeitigen Datenbanksitzungen immer wieder aus und meldet Transaktionen pro Sekunde und Latenz. Die Testtabellen legen Sie mit &lt;code&gt;pgbench -i -s 50 mydb&lt;/code&gt; an, danach startet etwa &lt;code&gt;pgbench -c 10 -j 2 -T 300 mydb&lt;/code&gt; zehn Clients auf zwei Threads für fünf Minuten. Es misst nur die Datenbank und sagt daher nichts darüber, was Benutzer über die Anwendung davor erleben.&lt;/p&gt;
&lt;p&gt;Wir haben pgbench für diesen Leitfaden nicht selbst ausgeführt. Die Fakten stammen aus der pgbench-Seite der Dokumentation zu PostgreSQL 18, der Version, die postgresql.org als aktuell führt, geprüft am 31. Oktober 2026; die Einschätzungen sind unsere eigenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Wirkung&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;Testtabellen anlegen / Skalierungsfaktor (100.000 Konten pro Einheit)&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, also gleichzeitige Datenbanksitzungen (Standard 1)&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;Worker-Threads in pgbench (Standard 1)&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;Laufzeit in Sekunden oder Transaktionen pro Client (Standard 10)&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;Eingebautes Skript oder eigene Datei, optional mit &lt;code&gt;@Gewicht&lt;/code&gt;&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;Fortschrittsbericht alle N Sekunden&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;Zielrate in tps / Latenzgrenze in 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;Latenzen pro Anweisung / eine Logzeile pro Transaktion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was misst pgbench?&lt;/h2&gt;
&lt;p&gt;Es führt ein Transaktionsskript in einer festen Zahl von Datenbanksitzungen immer wieder aus und meldet die durchschnittliche Transaktionsrate und die Latenz. Das Standardskript lehnt sich lose an den Banken-Benchmark TPC-B an.&lt;/p&gt;
&lt;p&gt;Laut &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;pgbench-Dokumentation&lt;/a&gt; ist das Standardszenario von TPC-B inspiriert und eben kein echtes TPC-B, daher der Name: Die Ausgabe nennt es &lt;code&gt;TPC-B (sort of)&lt;/code&gt; (geprüft am 31. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie richten Sie eine pgbench-Datenbank ein?&lt;/h2&gt;
&lt;p&gt;Führen Sie &lt;code&gt;pgbench -i&lt;/code&gt; gegen eine bestehende Datenbank aus, mit &lt;code&gt;-s&lt;/code&gt; für den Skalierungsfaktor. Der Befehl legt vier Tabellen an und löscht vorhandene Tabellen gleichen Namens, geben Sie pgbench also eine eigene Datenbank.&lt;/p&gt;
&lt;p&gt;Bei Faktor 1 enthält &lt;code&gt;pgbench_branches&lt;/code&gt; eine Zeile, &lt;code&gt;pgbench_tellers&lt;/code&gt; 10, &lt;code&gt;pgbench_accounts&lt;/code&gt; 100.000 und &lt;code&gt;pgbench_history&lt;/code&gt; keine, und &lt;code&gt;-s&lt;/code&gt; vervielfacht diese Zeilen: &lt;code&gt;-s 100&lt;/code&gt; ergibt 10.000.000 Zeilen in &lt;code&gt;pgbench_accounts&lt;/code&gt;. Eine Größe auf der Festplatte nennt die Dokumentation nicht, messen Sie sie also nach der Initialisierung (geprüft am 31. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welche eingebauten Skripte bringt pgbench mit?&lt;/h2&gt;
&lt;p&gt;Drei: &lt;code&gt;tpcb-like&lt;/code&gt; (der Standard), &lt;code&gt;simple-update&lt;/code&gt; und &lt;code&gt;select-only&lt;/code&gt;. Sie wählen eines mit &lt;code&gt;-b&lt;/code&gt; oder mit den Kurzformen &lt;code&gt;-N&lt;/code&gt; und &lt;code&gt;-S&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Das Standardskript führt sieben Befehle pro Transaktion aus: &lt;code&gt;BEGIN&lt;/code&gt;, ein Update und ein Select auf ein zufälliges Konto, Updates auf &lt;code&gt;pgbench_tellers&lt;/code&gt; und &lt;code&gt;pgbench_branches&lt;/code&gt;, einen Insert in &lt;code&gt;pgbench_history&lt;/code&gt; und &lt;code&gt;END&lt;/code&gt;. &lt;code&gt;simple-update&lt;/code&gt; lässt die beiden Updates auf den kleinen Tabellen weg, vermeidet so Konflikte dort und entfernt den Test laut Dokumentation noch weiter von TPC-B. &lt;code&gt;select-only&lt;/code&gt; sendet nur das Select.&lt;/p&gt;
&lt;h2&gt;Wie schreiben Sie ein eigenes pgbench-Skript?&lt;/h2&gt;
&lt;p&gt;Schreiben Sie Ihr SQL in eine Datei, setzen Sie Variablen mit &lt;code&gt;\set&lt;/code&gt; und den Zufallsfunktionen und übergeben Sie die Datei mit &lt;code&gt;-f&lt;/code&gt;. Jede Ausführung der Datei zählt als eine Transaktion.&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;Ein Gewicht nach &lt;code&gt;@&lt;/code&gt; legt fest, wie oft jedes Skript gewählt wird: &lt;code&gt;-f update.sql@9 -b select-only@1&lt;/code&gt; wählt die Datei in etwa neun von zehn Fällen. Die Dokumentation nennt außerdem &lt;code&gt;random_exponential&lt;/code&gt;, &lt;code&gt;random_gaussian&lt;/code&gt; und &lt;code&gt;random_zipfian&lt;/code&gt;, mit denen sich einige Zeilen zu Hotspots machen lassen. &lt;code&gt;\sleep&lt;/code&gt; fügt eine Pause ein, das Datenbank-Gegenstück zur &lt;a href=&quot;https://loadtest.app/de/think-time-in-load-testing/&quot;&gt;Think Time&lt;/a&gt;. Wenn Sie nur eigene Dateien ausführen, geben Sie den Skalierungsfaktor der Datenbank mit &lt;code&gt;-s&lt;/code&gt; an, sonst bleibt &lt;code&gt;:scale&lt;/code&gt; bei 1 und das Skript oben trifft nur die ersten 100.000 Konten. Mit eigenen Tabellen lassen Sie &lt;code&gt;-i&lt;/code&gt; weg und setzen &lt;code&gt;-n&lt;/code&gt;, damit pgbench die Standardtabellen nicht per VACUUM bereinigt (geprüft am 31. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welche Optionen machen pgbench zum Lasttest?&lt;/h2&gt;
&lt;p&gt;Die Parallelität kommt aus &lt;code&gt;-c&lt;/code&gt; und &lt;code&gt;-j&lt;/code&gt;, die Dauer aus &lt;code&gt;-T&lt;/code&gt; und die Form der Last aus &lt;code&gt;-R&lt;/code&gt;. Ohne &lt;code&gt;-R&lt;/code&gt; startet jeder Client seine nächste Transaktion, sobald die vorige endet.&lt;/p&gt;
&lt;p&gt;Diese Voreinstellung ist ein geschlossenes Lastmodell, wie unser Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; erklärt. Mit &lt;code&gt;-R&lt;/code&gt; startet pgbench Transaktionen nach einem Poisson-verteilten Zeitplan, der ab dem Start des Clients voranschreitet, egal wie es früheren Transaktionen ergangen ist. Die gemeldete Latenz zählt dann ab dem geplanten Start und enthält so den Rückstand auf den Plan (Schedule Lag), dessen Mittelwert und Maximum getrennt erscheinen: genau die Korrektur, die unser Artikel zu &lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission&lt;/a&gt; beschreibt. Die Zahl der Clients bleibt fest; wächst der Rückstand immer weiter, schafft das System diese Rate mit den gewählten Clients und Threads nicht: Senken Sie &lt;code&gt;-R&lt;/code&gt; oder erhöhen Sie die Zahl der Clients.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--latency-limit&lt;/code&gt; (&lt;code&gt;-L&lt;/code&gt;) zählt Transaktionen, die länger als eine Grenze in Millisekunden dauern, als verspätet; mit &lt;code&gt;-R&lt;/code&gt; überspringt pgbench außerdem Transaktionen, die schon zu weit hinter dem Plan liegen, und meldet sie als übersprungen. &lt;code&gt;-M prepared&lt;/code&gt; nutzt Prepared Statements und läuft laut Dokumentation schneller als die anderen Modi (geprüft am 31. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie lesen Sie die Ausgabe von pgbench?&lt;/h2&gt;
&lt;p&gt;Die Zusammenfassung nennt die Einstellungen, verarbeitete und fehlgeschlagene Transaktionen, die mittlere Latenz, die anfängliche Verbindungszeit und tps. Die Form unten stammt aus der Dokumentation, ohne die Zahlen:&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;Fehlgeschlagene Transaktionen sind Serialisierungs- oder Deadlock-Fehler, die &lt;code&gt;--max-tries&lt;/code&gt; wiederholen kann. Andere SQL-Fehler brechen den betroffenen Client ab und führen zum Exit-Status 2. Perzentile enthält die Zusammenfassung nicht: Für die &lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz&lt;/a&gt; protokollieren Sie jede Transaktion mit &lt;code&gt;-l&lt;/code&gt;, das ihre Dauer in Mikrosekunden festhält, und berechnen p95 oder p99 selbst.&lt;/p&gt;
&lt;p&gt;Ohne &lt;code&gt;-P&lt;/code&gt;, &lt;code&gt;-R&lt;/code&gt; oder &lt;code&gt;-L&lt;/code&gt; wird die mittlere Latenz der Zusammenfassung nicht gemessen: pgbench leitet sie aus Laufzeit und Client-Zahl ab, also &lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law&lt;/a&gt; rückwärts gerechnet, Fehlschläge eingeschlossen. Setzen Sie &lt;code&gt;-P&lt;/code&gt;, wenn es auf die Latenz ankommt.&lt;/p&gt;
&lt;h2&gt;Wie bekommen Sie pgbench-Zahlen, denen Sie trauen können?&lt;/h2&gt;
&lt;p&gt;Lassen Sie jeden Lauf mehrere Minuten dauern, wiederholen Sie ihn, halten Sie den Skalierungsfaktor mindestens so groß wie die Zahl der Clients und behalten Sie VACUUM im Blick. Wird pgbench selbst zum Engpass, verlegen Sie es auf eine andere Maschine.&lt;/p&gt;
&lt;p&gt;Die erste Richtlinie im Abschnitt „Good Practices“ der Dokumentation warnt davor, einem Test zu glauben, der nur wenige Sekunden läuft, und ergänzt, dass reproduzierbare Zahlen Stunden brauchen können (geprüft am 31. Oktober 2026). Mit dem Standardskript misst ein Skalierungsfaktor unter der Client-Zahl vor allem Update-Konflikte, weil &lt;code&gt;pgbench_branches&lt;/code&gt; nur &lt;code&gt;-s&lt;/code&gt; Zeilen hat und jede Transaktion eine davon ändert. Tote Zeilen und Autovacuum verschieben die Ergebnisse zwischen den Läufen. Bei vielen Sitzungen kann pgbench seinen eigenen Host auslasten: Führen Sie es auf einer separaten Maschine mit niedriger Netzwerklatenz aus oder verteilen Sie mehrere Instanzen auf mehrere Maschinen.&lt;/p&gt;
&lt;h2&gt;Wann ist pgbench das falsche Tool?&lt;/h2&gt;
&lt;p&gt;Wenn es um Benutzer, eine andere Datenbank oder einen standardisierten OLTP-Mix geht. pgbench misst PostgreSQL allein, ohne Ihren Connection-Pool, Ihr ORM, Ihren Cache und Ihre HTTP-Schicht.&lt;/p&gt;
&lt;p&gt;Um zu sehen, was Benutzer erleben, setzen Sie die HTTP- oder API-Schicht davor unter Last. LoadFocus, der Herausgeber dieser Website, führt kein pgbench aus und kann sich nicht direkt mit PostgreSQL verbinden: LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=pgbench&quot;&gt;führt JMeter-Testpläne und k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen gegen Web- und API-Endpoints aus.&lt;/p&gt;
&lt;p&gt;Wählen Sie für MySQL &lt;strong&gt;sysbench&lt;/strong&gt;: Sein &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;Repository&lt;/a&gt; beschreibt ein skriptfähiges Benchmark-Tool mit mehreren Threads und OLTP-artigen Datenbanktests. Wählen Sie &lt;strong&gt;HammerDB&lt;/strong&gt; für einen Mix im Stil von TPC-C: Die &lt;a href=&quot;https://www.hammerdb.com/docs/ch03.html&quot;&gt;Dokumentation&lt;/a&gt; beschreibt TPROC-C, einen von TPC-C abgeleiteten Workload, den HammerDB auf &lt;a href=&quot;https://www.hammerdb.com/&quot;&gt;PostgreSQL und anderen Datenbanken&lt;/a&gt; ausführt. Wählen Sie &lt;strong&gt;JMeter&lt;/strong&gt; mit dem &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html&quot;&gt;Sampler &lt;code&gt;JDBC Request&lt;/code&gt;&lt;/a&gt;, um SQL und HTTP in einem Testplan auf Ihren eigenen Maschinen zu mischen (alles geprüft am 31. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Was bewirkt die Option -s in pgbench?&lt;/strong&gt;
Sie setzt bei der Initialisierung den Skalierungsfaktor. Jede Einheit fügt pgbench_accounts 100.000 Zeilen hinzu, -s 100 erzeugt also 10.000.000 Zeilen. Halten Sie den Wert beim Standardskript mindestens so groß wie Ihre Client-Zahl.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Was ist der Unterschied zwischen -c und -j in pgbench?&lt;/strong&gt;
Die Option -c legt die Zahl der simulierten Clients fest, jeder davon eine gleichzeitige Datenbanksitzung. Die Option -j legt fest, wie viele Worker-Threads in pgbench sich diese Clients teilen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus pgbench ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter-Testpläne und k6-Skripte aus und hat keine direkte Verbindung zu PostgreSQL, Sie setzen damit also die Web- oder API-Schicht vor der Datenbank unter Last.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission: was es ist und wie man es vermeidet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law im Lasttest: Tests dimensionieren und prüfen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/sysbench/&quot;&gt;sysbench nutzen: CPU-, Festplatten- und MySQL-Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/ycsb/&quot;&gt;YCSB: Workloads A-F, Ausführung und Grenzen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/redis-benchmark/&quot;&gt;redis-benchmark: richtig nutzen und die Zahlen lesen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tpc-h/&quot;&gt;TPC-H: was der Benchmark misst und wie Sie ihn ausführen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>redis-benchmark: richtig nutzen und die Zahlen lesen</title><link>https://loadtest.app/de/redis-benchmark/</link><guid isPermaLink="true">https://loadtest.app/de/redis-benchmark/</guid><description>redis-benchmark richtig nutzen: wichtige Optionen, Durchsatz und Latenz in der Ausgabe, was Pipelining und Clients ändern und warum Ihre App abweicht.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;redis-benchmark ist das Benchmark-Werkzeug, das mit Redis ausgeliefert wird: Es öffnet eine Anzahl von Client-Verbindungen (standardmäßig 50), sendet eine feste Zahl von Befehlen (standardmäßig 100.000) und meldet für jeden Test Anfragen pro Sekunde und Latenz. Starten Sie &lt;code&gt;redis-benchmark -q -n 100000&lt;/code&gt; gegen einen laufenden Server, grenzen Sie mit &lt;code&gt;-t&lt;/code&gt; auf die Befehle ein, die Sie interessieren, und lesen Sie das Ergebnis als Geschwindigkeit einer einzelnen Redis-Instanz unter synthetischen Befehlen. Ihre Anwendung bringt einen eigenen Netzwerkweg, eine eigene Client-Bibliothek und einen eigenen Befehlsmix mit; rechnen Sie also mit anderen Werten.&lt;/p&gt;
&lt;p&gt;Wir haben es am 31. Oktober 2026 auf einem Apple-M1-Max-Laptop ausgeführt, Redis 7.2.6 als Server und Client auf derselben Maschine über Loopback, ohne Persistenz. Jede Zeile ist ein Lauf mit 100.000 Anfragen, die Anfragen pro Sekunde auf Tausend gerundet; p50 steht so da, wie das Tool es ausgab.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lauf&lt;/th&gt;
&lt;th&gt;Was sich ändert&lt;/th&gt;
&lt;th&gt;Anfragen pro Sekunde&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;Nichts: 50 Clients, Werte mit 3 Byte&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 Befehle pro Roundtrip&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;Werte mit 1.024 Byte&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;Zufällige Schlüssel aus 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;Ein eigener Befehl&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;Wie führen Sie redis-benchmark aus?&lt;/h2&gt;
&lt;p&gt;Richten Sie das Tool mit &lt;code&gt;-h&lt;/code&gt; und &lt;code&gt;-p&lt;/code&gt; auf einen laufenden Server; ohne Optionen läuft die Standard-Testreihe gegen 127.0.0.1:6379. Mit &lt;code&gt;-t&lt;/code&gt; wählen Sie Tests aus, mit &lt;code&gt;-q&lt;/code&gt; erhalten Sie eine Zeile pro 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;Die offizielle &lt;a href=&quot;https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/benchmarks/&quot;&gt;Redis-Benchmark-Seite&lt;/a&gt; und die &lt;code&gt;--help&lt;/code&gt;-Ausgabe von Version 7.2.6 nennen unter anderem diese Optionen (geprüft am 31. Oktober 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt; parallele Verbindungen (Standard 50) und &lt;code&gt;-n&lt;/code&gt; Anfragen insgesamt (Standard 100.000).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; Größe der SET- und GET-Werte in Byte (Standard 3).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-P&lt;/code&gt; Befehle pro Pipeline (Standard 1, kein Pipelining).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt; eine kommagetrennte Liste von Tests; &lt;code&gt;-q&lt;/code&gt; knappe Ausgabe; &lt;code&gt;--csv&lt;/code&gt; CSV-Ausgabe.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-r&lt;/code&gt; zufällige Schlüssel aus einem Schlüsselraum dieser Größe. Ohne die Option nutzt jeder Befehl denselben Schlüssel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-k 1&lt;/code&gt; hält Verbindungen offen (Standard), &lt;code&gt;-k 0&lt;/code&gt; verbindet neu.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--threads&lt;/code&gt; schaltet den Multithread-Modus ein, &lt;code&gt;--cluster&lt;/code&gt; den Cluster-Modus, in dem &lt;code&gt;-c&lt;/code&gt; mindestens der Zahl der Knoten entsprechen muss.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wie lesen Sie die Ausgabe von redis-benchmark?&lt;/h2&gt;
&lt;p&gt;Mit &lt;code&gt;-q&lt;/code&gt; erhalten Sie pro Test eine Zeile: Anfragen pro Sekunde und die Median-Latenz. Ohne &lt;code&gt;-q&lt;/code&gt; gibt jeder Test seine Einstellungen aus, eine Latenzverteilung nach Perzentilen und eine Zusammenfassung mit Durchschnitt, Minimum, p50, p95, p99 und Maximum.&lt;/p&gt;
&lt;p&gt;Der Kopf zeigt außerdem die Server-Einstellungen &lt;code&gt;save&lt;/code&gt; und &lt;code&gt;appendonly&lt;/code&gt;, an denen Sie sehen, ob Persistenz Teil des Tests war. Unser vollständiger GET-Lauf ergab 119.617 Anfragen pro Sekunde, im Schnitt 0,352 ms, p95 0,559 ms, p99 0,623 ms und maximal 0,759 ms. Eine Anfrage, die Redis viele Male aufruft, trifft eher auf einen langsamen Aufruf, also lesen Sie auch p99; mehr dazu im Artikel über &lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--csv&lt;/code&gt; gibt die Zusammenfassung als eine Zeile pro Test aus. Wiederholen Sie Läufe, bevor Sie einem kleinen Unterschied trauen: Zwei Läufe desselben SET-Tests ergaben bei uns etwa 113.000 und 125.000 Anfragen pro Sekunde.&lt;/p&gt;
&lt;h2&gt;Warum verändert Pipelining die Zahlen so stark?&lt;/h2&gt;
&lt;p&gt;Ohne &lt;code&gt;-P&lt;/code&gt; wartet jeder Client auf eine Antwort, bevor er den nächsten Befehl sendet, sodass jeder Befehl einen vollen Roundtrip kostet. Mit &lt;code&gt;-P 16&lt;/code&gt; sendet jeder Client 16 auf einmal, und in unserem Lauf stieg SET von etwa 113.000 auf 1.010.000 Anfragen pro Sekunde, GET von 118.000 auf 1.190.000.&lt;/p&gt;
&lt;p&gt;Die offizielle Seite nennt Pipelining realistisch, weil viele Redis-Anwendungen es nutzen, und rät zu einer Pipeline-Größe nahe dem Durchschnitt, den Ihre Anwendung tatsächlich erreicht. Unsere Median-Latenz stieg dabei auf 0,711 und 0,583 ms.&lt;/p&gt;
&lt;h2&gt;Was passiert, wenn Sie mehr Clients hinzufügen?&lt;/h2&gt;
&lt;p&gt;Ist der Engpass ausgelastet, bringen mehr Clients nur mehr Wartezeit. Auf einem einzelnen Laptop kann das der Server oder der Benchmark-Client mit nur einem Thread sein.&lt;/p&gt;
&lt;p&gt;Von 50 auf 200 Clients blieb der Durchsatz fast gleich (etwa 117.000 SET- und 123.000 GET-Anfragen pro Sekunde), während sich die Median-Latenz ungefähr verdreifachte, auf 1,135 und 1,071 ms. Das ist &lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law&lt;/a&gt; in Aktion. Jeder Client hat höchstens einen Befehl unterwegs, also legt &lt;code&gt;-c&lt;/code&gt; fest, wie viele sich im System befinden, und wenn der Durchsatz nicht wachsen kann, muss die Zeit wachsen, die jeder dort verbringt. In unserem vollständigen GET-Lauf ergeben 50 Clients ÷ 119.617 Anfragen pro Sekunde 0,42 ms pro Client-Durchlauf, etwas mehr als der gemessene Durchschnitt von 0,352 ms. Mit 200 Clients ergibt dieselbe Rechnung 1,63 ms.&lt;/p&gt;
&lt;p&gt;Damit folgt das Tool auch einem geschlossenen Lastmodell: Wenn Redis hängt, warten die Clients, und die Befehle, die Ihre Anwendung in der Zwischenzeit gesendet hätte, tauchen nie auf. Weder die offizielle Seite noch &lt;code&gt;--help&lt;/code&gt; nennt eine Option für eine feste Anfragerate, lesen Sie die Perzentile also mit Blick auf &lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Wie benchmarken Sie einen eigenen Befehl oder ein Lua-Skript?&lt;/h2&gt;
&lt;p&gt;Schreiben Sie den Befehl hinter die Optionen. Das Tool führt dann nur diesen Befehl aus und ignoriert &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;Die erste Zeile ist das Beispiel der offiziellen Seite; auf unserem Laptop lief es mit etwa 106.000 Anfragen pro Sekunde. &lt;code&gt;SCRIPT LOAD&lt;/code&gt; lädt das Skript nur, also messen Sie mit &lt;code&gt;eval&lt;/code&gt; wie in der zweiten Zeile aus &lt;code&gt;--help&lt;/code&gt;, wie lange das Ausführen dauert. Mit &lt;code&gt;-r&lt;/code&gt; wird laut Hilfe &lt;code&gt;__rand_int__&lt;/code&gt; in einem Argument durch eine zufällige zwölfstellige Zahl aus diesem Bereich ersetzt, und im Cluster-Modus muss der Schlüssel ein &lt;code&gt;{tag}&lt;/code&gt; enthalten, damit der Befehl den richtigen Knoten erreicht.&lt;/p&gt;
&lt;h2&gt;Warum misst Ihre Anwendung andere Werte?&lt;/h2&gt;
&lt;p&gt;Ihre Anwendung misst ihren ganzen Weg zu Redis: Netzwerk, Client-Bibliothek, Serialisierung und ihren eigenen Befehlsmix. Die offizielle Seite nennt Fallstricke, die Sie vor einem Vergleich prüfen sollten.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eine Schleife synchroner Befehle misst vor allem das Netzwerk und die Client-Bibliothek.&lt;/li&gt;
&lt;li&gt;Laufen Client und Server auf einer Maschine, begrenzt die CPU den Benchmark. Unix Domain Sockets können auf manchen Plattformen, etwa Linux, rund 50 % mehr Durchsatz als TCP-Loopback erreichen.&lt;/li&gt;
&lt;li&gt;Strings mit 4 KB bei 100.000 Anfragen pro Sekunde brauchen etwa 3,2 Gbit/s, mehr als eine 1-Gbit/s-Leitung trägt.&lt;/li&gt;
&lt;li&gt;Für einen Vergleich mit einer transaktionalen Datenbank schalten Sie AOF ein und wählen eine passende fsync-Richtlinie.&lt;/li&gt;
&lt;li&gt;Laptops ändern ihre CPU-Frequenz, was die Wiederholbarkeit verschlechtert.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INFO&lt;/code&gt; in regelmäßigen Abständen ist während eines Laufs wohl unproblematisch, &lt;code&gt;MONITOR&lt;/code&gt; dagegen bremst Redis deutlich.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zeigen diese Laptop-Zahlen die echte Kapazität von Redis?&lt;/h2&gt;
&lt;p&gt;Nein. Sie zeigen einen Laptop, der mit sich selbst spricht, ohne Netzwerk, meist mit Werten von 3 Byte, ohne Persistenz und mit einem Lauf pro Zeile.&lt;/p&gt;
&lt;p&gt;Die Tabelle zeigt, wie jede Option die Werte verschiebt. Die Kapazität hängt von Ihrem Server, Ihrem Netzwerk, Ihren Wertgrößen und Ihren Persistenz-Einstellungen ab.&lt;/p&gt;
&lt;h2&gt;Wann ist redis-benchmark das falsche Werkzeug?&lt;/h2&gt;
&lt;p&gt;Wenn Sie wissen wollen, was Benutzer spüren. Es sendet synthetische Befehle nur an Redis, während die Antwortzeit einer Seite auch den Anwendungscode und dessen weitere Aufrufe enthält.&lt;/p&gt;
&lt;p&gt;Dafür belasten Sie die Anwendung oder API, die Redis nutzt, und beobachten Redis währenddessen. LoadFocus, der Herausgeber dieser Website, arbeitet auf dieser Ebene und &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=redis-benchmark&quot;&gt;führt JMeter-Testpläne und k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen gegen Ihre Web-App oder API aus. LoadFocus führt redis-benchmark nicht aus.&lt;/p&gt;
&lt;p&gt;Für mehr Kontrolle über den Redis-Traffic nennt das Repository von &lt;a href=&quot;https://github.com/redis/memtier_benchmark&quot;&gt;memtier_benchmark&lt;/a&gt; Multithread-Clients, ein Lese-Schreib-Verhältnis, zufällige oder sequenzielle Schlüsselmuster, Redis Cluster und TLS (geprüft am 31. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist redis-benchmark dafür gebaut, Redis schnell aussehen zu lassen?&lt;/strong&gt;
Nein. Die offizielle Redis-Seite nennt das ein verbreitetes Missverständnis: Standardmäßig hat das Tool höchstens eine offene Anfrage pro Verbindung, ohne Pipelining, und ein Client mit Pipelining kann mehr Durchsatz erzeugen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wie füllen Sie eine Redis-Datenbank mit redis-benchmark?&lt;/strong&gt;
Führen Sie nur den SET-Test mit zufälligen Schlüsseln aus, wie die Hilfe des Tools zeigt: &lt;code&gt;-t set -n 1000000 -r 100000000&lt;/code&gt; füllt etwa eine Million Schlüssel. Zufällige Schlüssel können sich wiederholen, daher liegt die Endzahl etwas darunter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus redis-benchmark ausführen?&lt;/strong&gt;
Nein. LoadFocus führt redis-benchmark nicht aus. Seine JMeter-Testpläne und k6-Skripte zielen auf die Web-App oder API vor Redis.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law im Lasttest: Tests dimensionieren und prüfen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission: was es ist und wie man es vermeidet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/http-benchmarking-tools/&quot;&gt;HTTP-Benchmark-Tools: wrk, hey, oha, ab und weitere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/pgbench/&quot;&gt;pgbench: PostgreSQL benchmarken und unter Last testen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/sysbench/&quot;&gt;sysbench nutzen: CPU-, Festplatten- und MySQL-Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/ycsb/&quot;&gt;YCSB: Workloads A-F, Ausführung und Grenzen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>sysbench nutzen: CPU-, Festplatten- und MySQL-Benchmarks</title><link>https://loadtest.app/de/sysbench/</link><guid isPermaLink="true">https://loadtest.app/de/sysbench/</guid><description>So funktioniert sysbench: CPU-, Speicher- und Datei-I/O-Tests, OLTP-Skripte für MySQL und PostgreSQL, wichtige Optionen, die Ausgabe und seine Grenzen.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;sysbench ist ein quelloffenes Multithread-Benchmark-Tool auf Basis von LuaJIT, das Tests für CPU, Arbeitsspeicher, Datei-I/O, Threads und Mutexe mitbringt, dazu OLTP-Skripte für MySQL und PostgreSQL. Tests mit Daten folgen demselben Ablauf: &lt;code&gt;prepare&lt;/code&gt; legt Testdateien oder Tabellen an, &lt;code&gt;run&lt;/code&gt; führt den Benchmark für eine feste Zeit oder Zahl von Events aus, und &lt;code&gt;cleanup&lt;/code&gt; entfernt die Daten wieder; die CPU- und Speichertests brauchen nur &lt;code&gt;run&lt;/code&gt;. Gemessen wird eine einzelne Maschine oder ein einzelner Datenbankserver; wie sich Ihre Anwendung unter echtem Benutzer-Traffic verhält, verrät sysbench daher nicht.&lt;/p&gt;
&lt;p&gt;Wir haben sysbench für diesen Leitfaden nicht selbst ausgeführt. Die Fakten stammen aus der README und dem Quellcode im Master-Branch auf GitHub, geprüft am 31. Oktober 2026; die Ratschläge sind unsere eigenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thema&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;Lizenz&lt;/td&gt;
&lt;td&gt;GPLv2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geschrieben in&lt;/td&gt;
&lt;td&gt;C, mit LuaJIT für Skripte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Letzte Version&lt;/td&gt;
&lt;td&gt;1.0.20 (24. April 2020)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Letzter Commit&lt;/td&gt;
&lt;td&gt;9. März 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eingebaute Tests&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;Datenbankskripte&lt;/td&gt;
&lt;td&gt;Acht &lt;code&gt;oltp_*&lt;/code&gt;-Skripte, &lt;code&gt;bulk_insert&lt;/code&gt;, zwei &lt;code&gt;select_random_*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datenbanktreiber&lt;/td&gt;
&lt;td&gt;MySQL (Standard), PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plattformen&lt;/td&gt;
&lt;td&gt;Linux, macOS; Windows über WSL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Wird sysbench noch gepflegt?&lt;/h2&gt;
&lt;p&gt;Nur noch wenig. Die letzte Version, 1.0.20, erschien im April 2020; der Master-Branch hat seitdem gelegentlich Commits erhalten, von denen keiner in einer Version erschienen ist, zuletzt im März 2025.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://github.com/akopytov/sysbench/releases/tag/1.0.20&quot;&gt;Version 1.0.20&lt;/a&gt; ist auf den 24. April 2020 datiert. Die &lt;a href=&quot;https://github.com/akopytov/sysbench/commits/master&quot;&gt;Commit-Historie&lt;/a&gt; zeigt Änderungen wie einen gleichverteilten Standard für &lt;code&gt;--rand-type&lt;/code&gt; (2020), ein Upstream-LuaJIT (2023) und Unterstützung für MariaDB-Client-Bibliotheken (2023), danach vier Build-Commits am 9. März 2025 (geprüft am 31. Oktober 2026). Die Paket-Repositorys aus der README werden bei jeder Version aktualisiert, für diese Änderungen brauchen Sie also einen Build aus dem Quellcode.&lt;/p&gt;
&lt;h2&gt;Wie läuft ein sysbench-Test ab?&lt;/h2&gt;
&lt;p&gt;Sie geben einen Test und einen Befehl an: &lt;code&gt;sysbench [options] [testname] [command]&lt;/code&gt;. Der Test ist ein eingebauter Test, ein mitgeliefertes Lua-Skript oder Ihr eigenes Skript, der Befehl meist &lt;code&gt;prepare&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;cleanup&lt;/code&gt; oder &lt;code&gt;help&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Laut &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;README&lt;/a&gt; legt &lt;code&gt;prepare&lt;/code&gt; die Dateien für &lt;code&gt;fileio&lt;/code&gt; an oder füllt die Datenbank für die OLTP-Skripte, &lt;code&gt;cleanup&lt;/code&gt; entfernt diese Daten, und &lt;code&gt;sysbench &amp;lt;testname&amp;gt; help&lt;/code&gt; listet die Optionen eines Tests auf. Ein Festplattentest:&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;Der &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/fileio/sb_fileio.c&quot;&gt;fileio-Quellcode&lt;/a&gt; nennt die Modi &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; und &lt;code&gt;rndrw&lt;/code&gt;, standardmäßig mit insgesamt 2 GB an Dateien. Dateien, die in den Arbeitsspeicher passen, kann der Page Cache bedienen; wählen Sie die Gesamtgröße also größer als den RAM, wenn Sie die Festplatte messen wollen.&lt;/p&gt;
&lt;h2&gt;Wie messen Sie CPU und Arbeitsspeicher mit sysbench?&lt;/h2&gt;
&lt;p&gt;Mit &lt;code&gt;sysbench cpu run&lt;/code&gt; und &lt;code&gt;sysbench memory run&lt;/code&gt;. Der CPU-Test meldet Events pro Sekunde, wobei ein Event jede Zahl bis zu einer Grenze auf Primzahleigenschaft prüft; der Speichertest meldet Operationen und übertragene MiB pro Sekunde.&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;Der &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/cpu/sb_cpu.c&quot;&gt;CPU-Test&lt;/a&gt; setzt &lt;code&gt;--cpu-max-prime&lt;/code&gt; standardmäßig auf 10000, und der &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/memory/sb_memory.c&quot;&gt;Speichertest&lt;/a&gt; nimmt eine Blockgröße, eine Gesamtgröße, Lese- oder Schreiboperationen und sequenziellen oder zufälligen Zugriff entgegen (geprüft am 31. Oktober 2026). Vergleichen Sie nur Läufe mit identischen Einstellungen.&lt;/p&gt;
&lt;h2&gt;Wie testen Sie MySQL oder PostgreSQL mit sysbench?&lt;/h2&gt;
&lt;p&gt;Wählen Sie ein mitgeliefertes OLTP-Skript, füllen Sie die Tabellen mit &lt;code&gt;prepare&lt;/code&gt;, führen Sie mit &lt;code&gt;run&lt;/code&gt; Transaktionen aus mehreren Threads aus und löschen Sie die Tabellen danach mit &lt;code&gt;cleanup&lt;/code&gt;. MySQL ist der Standardtreiber; PostgreSQL braucht &lt;code&gt;--db-driver=pgsql&lt;/code&gt; und einen Build mit PostgreSQL-Unterstützung.&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;Das &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/lua/oltp_common.lua&quot;&gt;gemeinsame OLTP-Skript&lt;/a&gt; legt eine Tabelle mit 10.000 Zeilen an, sofern Sie nicht &lt;code&gt;--tables&lt;/code&gt; und &lt;code&gt;--table-size&lt;/code&gt; angeben. In &lt;code&gt;oltp_read_write&lt;/code&gt; führt jede Transaktion 10 Punktabfragen, vier Bereichsabfragen, zwei Updates und ein Delete mit anschließendem Insert zwischen &lt;code&gt;BEGIN&lt;/code&gt; und &lt;code&gt;COMMIT&lt;/code&gt; aus (geprüft am 31. Oktober 2026). Machen Sie die Daten größer als den Buffer Pool des Servers, wenn das Ergebnis Lesezugriffe auf die Festplatte enthalten soll.&lt;/p&gt;
&lt;h2&gt;Welche sysbench-Optionen sind am wichtigsten?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;--threads&lt;/code&gt; und &lt;code&gt;--time&lt;/code&gt; bestimmen Größe und Dauer eines Laufs, &lt;code&gt;--rate&lt;/code&gt; setzt eine Ziel-Eventrate, und &lt;code&gt;--report-interval&lt;/code&gt;, &lt;code&gt;--percentile&lt;/code&gt; und &lt;code&gt;--histogram&lt;/code&gt; entscheiden, was Sie zu sehen bekommen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--threads&lt;/code&gt;: Worker-Threads, standardmäßig 1.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--time&lt;/code&gt;: Sekunden, standardmäßig 10, 0 für keine Grenze. &lt;code&gt;--events&lt;/code&gt; begrenzt die Zahl der Events, und beide Grenzen gelten, kombinieren Sie es also mit &lt;code&gt;--time=0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--warmup-time&lt;/code&gt;: läuft zuerst ohne Statistik, damit kalte Caches das Ergebnis nicht verzerren. Nur im Master-Branch: Version 1.0.20 kennt die Option nicht.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rate&lt;/code&gt;: durchschnittliche Events pro Sekunde über alle Threads; 0, der Standard, heißt so schnell wie möglich.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--report-interval&lt;/code&gt;: Werte pro Intervall alle N Sekunden, um Hänger sichtbar zu machen.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--percentile&lt;/code&gt;: das gemeldete Latenz-Perzentil, standardmäßig 95.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--histogram&lt;/code&gt;: ein Latenz-Histogramm am Ende, definiert in &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;Nutzt sysbench ein geschlossenes oder ein offenes Lastmodell?&lt;/h2&gt;
&lt;p&gt;Standardmäßig ein geschlossenes: Eine feste Zahl von Threads startet jeweils das nächste Event, sobald das vorige endet, ein langsamer Server bekommt also weniger Events. Mit &lt;code&gt;--rate&lt;/code&gt; kommen die Events nach eigenem Zeitplan an, was einem offenen Lastmodell näherkommt.&lt;/p&gt;
&lt;p&gt;Unser Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; erklärt, warum das verändert, was ein Benchmark misst. Im Standardmodus verzögert ein Hänger außerdem die Events, die währenddessen gestartet wären, und diese Verzögerungen tauchen in den Latenzwerten nie auf: &lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission&lt;/a&gt;. Die &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/sysbench.c&quot;&gt;Hauptquelldatei&lt;/a&gt; zeigt, dass &lt;code&gt;--rate&lt;/code&gt; Events in exponentialverteilten Abständen in eine Warteschlange stellt, die Wartezeit jedes Events zu seiner Latenz addiert und mit dem Fehler &amp;quot;event queue is full&amp;quot; abbricht, wenn die Threads nicht mithalten (geprüft am 31. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie lesen Sie die Ausgabe von sysbench?&lt;/h2&gt;
&lt;p&gt;Beginnen Sie mit dem Durchsatz: Events pro Sekunde, bei den OLTP-Skripten Transaktionen und Abfragen pro Sekunde. Lesen Sie dann den Latenzblock in Millisekunden: Minimum, Durchschnitt, Maximum, das gewählte Perzentil (standardmäßig p95) und die Summe.&lt;/p&gt;
&lt;p&gt;Version 1.0.20 gibt statt „Throughput“ einen Block „General statistics“ mit der Gesamtzeit und der Gesamtzahl der Events aus. Die Feldnamen stammen aus dem &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/db_driver.c&quot;&gt;Code für den Datenbankbericht&lt;/a&gt; und der Hauptquelldatei im Master-Branch, hier ohne Werte:&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;Ein 95. Perzentil blendet das langsamste von je zwanzig Events aus. Setzen Sie &lt;code&gt;--percentile=99&lt;/code&gt; oder ergänzen Sie &lt;code&gt;--histogram&lt;/code&gt;, wenn es auf die Ausreißer ankommt; unser Leitfaden zur &lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz&lt;/a&gt; erklärt, warum.&lt;/p&gt;
&lt;h2&gt;Wann ist sysbench das falsche Tool?&lt;/h2&gt;
&lt;p&gt;Wenn sich Ihre Frage um Ihre Anwendung dreht. Ein CPU-Wert zeigt, wie schnell eine Maschine Primzahlen prüft, und ein OLTP-Lauf misst den Datenbankserver mit den Tabellen und Abfragen von sysbench, ohne Ihr Schema, Ihren Connection Pool oder den Netzwerkweg.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wählen Sie &lt;strong&gt;pgbench&lt;/strong&gt; für Tests, die ganz bei PostgreSQL bleiben: Die &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;PostgreSQL-Dokumentation&lt;/a&gt; beschreibt ein Standardszenario, das lose auf TPC-B basiert, dazu eigene Skriptdateien (geprüft am 31. Oktober 2026).&lt;/li&gt;
&lt;li&gt;Wählen Sie &lt;strong&gt;HammerDB&lt;/strong&gt; für Tests im Stil von TPC-C: Die &lt;a href=&quot;https://www.hammerdb.com/document.html&quot;&gt;Dokumentation&lt;/a&gt; behandelt den von TPC-C abgeleiteten Workload TPROC-C für SQL Server, Db2, Oracle, PostgreSQL, MariaDB und MySQL (geprüft am 31. Oktober 2026).&lt;/li&gt;
&lt;li&gt;Wählen Sie &lt;strong&gt;JMeter&lt;/strong&gt; mit seinem Sampler &lt;code&gt;JDBC Request&lt;/code&gt;, um SQL und HTTP in einem Testplan zu mischen; laut &lt;a href=&quot;https://jmeter.apache.org/usermanual/build-db-test-plan.html&quot;&gt;Anleitung für Datenbank-Testpläne&lt;/a&gt; gehört die &lt;code&gt;.jar&lt;/code&gt;-Datei des Treibers in den &lt;code&gt;lib&lt;/code&gt;-Ordner von JMeter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, führt kein sysbench aus und kann sich selbst nicht mit MySQL oder PostgreSQL verbinden. LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=sysbench&quot;&gt;führt JMeter-Testpläne&lt;/a&gt; und k6-Skripte aus 25 Cloud-Regionen gegen die Web- oder API-Schicht vor der Datenbank aus. Sinnvoll kombiniert: erst ein sysbench-Lauf, um den Datenbankserver zu dimensionieren, dann ein &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=sysbench&quot;&gt;Lasttest der Anwendung&lt;/a&gt;, um zu sehen, ob echte Anfragen diese Grenze erreichen.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Wird sysbench noch gepflegt?&lt;/strong&gt;
Nur wenig. Die letzte Version ist 1.0.20 vom 24. April 2020. Der Master-Branch hat seitdem gelegentlich Commits erhalten, keiner davon in einer Version, zuletzt am 9. März 2025.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Was bedeutet das 95. Perzentil in der Ausgabe von sysbench?&lt;/strong&gt;
Es ist die Latenz in Millisekunden, innerhalb derer 95 % der Events fertig wurden. 95 ist der Standardwert der Option &lt;code&gt;--percentile&lt;/code&gt;, und Sie können einen anderen Wert wie 99 setzen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann sysbench PostgreSQL testen?&lt;/strong&gt;
Ja. Die mitgelieferten OLTP-Skripte laufen mit &lt;code&gt;--db-driver=pgsql&lt;/code&gt; gegen PostgreSQL, wenn sysbench mit PostgreSQL-Unterstützung gebaut wurde.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus sysbench ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter-Testpläne und k6-Skripte gegen Websites und APIs aus 25 Cloud-Regionen aus und verbindet sich nicht direkt mit MySQL oder PostgreSQL.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission: was es ist und wie man es vermeidet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/http-benchmarking-tools/&quot;&gt;HTTP-Benchmark-Tools: wrk, hey, oha, ab und weitere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/pgbench/&quot;&gt;pgbench: PostgreSQL benchmarken und unter Last testen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/ycsb/&quot;&gt;YCSB: Workloads A-F, Ausführung und Grenzen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/redis-benchmark/&quot;&gt;redis-benchmark: richtig nutzen und die Zahlen lesen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tpc-h/&quot;&gt;TPC-H: was der Benchmark misst und wie Sie ihn ausführen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>YCSB: Workloads A-F, Ausführung und Grenzen</title><link>https://loadtest.app/de/ycsb/</link><guid isPermaLink="true">https://loadtest.app/de/ycsb/</guid><description>YCSB erklärt: was der Yahoo! Cloud Serving Benchmark misst, die Workloads A bis F, Lade- und Laufphase, das Lesen der Ausgabe und seine Grenzen.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;YCSB, der Yahoo! Cloud Serving Benchmark, ist ein Open-Source-Tool in Java, das synthetische Datensätze in einen Datenspeicher lädt und darauf dann eine feste Mischung aus Lese-, Update-, Insert- und Scan-Operationen ausführt, während es Durchsatz und Latenz pro Operation aufzeichnet. Seine sechs Core Workloads, A bis F, sind standardisierte Mischungen, sodass derselbe Test über Bindings gegen Cassandra, MongoDB, Redis, HBase und Dutzende weitere Datenbanken laufen kann. Es misst nur den Datenspeicher selbst und sagt daher nichts über die echten Abfragen Ihrer Anwendung oder über die Latenz, die Ihre Benutzer sehen.&lt;/p&gt;
&lt;p&gt;Wir haben YCSB für diesen Artikel nicht selbst ausgeführt. Die Fakten stammen aus dem GitHub-Repository, dem Wiki und dem Quellcode, geprüft am 31. Oktober 2026; die Einschätzungen sind unsere eigenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Operationsmix&lt;/th&gt;
&lt;th&gt;Schlüsselverteilung&lt;/th&gt;
&lt;th&gt;Beispiel aus dem Wiki&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A: updatelastig&lt;/td&gt;
&lt;td&gt;50 % Lesen, 50 % Update&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Sitzungsspeicher, der letzte Aktionen festhält&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B: überwiegend Lesen&lt;/td&gt;
&lt;td&gt;95 % Lesen, 5 % Update&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Fotos taggen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C: nur Lesen&lt;/td&gt;
&lt;td&gt;100 % Lesen&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Cache für Benutzerprofile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D: neueste lesen&lt;/td&gt;
&lt;td&gt;95 % Lesen, 5 % Insert&lt;/td&gt;
&lt;td&gt;latest&lt;/td&gt;
&lt;td&gt;Statusmeldungen von Benutzern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E: kurze Bereiche&lt;/td&gt;
&lt;td&gt;95 % Scan, 5 % Insert&lt;/td&gt;
&lt;td&gt;zipfian (Scans über bis zu 100 Datensätze)&lt;/td&gt;
&lt;td&gt;Diskussionsverläufe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F: Read-Modify-Write&lt;/td&gt;
&lt;td&gt;50 % Lesen, 50 % Read-Modify-Write&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Benutzerdatenbank&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Die Mischungen stammen aus den Dateien im &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/tree/master/workloads&quot;&gt;Verzeichnis workloads&lt;/a&gt;, die Beispiele von der &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads&quot;&gt;Seite Core Workloads&lt;/a&gt; (geprüft am 31. Oktober 2026). Jede Datei bringt nur 1.000 Datensätze und 1.000 Operationen mit: genug, um ein Setup zu debuggen, und viel zu wenig für einen Benchmark.&lt;/p&gt;
&lt;h2&gt;Was ist YCSB, und wird es noch gepflegt?&lt;/h2&gt;
&lt;p&gt;Es ist ein Workload-Generator mit einer Reihe standardisierter Workloads, um Key-Value- und &amp;quot;Cloud Serving&amp;quot;-Datenbanken zu vergleichen, 2010 von Yahoo! unter der Apache-2.0-Lizenz als Open Source veröffentlicht. Die letzte Version stammt vom Oktober 2019, der Code erhält aber weiterhin kleine Commits.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Papers-and-Presentations&quot;&gt;Seite mit Papers&lt;/a&gt; nennt das ursprüngliche Paper, &amp;quot;Benchmarking Cloud Serving Systems with YCSB&amp;quot; von Cooper, Silberstein, Tam, Ramakrishnan und Sears (ACM SoCC 2010). Das &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/releases/tag/0.17.0&quot;&gt;Release 0.17.0&lt;/a&gt; ist auf den 6. Oktober 2019 datiert, und es gibt keinen neueren Tag; die &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/commits/master&quot;&gt;Commit-Historie&lt;/a&gt; zeigt dagegen Arbeit aus 2026, etwa eine Option, nach einem fehlgeschlagenen Insert weiterzulaufen, und eine Änderung am Cloud-Spanner-Binding vom 20. Oktober (geprüft am 31. Oktober 2026). Diese Änderungen gibt es nur in einem eigenen Build aus dem Quellcode, und der braucht Maven 3.&lt;/p&gt;
&lt;h2&gt;Wie führen Sie einen YCSB-Benchmark aus?&lt;/h2&gt;
&lt;p&gt;In zwei Phasen mit denselben Properties: &lt;code&gt;load&lt;/code&gt; fügt &lt;code&gt;recordcount&lt;/code&gt; Datensätze ein, danach führt &lt;code&gt;run&lt;/code&gt; &lt;code&gt;operationcount&lt;/code&gt; Operationen aus dem Mix des Workloads aus. Sie nennen das Binding für Ihre Datenbank und übergeben die Workload-Datei mit &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;Die &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload&quot;&gt;Seite Running a Workload&lt;/a&gt; erklärt die Details, über die viele stolpern (geprüft am 31. Oktober 2026). Der Client legt keine Tabellen an, Sie bilden &lt;code&gt;usertable&lt;/code&gt; also vorher auf das ab, was Ihr Datenspeicher braucht, etwa eine Tabelle in MySQL oder einen Keyspace in Cassandra. Spätere &lt;code&gt;-P&lt;/code&gt;-Dateien überschreiben frühere, und &lt;code&gt;-p&lt;/code&gt; überschreibt alle. Die Laufphase braucht denselben &lt;code&gt;recordcount&lt;/code&gt; wie die Ladephase, weil sie die Schlüssel aus dem gesamten Datenbestand wählt. &lt;code&gt;-s&lt;/code&gt; gibt alle 10 Sekunden eine Statuszeile aus. Weil D und E Datensätze einfügen, empfiehlt die Seite Core Workloads, einmal mit der Datei von Workload A zu laden, A, B, C, F und D auszuführen, dann die Daten zu löschen und für E neu zu laden.&lt;/p&gt;
&lt;h2&gt;Was steuern -threads und -target?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;-threads&lt;/code&gt; legt fest, wie viele Client-Threads Operationen senden (standardmäßig einer), und &lt;code&gt;-target&lt;/code&gt; begrenzt die Operationen pro Sekunde insgesamt. Ohne Target sendet jeder Thread seine nächste Operation, sobald die vorige zurückkommt, eine langsamere Datenbank bekommt also einfach weniger Last.&lt;/p&gt;
&lt;p&gt;Das ist ein geschlossenes Lastmodell, und unser Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; erklärt, was dieses Modell verdeckt. Das Wiki-Beispiel mit 10 Threads und einem Target von 100 Operationen pro Sekunde geht nur auf, solange die mittlere Latenz unter 100 ms bleibt; mit zu wenigen Threads bleibt die erreichte Rate unter dem Target. Hier wirkt &lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law&lt;/a&gt;: Threads geteilt durch die mittlere Latenz begrenzen den Durchsatz. Wenn Sie mehrere Targets fahren und jeweils die Latenz notieren, erhalten Sie die Kurve aus unserem Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Wie lesen Sie die Ausgabe von YCSB?&lt;/h2&gt;
&lt;p&gt;Am Ende jeder Phase gibt der Client einen &lt;code&gt;[OVERALL]&lt;/code&gt;-Block mit Laufzeit und Durchsatz aus, dann einen Block pro Operationstyp mit Anzahl, mittlerer, minimaler und maximaler Latenz, Perzentilen und einer Zählung pro Rückgabecode.&lt;/p&gt;
&lt;p&gt;Diese Feldnamen stammen aus dem Quellcode von 0.17.0; die Werte sind Platzhalter:&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;Die Beispielausgabe im Wiki zeigt Millisekunden, die standardmäßige HdrHistogram-Messung meldet aber sowohl in 0.17.0 als auch im aktuellen Quellcode Mikrosekunden, &lt;code&gt;(us)&lt;/code&gt;. Die &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Core-Properties&quot;&gt;Seite Core Properties&lt;/a&gt; und Version 0.17.0 setzen die Standard-Perzentile auf 95 und 99, änderbar mit &lt;code&gt;hdrhistogram.percentiles&lt;/code&gt;; seit April 2025 ergänzt der Master-Branch 50, ein Build aus dem Quellcode gibt also auch &lt;code&gt;50thPercentileLatency(us)&lt;/code&gt; aus (geprüft am 31. Oktober 2026). Die &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB&quot;&gt;README&lt;/a&gt; lenkt den Blick auf P99 und darüber hinaus, warnt, dass sich Perzentile nicht mitteln lassen, und rät, bei mehreren Clients HDR-Histogramm-Dateien mit &lt;code&gt;hdrhistogram.fileoutput=true&lt;/code&gt; zu speichern und zusammenzuführen.&lt;/p&gt;
&lt;h2&gt;Berücksichtigt YCSB Coordinated Omission?&lt;/h2&gt;
&lt;p&gt;Nur wenn Sie es verlangen, und nur mit gesetztem &lt;code&gt;-target&lt;/code&gt;. Standardmäßig wird jede Latenz ab dem Moment gemessen, in dem die Operation tatsächlich gesendet wurde, sodass ein Stillstand, der die nachfolgenden Operationen verzögert, kaum sichtbar wird.&lt;/p&gt;
&lt;p&gt;Der &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/blob/master/core/src/main/java/site/ycsb/measurements/Measurements.java&quot;&gt;Mess-Quellcode&lt;/a&gt; kennt eine Property &lt;code&gt;measurement.interval&lt;/code&gt; mit den Werten &lt;code&gt;op&lt;/code&gt; (Standard), &lt;code&gt;intended&lt;/code&gt; oder &lt;code&gt;both&lt;/code&gt; (geprüft am 31. Oktober 2026). Mit Target merkt sich jeder Thread den geplanten Start jeder Operation; &lt;code&gt;intended&lt;/code&gt; misst die Latenz ab diesem Zeitpunkt, und &lt;code&gt;both&lt;/code&gt; fügt neben den üblichen Blöcken &lt;code&gt;Intended-&lt;/code&gt;-Blöcke wie &lt;code&gt;[Intended-READ]&lt;/code&gt; hinzu. Im Wiki fehlt die Property, prüfen Sie also den Quellcode der Version, die Sie bauen. Unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission&lt;/a&gt; erklärt, warum der geplante Start die ehrliche Zahl liefert.&lt;/p&gt;
&lt;h2&gt;Welche Datenbanken kann YCSB testen?&lt;/h2&gt;
&lt;p&gt;Jede, für die es ein Binding gibt. Die Build-Datei im Master-Branch listet 46 Binding-Module, darunter Cassandra, MongoDB, Redis, HBase, DynamoDB, Cloud Spanner, RocksDB und ein generisches JDBC-Binding.&lt;/p&gt;
&lt;p&gt;Die Liste steht in der &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/blob/master/pom.xml&quot;&gt;pom.xml&lt;/a&gt;, und jedes Binding-Verzeichnis hat eine eigene README mit den Verbindungs-Properties, etwa &lt;code&gt;mongodb.url&lt;/code&gt; für das &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/tree/master/mongodb&quot;&gt;MongoDB-Binding&lt;/a&gt; (geprüft am 31. Oktober 2026). Laut der Seite Running a Workload reicht ein Client-Rechner für Cluster mit etwa 10 Maschinen; darüber starten Sie mehrere Clients, und die Seite &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; teilt die Last mit &lt;code&gt;insertstart&lt;/code&gt; und &lt;code&gt;insertcount&lt;/code&gt; zwischen ihnen auf.&lt;/p&gt;
&lt;h2&gt;Wann ist YCSB das falsche Tool?&lt;/h2&gt;
&lt;p&gt;Wenn Ihre Frage Ihre Anwendung betrifft. Der Core Workload schreibt synthetische Datensätze, standardmäßig 10 Felder mit je einer Länge von 100, über einfache Schlüsseloperationen und kann daher nicht zeigen, wie sich Ihre eigenen Abfragen, Indizes oder Ihr API-Code unter Last verhalten.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Für relationales OLTP führt &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;pgbench&lt;/a&gt; ein an TPC-B angelehntes Skript gegen PostgreSQL aus und nimmt auch eigene Skripte an, und &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;sysbench&lt;/a&gt; bringt OLTP-artige Lua-Benchmarks mit (beide geprüft am 31. Oktober 2026).&lt;/li&gt;
&lt;li&gt;Für die Latenz, die Benutzer sehen, setzen Sie die HTTP- oder API-Schicht vor dem Datenspeicher unter Last. LoadFocus, der Herausgeber dieser Website, &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=ycsb&quot;&gt;führt JMeter-Testpläne und k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen gegen Web- und API-Endpoints aus. LoadFocus führt kein YCSB aus.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Was sind die Core Workloads von YCSB?&lt;/strong&gt;
Sechs standardisierte Mischungen: A besteht zu 50 % aus Lese- und zu 50 % aus Update-Operationen, B zu 95 % aus Lesen, C nur aus Lesen, D bevorzugt die zuletzt eingefügten Datensätze, E führt kurze Scans aus, und F macht Read-Modify-Write.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Was ist der Unterschied zwischen ycsb load und ycsb run?&lt;/strong&gt;
Die Ladephase fügt so viele Datensätze ein, wie &lt;code&gt;recordcount&lt;/code&gt; angibt. Die Laufphase führt dann &lt;code&gt;operationcount&lt;/code&gt; Operationen aus dem Mix des Workloads auf diesen Datensätzen aus und meldet Durchsatz und Latenz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wird YCSB noch gepflegt?&lt;/strong&gt;
Die letzte Version, 0.17.0, erschien am 6. Oktober 2019. Das Repository erhält weiterhin gelegentlich Commits, zuletzt am 20. Oktober 2026, neuere Korrekturen erfordern also einen Build aus dem Quellcode.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus YCSB-Benchmarks ausführen?&lt;/strong&gt;
Nein. LoadFocus führt kein YCSB aus. Seine JMeter-Testpläne und k6-Skripte zielen auf Web- und API-Endpoints, also auf die Schicht vor dem Datenspeicher.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission: was es ist und wie man es vermeidet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law im Lasttest: Tests dimensionieren und prüfen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/pgbench/&quot;&gt;pgbench: PostgreSQL benchmarken und unter Last testen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/sysbench/&quot;&gt;sysbench nutzen: CPU-, Festplatten- und MySQL-Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/redis-benchmark/&quot;&gt;redis-benchmark: richtig nutzen und die Zahlen lesen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tpc-h/&quot;&gt;TPC-H: was der Benchmark misst und wie Sie ihn ausführen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>NBomber-Lasttests: das .NET-Framework im Überblick</title><link>https://loadtest.app/de/nbomber-load-testing/</link><guid isPermaLink="true">https://loadtest.app/de/nbomber-load-testing/</guid><description>Lasttests mit NBomber im Überblick: C#- und F#-Szenarien, Inject- und Constant-Simulationen, Schwellenwerte, HTTP-Plugin, Cluster und Firmenlizenz.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;NBomber ist ein Lasttest-Framework für .NET: Sie schreiben jeden Test als C#- oder F#-Szenario, fügen ihn einem gewöhnlichen Projekt hinzu und starten ihn wie jedes andere Programm. Ein NBomber-Lasttest passt zu Teams, die ohnehin in .NET entwickeln und ihre Lasttests in derselben Sprache, im selben Repository und mit demselben Test-Runner haben wollen. Kostenlos ist NBomber nur für private und akademische Nutzung; ein Unternehmen braucht eine bezahlte Lizenz, und diese eine Tatsache gibt bei mehr Evaluierungen den Ausschlag als jede Funktion.&lt;/p&gt;
&lt;p&gt;Wir haben NBomber für dieses Review nicht selbst ausgeführt. Die Fakten stammen aus der Dokumentation, der Preisseite, dem GitHub-Repository und dem NuGet-Paket von NBomber, geprüft am 21. Oktober 2026; die Einschätzungen sind unsere eigenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thema&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;Lizenz&lt;/td&gt;
&lt;td&gt;Kostenlos für private und akademische Nutzung; kostenpflichtig für Organisationen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preis für ein Unternehmen&lt;/td&gt;
&lt;td&gt;Business 1.500 $ pro Jahr, Enterprise 2.500 $ pro Jahr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aktuelle Version&lt;/td&gt;
&lt;td&gt;6.7.1 (16. Oktober 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laufzeit&lt;/td&gt;
&lt;td&gt;.NET Standard 2.1, also .NET Core 3.0 oder neuer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests geschrieben als&lt;/td&gt;
&lt;td&gt;C#- oder F#-Szenarien&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lastmodell&lt;/td&gt;
&lt;td&gt;Inject (Ankunftsrate) oder konstante Kopien&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass/Fail-Prüfungen&lt;/td&gt;
&lt;td&gt;Schwellenwerte während des Laufs, Asserts auf die Endstatistik&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skalierung&lt;/td&gt;
&lt;td&gt;NBomber Cluster, Enterprise-Lizenz&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Wer entwickelt NBomber, und ist es kostenlos?&lt;/h2&gt;
&lt;p&gt;NBomber LLC entwickelt es, der Quellcode liegt auf GitHub. Kostenlos ist es für private, Hobby- und akademische Nutzung, und die Lizenzseite sagt klar, dass NBomber für Organisationen nicht kostenlos ist.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://nbomber.com/docs/getting-started/license/&quot;&gt;Lizenzseite&lt;/a&gt; zählt Benchmarks, Tutorials und Review-Inhalte zur privaten Nutzung. Im Unternehmen brauchen Sie eine Business- oder Enterprise-Lizenz, die pro Organisation vergeben wird statt pro Entwicklerplatz und keine Grenze für Instanzen oder parallele Läufe hat. Die &lt;a href=&quot;https://nbomber.com/pricing&quot;&gt;Preisseite&lt;/a&gt; nennt für Business 1.500 $ pro Jahr und für Enterprise 2.500 $ pro Jahr, beide mit 30 Tagen Geld-zurück-Garantie. Der Lizenzschlüssel geht mit &lt;code&gt;.WithLicense(...)&lt;/code&gt; oder einem Argument &lt;code&gt;--license&lt;/code&gt; an den Runner, und NBomber braucht Internetzugang, um ihn zu prüfen; eine Offline-Prüfung gibt es auf Anfrage per E-Mail (geprüft am 21. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Die aktuelle Version ist &lt;a href=&quot;https://github.com/PragmaticFlow/NBomber/releases/tag/v6.7.1&quot;&gt;v6.7.1&lt;/a&gt;, veröffentlicht am 16. Oktober 2026, vier Tage nach 6.7.0 (geprüft am 21. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie funktioniert ein NBomber-Szenario?&lt;/h2&gt;
&lt;p&gt;Ein Szenario ist ein Name plus eine asynchrone Funktion, deren Ausführung NBomber bei jedem Aufruf misst. Sie hängen Lastsimulationen und Schwellenwerte daran, registrieren es beim &lt;code&gt;NBomberRunner&lt;/code&gt; und starten das Programm.&lt;/p&gt;
&lt;p&gt;Dieser Test überspringt das Warm-up, steigert die Ankunftsrate über zwei Minuten auf 50 neue Szenario-Kopien pro Sekunde, hält sie zehn Minuten und endet mit Exit-Code 1, wenn 1 % oder mehr der Anfragen gescheitert sind. Für die Anfrage nutzt er das Plugin &lt;code&gt;NBomber.Http&lt;/code&gt;:&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;Die &lt;a href=&quot;https://nbomber.com/docs/protocols/http/http-client/&quot;&gt;Seite zum HTTP-Client&lt;/a&gt; empfiehlt &lt;code&gt;Http.CreateDefaultClient()&lt;/code&gt; statt eines einfachen &lt;code&gt;new HttpClient()&lt;/code&gt; und sagt, dass das Plugin Statuscodes und übertragene Daten erfasst (geprüft am 21. Oktober 2026). Ein Schwellenwert allein vermerkt den Fehlschlag nur im Bericht; erst die letzte Zeile macht daraus einen Exit-Code, den eine Pipeline auswerten kann. Ohne &lt;code&gt;.WithoutWarmUp()&lt;/code&gt; führt NBomber zuerst ein 30-sekündiges Warm-up mit den Simulationen des Szenarios aus, so die &lt;a href=&quot;https://nbomber.com/docs/nbomber/scenario/&quot;&gt;Seite zu Szenarien&lt;/a&gt; (geprüft am 21. Oktober 2026). Weil das Szenario gewöhnliches C# ist, lässt sich alles, was eine .NET-Bibliothek aufrufen kann, auf dieselbe Weise unter Last setzen.&lt;/p&gt;
&lt;h2&gt;Welche Lastmodelle bietet NBomber?&lt;/h2&gt;
&lt;p&gt;Beide Arten. Die Inject-Simulationen starten neue Kopien mit fester Rate, egal was frühere Kopien gerade tun, also ein offenes Lastmodell; die Constant-Simulationen halten eine feste Zahl von Kopien am Laufen, also ein geschlossenes.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://nbomber.com/docs/nbomber/load-simulation/&quot;&gt;Seite zur Lastsimulation&lt;/a&gt; führt sie auf (geprüft am 21. Oktober 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Offen:&lt;/strong&gt; &lt;code&gt;Inject&lt;/code&gt;, &lt;code&gt;RampingInject&lt;/code&gt;, &lt;code&gt;InjectRandom&lt;/code&gt; und &lt;code&gt;IterationsForInject&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geschlossen:&lt;/strong&gt; &lt;code&gt;KeepConstant&lt;/code&gt;, &lt;code&gt;RampingConstant&lt;/code&gt; und &lt;code&gt;IterationsForConstant&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zeitsteuerung:&lt;/strong&gt; &lt;code&gt;Pause&lt;/code&gt;, das den Start eines Szenarios verzögert oder es für eine feste Zeit pausiert.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unser Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; erklärt, welches zu Ihrem Traffic passt. Eine öffentliche Website verhält sich meist wie das offene Modell, ein fester Pool interner Clients eher wie das geschlossene.&lt;/p&gt;
&lt;h2&gt;Wie funktionieren Schwellenwerte und Pass/Fail-Prüfungen?&lt;/h2&gt;
&lt;p&gt;Schwellenwerte zur Laufzeit prüfen die laufende Statistik, standardmäßig alle 5 Sekunden, und erscheinen im HTML-Bericht. Asserts, geschrieben in xUnit oder NUnit, prüfen die Endstatistik nach dem Lauf, und ein fehlgeschlagener Assert markiert den Lauf als fehlgeschlagen.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://nbomber.com/docs/nbomber/asserts_and_thresholds/&quot;&gt;Seite zu Schwellenwerten&lt;/a&gt; zeigt Prüfungen auf Fehleranteil, Statuscodes, Perzentile der Latenz (p50, p75, p95, p99 und Maximum), Anfragen pro Sekunde und übertragene Bytes. Ein Schwellenwert stoppt den Test standardmäßig nicht; mit &lt;code&gt;abortWhenErrorCount&lt;/code&gt; stoppt er nach einer festgelegten Zahl fehlgeschlagener Prüfungen (geprüft am 21. Oktober 2026). Einen Exit-Code nennt die Seite nicht; deshalb gibt das Beispiel oben selbst einen aus dem Ergebnis zurück. Unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests&lt;/a&gt; zeigt, welche Grenzen sinnvoll sind.&lt;/p&gt;
&lt;h2&gt;Welche Protokolle kann NBomber testen?&lt;/h2&gt;
&lt;p&gt;Jedes Protokoll, das eine .NET-Bibliothek sprechen kann, denn NBomber misst nur den Code, den Sie ihm geben. Fertige Plugins gibt es für HTTP, WebSockets, MQTT und AMQP, dazu eine WebBrowser-Option.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://nbomber.com/docs/getting-started/overview/&quot;&gt;Übersichtsseite&lt;/a&gt; beschreibt das Framework als unabhängig vom Protokoll, und die Preisseite führt diese Plugins in jedem Plan auf, auch im kostenlosen. Das gilt ebenso für Datenbanken und Message Queues, die Sie über ihre eigenen .NET-Clients ansprechen (geprüft am 21. Oktober 2026). Der Preis dafür: Außerhalb der Plugins schreiben und pflegen Sie den Client-Code selbst.&lt;/p&gt;
&lt;h2&gt;Wie skalieren Sie einen NBomber-Test?&lt;/h2&gt;
&lt;p&gt;Mit NBomber Cluster: Ein Coordinator steuert den Lauf, Agents führen die Szenarien aus, und alle kommunizieren über einen NATS-Message-Broker. Cluster gehört zur Enterprise-Lizenz.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://nbomber.com/docs/cluster/overview/&quot;&gt;Cluster-Übersicht&lt;/a&gt; erklärt die Rollen, und laut Lizenzseite können Entwickler ihn vor dem Kauf lokal mit einem Local Dev Cluster ausprobieren; die &lt;a href=&quot;https://nbomber.com/docs/cluster/local-dev-cluster/&quot;&gt;Seite zum Local Dev Cluster&lt;/a&gt; begrenzt ihn auf 1 Coordinator und 2 Agents und stoppt jeden Lauf nach einer Minute (geprüft am 21. Oktober 2026). Die Kubernetes-Integration von NBomber Studio, ebenfalls nur in Enterprise, richtet NATS und die Agent-Pods für Sie ein. Ohne Cluster läuft ein NBomber-Prozess auf einer Maschine; die &lt;a href=&quot;https://nbomber.com/docs/getting-started/system-requirements/&quot;&gt;Seite zu den Systemanforderungen&lt;/a&gt; empfiehlt für hohe Last 4 bis 8 CPU-Kerne.&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, führt keine NBomber-Tests aus. LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=nbomber-load-testing&quot;&gt;führt JMeter-Testpläne und k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen aus.&lt;/p&gt;
&lt;h2&gt;Was kann NBomber gut, und wo liegen seine Grenzen?&lt;/h2&gt;
&lt;p&gt;Stark ist es für .NET-Teams: Tests sind C#- oder F#-Code, jeder .NET-Client wird zum Lasttest, und beide Lastmodelle sind eingebaut. Seine Grenzen sind die Firmenlizenz, ein Ökosystem mit nur einer Sprache und kostenpflichtige verteilte Läufe.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tests liegen neben dem Anwendungscode, mit derselben IDE, denselben Paketen und denselben Reviews.&lt;/li&gt;
&lt;li&gt;Schwellenwerte sind eingebaut, und Asserts laufen in den xUnit- oder NUnit-Tests, die Sie schon haben.&lt;/li&gt;
&lt;li&gt;Kommerzielle Nutzung braucht eine Lizenz, auch für einen einzelnen Entwickler.&lt;/li&gt;
&lt;li&gt;Verteilte Läufe brauchen Enterprise und einen NATS-Broker.&lt;/li&gt;
&lt;li&gt;Tester ohne .NET-Kenntnisse müssen erst C# oder F# lernen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wann sollten Sie stattdessen k6, Gatling oder JMeter wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie ein anderes Tool, wenn Ihr Team nicht in .NET schreibt oder die Lizenzkosten nicht passen.&lt;/p&gt;
&lt;p&gt;Wählen Sie &lt;strong&gt;k6&lt;/strong&gt;, wenn Sie JavaScript-Skripte und ein Open-Source-Tool ohne Lizenzgebühr für den Firmeneinsatz wollen: Sein &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;Repository&lt;/a&gt; steht unter AGPL-3.0 (geprüft am 21. Oktober 2026). LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=nbomber-load-testing&quot;&gt;führt k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen aus, Arrival-Rate-Szenarien allerdings mit fester Benutzerzahl. Wählen Sie &lt;strong&gt;Gatling&lt;/strong&gt; für ein Code-first-Tool auf der JVM; unser &lt;a href=&quot;https://loadtest.app/de/gatling-load-testing/&quot;&gt;Gatling-Review&lt;/a&gt; behandelt es. Wählen Sie &lt;strong&gt;JMeter&lt;/strong&gt;, wenn Tester eine GUI bevorzugen oder Sie JDBC-, JMS- oder LDAP-Sampler von Haus aus brauchen. Der Überblick über &lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools&lt;/a&gt; stellt sie nebeneinander.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist NBomber für kommerzielle Nutzung kostenlos?&lt;/strong&gt;
Nein. NBomber ist nur für private und akademische Nutzung kostenlos. Ein Unternehmen braucht eine Business-Lizenz für 1.500 $ pro Jahr oder eine Enterprise-Lizenz für 2.500 $ pro Jahr.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welche .NET-Versionen unterstützt NBomber?&lt;/strong&gt;
Es basiert auf .NET Standard 2.1 und läuft daher auf .NET Core 3.0 und jeder neueren .NET-Version. Die Dokumentation empfiehlt .NET 10.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus NBomber-Tests ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter-Testpläne und k6-Skripte aus. Um NBomber auf mehr als einer Maschine laufen zu lassen, nutzen Sie NBomber Cluster, das eine Enterprise-Lizenz voraussetzt.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-load-testing/&quot;&gt;Gatling-Lasttests: das JVM-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools: sechs Optionen im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests: so legen Sie sie fest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tsung-load-testing/&quot;&gt;Tsung-Lasttests: das Erlang-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Tsung-Lasttests: das Erlang-Tool im Überblick</title><link>https://loadtest.app/de/tsung-load-testing/</link><guid isPermaLink="true">https://loadtest.app/de/tsung-load-testing/</guid><description>Lasttests mit Tsung im Überblick: XML-Szenarien, Ankunftsphasen, HTTP-, XMPP-, Datenbank- und MQTT-Plugins, verteilte Clients und die letzte Version 2023.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Tsung ist ein in Erlang geschriebenes Open-Source-Lasttest-Tool, das jeden Test in einer XML-Datei beschreibt und die Last auf viele Client-Maschinen verteilen kann. Ein Tsung-Lasttest ist weiterhin sinnvoll für Protokolle, die wenige Tools abdecken, etwa XMPP, LDAP oder PostgreSQL auf Protokollebene, und für sehr viele Benutzer auf bescheidener Hardware. Die letzte Version erschien im März 2023; für neue HTTP- oder API-Tests sind die meisten Teams daher mit k6, Gatling oder JMeter besser bedient.&lt;/p&gt;
&lt;p&gt;Wir haben Tsung für dieses Review nicht selbst ausgeführt. Die Fakten stammen aus der Dokumentation und dem GitHub-Repository von Tsung, geprüft am 21. Oktober 2026; die Einschätzungen sind unsere eigenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thema&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;Lizenz&lt;/td&gt;
&lt;td&gt;GPL-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geschrieben in&lt;/td&gt;
&lt;td&gt;Erlang (braucht Erlang/OTP R16B03 oder neuer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Letzte Version&lt;/td&gt;
&lt;td&gt;1.8.0 (2. März 2023)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests geschrieben als&lt;/td&gt;
&lt;td&gt;XML-Konfigurationsdateien&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lastmodell&lt;/td&gt;
&lt;td&gt;Neue Benutzer pro Ankunftsphase (offen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protokolle&lt;/td&gt;
&lt;td&gt;HTTP, WebDAV, XMPP, PostgreSQL, MySQL, LDAP, WebSocket, AMQP, MQTT, reines TCP/UDP (teils experimentell)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skalierung&lt;/td&gt;
&lt;td&gt;Client-Maschinen über SSH ohne Passwort&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berichte&lt;/td&gt;
&lt;td&gt;Live-Dashboard auf Port 8091, HTML-Bericht mit &lt;code&gt;tsung_stats.pl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Wer pflegt Tsung, und ist es noch aktiv?&lt;/h2&gt;
&lt;p&gt;ProcessOne hostet das Projekt unter GPL-2.0 auf GitHub. Es wird gepflegt, ist aber ruhig geworden: Die letzte Version, 1.8.0, stammt vom März 2023, und seither kommen nur gelegentlich zusammengeführte Pull Requests hinzu.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/processone/tsung&quot;&gt;Repository&lt;/a&gt; zeigt den letzten Commit am 2. März 2026, einen Pull Request, der veraltete Aufrufe ersetzt, und der &lt;a href=&quot;https://github.com/processone/tsung/releases/tag/v1.8.0&quot;&gt;Tag v1.8.0&lt;/a&gt; ist auf den 2. März 2023 datiert (geprüft am 21. Oktober 2026). Die &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/&quot;&gt;Dokumentation&lt;/a&gt; trägt noch den Titel 1.7.0; prüfen Sie also das Repository, wenn ein Detail veraltet wirkt. Ein ruhiges Projekt bedeutet allerdings weniger Antworten, wenn etwas schiefgeht.&lt;/p&gt;
&lt;h2&gt;Wie funktioniert ein Tsung-Test?&lt;/h2&gt;
&lt;p&gt;Ein Test ist eine XML-Datei mit vier Hauptteilen: Client-Maschinen, Zielserver, Lastphasen und Benutzersitzungen. Jeder neue Benutzer wählt eine Sitzung nach ihrer Wahrscheinlichkeit und führt deren Anfragen der Reihe nach aus.&lt;/p&gt;
&lt;p&gt;Dieser Ausschnitt startet zehn Minuten lang fünf neue Benutzer pro Sekunde; jeder lädt eine Produktliste, pausiert etwa zwei Sekunden und sendet dann eine POST-Anfrage an den Warenkorb:&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;Die &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-sessions.html&quot;&gt;Seite zu Sitzungen&lt;/a&gt; sagt, dass sich die Wahrscheinlichkeiten der Sitzungen zu 100 addieren müssen (seit 1.5.0 gehen auch Gewichte) und dass eine zufällige Think Time einer Exponentialverteilung um ihren Wert folgt, sofern Sie keinen Bereich mit &lt;code&gt;min&lt;/code&gt; und &lt;code&gt;max&lt;/code&gt; angeben (geprüft am 21. Oktober 2026). Für HTTP und PostgreSQL gibt es einen Proxy-Recorder, der eine Browser- oder Client-Sitzung in dieses XML übersetzt.&lt;/p&gt;
&lt;h2&gt;Welches Lastmodell nutzt Tsung?&lt;/h2&gt;
&lt;p&gt;Ein offenes Lastmodell. Jede Ankunftsphase startet neue Benutzer in festem Abstand oder mit fester Rate, egal was die bereits laufenden Benutzer tun, und eine Phase endet, wenn ihre Zeit abgelaufen ist, auch wenn ihre Sitzungen noch nicht fertig sind.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-load.html&quot;&gt;Seite zur Last&lt;/a&gt; nennt die Stellschrauben: &lt;code&gt;interarrival&lt;/code&gt; oder &lt;code&gt;arrivalrate&lt;/code&gt; pro Phase, &lt;code&gt;maxnumber&lt;/code&gt; als Obergrenze für die Benutzer, die eine Phase startet, ein &lt;code&gt;duration&lt;/code&gt;-Attribut für die gesamte Last, um den Test zu einer festen Zeit zu beenden, und &lt;code&gt;wait_all_sessions_end&lt;/code&gt;, damit die nächste Phase wartet, bis die aktuellen Benutzer fertig sind (geprüft am 21. Oktober 2026). Unsere Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; und zur &lt;a href=&quot;https://loadtest.app/de/think-time-in-load-testing/&quot;&gt;Think Time&lt;/a&gt; erklären, wie diese Entscheidungen verändern, was ein Test misst.&lt;/p&gt;
&lt;h2&gt;Welche Protokolle kann Tsung testen?&lt;/h2&gt;
&lt;p&gt;Mehr als die meisten Lasttest-Tools: HTTP (einschließlich SOAP), WebDAV, XMPP, PostgreSQL, MySQL, LDAP, WebSocket, AMQP, MQTT sowie reines TCP, UDP oder SSL. Die Dokumentation kennzeichnet die Plugins für MySQL, WebSocket, AMQP und MQTT als experimentell, AMQP nur in 0.9.1 und MQTT nur in 3.1.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/features.html&quot;&gt;Seite zu den Funktionen&lt;/a&gt; beschreibt jedes Plugin (geprüft am 21. Oktober 2026). Bei XMPP und PostgreSQL hatte Tsung lange wenige Konkurrenten: Es spricht das Protokoll selbst, Sie testen also den Server und nicht eine Client-Bibliothek. Für Echtzeit-Apps stellt unser Überblick über &lt;a href=&quot;https://loadtest.app/de/websocket-load-testing-tools/&quot;&gt;WebSocket-Lasttest-Tools&lt;/a&gt; Tsung neben neuere Optionen.&lt;/p&gt;
&lt;h2&gt;Wie verteilen Sie einen Tsung-Test auf mehrere Maschinen?&lt;/h2&gt;
&lt;p&gt;Sie listen die Client-Maschinen im XML auf, und der Controller startet die Last auf ihnen über SSH ohne Passwort oder über rsh. Jeder Client kann ein Gewicht, eine Benutzergrenze und eine CPU-Zahl erhalten.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-client-server.html&quot;&gt;Seite zu Clients und Server&lt;/a&gt; erklärt, dass Tsung auf jedem Client eine virtuelle Erlang-Maschine pro mit &lt;code&gt;cpu&lt;/code&gt; angegebener CPU betreibt (standardmäßig eine) und eine neue startet, wenn eine VM &lt;code&gt;maxusers&lt;/code&gt; erreicht. Client-Maschinen kann es auch von einem Batch-Scheduler wie PBS, LSF oder OAR übernehmen. Die &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/installation.html&quot;&gt;Installationsseite&lt;/a&gt; nennt Erlang/OTP R16B03 oder neuer, dazu optional Perl 5 und gnuplot oder Python und matplotlib für die Grafiken (geprüft am 21. Oktober 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, führt keine Tsung-Dateien aus. LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tsung-load-testing&quot;&gt;führt JMeter-Testpläne&lt;/a&gt; und k6-Skripte aus 25 Cloud-Regionen aus.&lt;/p&gt;
&lt;h2&gt;Wie lesen Sie Tsung-Ergebnisse?&lt;/h2&gt;
&lt;p&gt;Auf zwei Wegen: über ein Live-Dashboard, das der Controller auf Port 8091 bereitstellt, und über einen HTML-Bericht, den das Skript &lt;code&gt;tsung_stats.pl&lt;/code&gt; nach dem Lauf erzeugt.&lt;/p&gt;
&lt;p&gt;Laut &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/reports.html&quot;&gt;Seite zu den Berichten&lt;/a&gt; gibt es das Dashboard seit 1.6.0; es zeigt den aktuellen Status, erstellt Grafiken während des Tests und stoppt mit dem Testende, außer Sie starten Tsung mit &lt;code&gt;-k&lt;/code&gt; (geprüft am 21. Oktober 2026). Der Bericht umfasst Antwort- und Verbindungsaufbauzeiten, Transaktionen, Anfragen pro Sekunde und Fehlercodes und kann CPU-, Speicher- und Netzwerkwerte der Server enthalten, gesammelt über Erlang-Agenten, SNMP oder munin. Einen Pass/Fail-Schwellenwert beschreibt die Dokumentation nicht, eine CI-Pipeline muss die Ergebnisse also selbst auswerten; unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests&lt;/a&gt; zeigt, was zu prüfen ist.&lt;/p&gt;
&lt;h2&gt;Was kann Tsung gut, und wo liegen seine Grenzen?&lt;/h2&gt;
&lt;p&gt;Stark ist es bei der Protokollbreite, bei offenen Ankunftsphasen und bei vielen Benutzern pro Maschine, laut Dokumentation Tausende pro CPU. Seine Grenzen sind eine ruhige Versionsgeschichte, Skripte nur in XML und keine eingebauten Pass/Fail-Prüfungen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XMPP-, LDAP- und Datenbanktests auf Protokollebene, ohne Client-Code zu schreiben.&lt;/li&gt;
&lt;li&gt;Verteilung über einfaches SSH, ohne Broker oder Zusatzdienst.&lt;/li&gt;
&lt;li&gt;Servermonitoring im selben Bericht.&lt;/li&gt;
&lt;li&gt;Logik jenseits des XML bedeutet Erlang, das nur wenige Teams schreiben.&lt;/li&gt;
&lt;li&gt;Erlang muss auf dem Controller und auf jedem Client installiert sein.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wann sollten Sie stattdessen k6, Gatling oder JMeter wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie ein anderes Tool, wenn Sie HTTP oder APIs testen und ein aktives Projekt mit Skripten in einer verbreiteten Sprache wollen.&lt;/p&gt;
&lt;p&gt;Wählen Sie &lt;strong&gt;k6&lt;/strong&gt; für JavaScript-Skripte mit im Skript eingebauten &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;Schwellenwerten&lt;/a&gt; und ein aktives Projekt (geprüft am 21. Oktober 2026). Wählen Sie &lt;strong&gt;Gatling&lt;/strong&gt; für Code-first-Simulationen auf der JVM; unser &lt;a href=&quot;https://loadtest.app/de/gatling-load-testing/&quot;&gt;Gatling-Review&lt;/a&gt; behandelt es. Wählen Sie &lt;strong&gt;JMeter&lt;/strong&gt;, wenn Tester eine GUI wollen oder Sie JDBC-, JMS- oder LDAP-Sampler mit einem großen Plugin-Ökosystem brauchen. LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tsung-load-testing&quot;&gt;führt JMeter und k6&lt;/a&gt; aus 25 Cloud-Regionen aus, und der Überblick über &lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools&lt;/a&gt; stellt diese Tools nebeneinander.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Wird Tsung noch gepflegt?&lt;/strong&gt;
Ja, aber selten. Die letzte Version, 1.8.0, erschien am 2. März 2023, und das Repository erhält weiterhin gelegentlich zusammengeführte Änderungen, zuletzt im März 2026.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welche Protokolle unterstützt Tsung?&lt;/strong&gt;
HTTP und SOAP, WebDAV, XMPP, PostgreSQL, LDAP und reines TCP, UDP oder SSL, dazu MySQL, WebSocket, AMQP und MQTT, die die Dokumentation als experimentell kennzeichnet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus Tsung-Tests ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter-Testpläne und k6-Skripte aus. Um einen Tsung-Test auf mehrere Maschinen zu verteilen, listen Sie diese als Clients in der XML-Datei auf.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/websocket-load-testing-tools/&quot;&gt;WebSocket-Lasttest-Tools: sechs Optionen im Vergleich&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools: sechs Optionen im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-load-testing/&quot;&gt;Gatling-Lasttests: das JVM-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/nbomber-load-testing/&quot;&gt;NBomber-Lasttests: das .NET-Framework im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/pgbench/&quot;&gt;pgbench: PostgreSQL benchmarken und unter Last testen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/sysbench/&quot;&gt;sysbench nutzen: CPU-, Festplatten- und MySQL-Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Apdex-Score: was er bedeutet und wie man ihn berechnet</title><link>https://loadtest.app/de/apdex-score/</link><guid isPermaLink="true">https://loadtest.app/de/apdex-score/</guid><description>Der Apdex-Score erklärt: die Formel, die Wahl der Schwelle T, ein Rechenbeispiel und wie JMeter, Artillery und LoadFocus ihn im Lasttest berechnen.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Ein Apdex-Score ist eine Zahl zwischen 0 und 1, die angibt, welcher Anteil der Anfragen schnell genug für die Wartenden war. Sie wählen eine Zielzeit T: Antworten bis T zählen voll, Antworten bis zum Vierfachen von T zählen halb, langsamere zählen null. Ein Ergebnis von 1 heißt, jede Anfrage hat das Ziel erreicht, 0 heißt, jede war zu langsam.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zone&lt;/th&gt;
&lt;th&gt;Antwortzeit&lt;/th&gt;
&lt;th&gt;Gewicht im Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Zufrieden (satisfied)&lt;/td&gt;
&lt;td&gt;bis T&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tolerierend (tolerating)&lt;/td&gt;
&lt;td&gt;über T, bis 4T&lt;/td&gt;
&lt;td&gt;0,5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frustriert (frustrated)&lt;/td&gt;
&lt;td&gt;über 4T&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Die Fakten unten stammen aus der Dokumentation und dem Quellcode der Tools, geprüft am 19. Oktober 2026.&lt;/p&gt;
&lt;h2&gt;Wie berechnet man einen Apdex-Score?&lt;/h2&gt;
&lt;p&gt;Addieren Sie die zufriedenen Anfragen und die Hälfte der tolerierenden und teilen Sie durch alle Anfragen. Das Ergebnis liegt immer zwischen 0 und 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;Die &lt;a href=&quot;https://docs.newrelic.com/docs/apm/new-relic-apm/apdex/apdex-measuring-user-satisfaction/&quot;&gt;Apdex-Dokumentation von New Relic&lt;/a&gt; rechnet ein Beispiel mit T = 500 ms durch: Von 200 Anfragen waren 170 innerhalb von 500 ms fertig, 20 brauchten zwischen 500 ms und 2 Sekunden, und 10 schlugen fehl oder dauerten länger. Das ergibt (170 + 20 / 2) / 200 = 0,90 (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Ein zweites Beispiel zeigt, warum der Score im Lasttest nützlich ist. Ein Lauf schickt 10.000 Anfragen mit T = 300 ms: 8.200 sind innerhalb von 300 ms fertig, 1.300 zwischen 300 ms und 1,2 Sekunden, 500 dauern länger. Der Apdex beträgt (8.200 + 650) / 10.000 = 0,885. Derselbe Lauf kann leicht einen Durchschnitt von 280 ms melden, der für sich gut aussieht und die 500 Anfragen über einer Sekunde verbirgt.&lt;/p&gt;
&lt;h2&gt;Woher kommt Apdex?&lt;/h2&gt;
&lt;p&gt;Apdex, kurz für Application Performance Index, ist ein offener Standard einer Gruppe von Unternehmen, der Apdex Alliance. Peter Sevcik von NetForecast hat die Alliance 2004 gegründet.&lt;/p&gt;
&lt;p&gt;Der &lt;a href=&quot;https://en.wikipedia.org/wiki/Apdex&quot;&gt;Wikipedia-Artikel zu Apdex&lt;/a&gt; zitiert Sevciks Aufsatz von 2005 und nennt die 4T-Regel. Die &lt;a href=&quot;https://www.apdex.org/&quot;&gt;Apdex Users Group&lt;/a&gt; schreibt inzwischen, die Regeln für die Schwellen T und F seien „flexibel geworden“ (geprüft am 19. Oktober 2026), und die Tools nutzen diese Freiheit.&lt;/p&gt;
&lt;h2&gt;Wie berechnen JMeter, Artillery und LoadFocus den Score?&lt;/h2&gt;
&lt;p&gt;Alle drei starten mit T = 500 ms. Sie unterscheiden sich darin, wo die tolerierende Zone endet und was mit fehlgeschlagenen Anfragen passiert, daher kann derselbe Lauf drei leicht verschiedene Werte ergeben.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Standard-T&lt;/th&gt;
&lt;th&gt;Tolerierend bis&lt;/th&gt;
&lt;th&gt;Fehlgeschlagene Anfragen&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;JMeter-HTML-Dashboard&lt;/td&gt;
&lt;td&gt;500 ms&lt;/td&gt;
&lt;td&gt;1.500 ms&lt;/td&gt;
&lt;td&gt;zählen als frustriert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery-Plugin &lt;code&gt;apdex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;500 ms&lt;/td&gt;
&lt;td&gt;4T (2.000 ms)&lt;/td&gt;
&lt;td&gt;nur Antworten werden bewertet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoadFocus-Ergebnisseite&lt;/td&gt;
&lt;td&gt;500 ms, fest&lt;/td&gt;
&lt;td&gt;4T (2.000 ms)&lt;/td&gt;
&lt;td&gt;nach Antwortzeit bewertet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New Relic APM&lt;/td&gt;
&lt;td&gt;pro App einstellbar&lt;/td&gt;
&lt;td&gt;4T&lt;/td&gt;
&lt;td&gt;Serverfehler sind frustriert&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Der &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;Dashboard-Bericht&lt;/a&gt; enthält eine APDEX-Tabelle pro Transaktion. Die Standardwerte sind &lt;code&gt;jmeter.reportgenerator.apdex_satisfied_threshold=500&lt;/code&gt; und &lt;code&gt;apdex_tolerated_threshold=1500&lt;/code&gt;, die tolerierende Zone endet also bei 3T, solange Sie nichts ändern, und &lt;code&gt;apdex_per_transaction&lt;/code&gt; setzt eigene Schwellen pro Sampler. In &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; zählt ein fehlgeschlagenes Sample zur Gesamtzahl und nie zu den zufriedenen oder tolerierenden, jeder Fehler drückt also den Score (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery.&lt;/strong&gt; Das &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/apdex&quot;&gt;Apdex-Plugin&lt;/a&gt; funktioniert nur mit der HTTP-Engine und meldet die Zähler &lt;code&gt;apdex.satisfied&lt;/code&gt;, &lt;code&gt;apdex.tolerated&lt;/code&gt; und &lt;code&gt;apdex.frustrated&lt;/code&gt;. Sein Quellcode in &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; bewertet jede Antwort nach ihrer Gesamtzeit gegen T und 4T und gibt den Score mit einer Bezeichnung aus: excellent ab 0,94, good ab 0,85, fair ab 0,70, poor ab 0,49, darunter unacceptable. Eine Anfrage, die nie eine Antwort erhält, wird nie bewertet (geprüft am 19. Oktober 2026). Unser &lt;a href=&quot;https://loadtest.app/de/artillery-load-testing/&quot;&gt;Artillery-Review&lt;/a&gt; behandelt das Tool selbst.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus&lt;/strong&gt;, der Herausgeber dieser Website, zeigt den Apdex-Score im Insights-Tab eines Lasttest-Ergebnisses neben einem &lt;a href=&quot;https://loadfocus.com/docs/de-de/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=apdex-score&quot;&gt;Antwortzeit-Histogramm&lt;/a&gt;. T ist fest auf 500 ms eingestellt, die tolerierende Zone endet bei 2.000 ms, und T lässt sich nicht ändern. Jedes Sample wird nach seiner Antwortzeit eingeordnet, und die Anteile zufrieden, tolerierend und frustriert stehen neben dem Score.&lt;/p&gt;
&lt;h2&gt;Wie wählt man die Schwelle T?&lt;/h2&gt;
&lt;p&gt;Wählen Sie T danach, was die Nutzer dieser Seite oder dieses Endpunkts erwarten, und setzen Sie T pro Transaktion, wenn Ihr Tool das erlaubt. Ein einziges T für eine ganze Anwendung vermischt einen schnellen Suchendpunkt und einen langsamen Berichtsexport zu einer Zahl.&lt;/p&gt;
&lt;p&gt;Ein paar praktische Regeln:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Starten Sie mit einem echten Ziel.&lt;/strong&gt; Wenn Sie schon ein Latenzziel wie „95 % der Checkout-Aufrufe unter 400 ms“ haben, sorgt T = 400 ms dafür, dass Apdex und Ziel dasselbe erzählen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Halten Sie T zwischen Läufen gleich.&lt;/strong&gt; Ein Apdex ist nur mit einem Apdex bei gleichem T vergleichbar. Schreiben Sie Apdex(0.4) oder „Apdex bei T = 400 ms“, damit niemand über Schwellen hinweg vergleicht.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gleichen Sie auch die tolerierende Zone an.&lt;/strong&gt; Der JMeter-Standard endet bei 3T, die anderen bei 4T. Bevor Sie einen JMeter-Bericht mit einem anderen Tool vergleichen, setzen Sie &lt;code&gt;apdex_tolerated_threshold&lt;/code&gt; auf das Vierfache von T.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stellen Sie T nicht so ein, dass ein Release besteht.&lt;/strong&gt; Wer T nach einem schlechten Lauf verschiebt, ändert das Lineal, und der beobachtete Trend ist weg.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Was ist ein guter Apdex-Score?&lt;/h2&gt;
&lt;p&gt;Das Artillery-Plugin nennt 0,94 und mehr &lt;code&gt;excellent&lt;/code&gt;, 0,85 bis 0,94 &lt;code&gt;good&lt;/code&gt; und alles unter 0,70 &lt;code&gt;poor&lt;/code&gt; oder schlechter. Diese Bezeichnungen sagen nur etwas aus, wenn T ehrlich gewählt wurde.&lt;/p&gt;
&lt;p&gt;Ein Apdex von 0,95 bei T = 2 Sekunden kann einen langsameren Dienst beschreiben als 0,80 bei T = 200 ms. Wenn Sie ein Release-Gate festlegen, schreiben Sie Schwelle und Score zusammen („Apdex(0.5) mindestens 0,9“) und prüfen Sie ihn neben einem Perzentil-Limit, denn beide fangen unterschiedliche Probleme ab.&lt;/p&gt;
&lt;h2&gt;Was verbirgt Apdex?&lt;/h2&gt;
&lt;p&gt;Er presst die ganze Antwortzeitverteilung in drei Kategorien und kann daher nicht sagen, wie langsam die frustrierten Anfragen waren. Eine Anfrage mit 2,1 Sekunden und eine mit 30 Sekunden senken den Score um genau denselben Betrag.&lt;/p&gt;
&lt;p&gt;Deshalb wirkt er am besten neben anderen Zahlen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perzentile&lt;/strong&gt; zeigen, wie langsam die langsamen Anfragen sind. Unser Leitfaden zur &lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz&lt;/a&gt; erklärt, warum das 99. Perzentil zählt, sobald eine Seite mehrere Dienste aufruft.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Die Fehlerrate&lt;/strong&gt; erfasst Fehler, die Ihr Tool vielleicht nicht bewertet. Artillery bewertet Anfragen ohne Antwort nie, New Relic zählt Serverfehler als frustriert, lesen Sie die Fehlerzahl also separat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Die Stichprobengröße&lt;/strong&gt; zählt: New Relic weist darauf hin, dass der Score unter etwa 100 Anfragen pro Minute instabil ist.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Messverzerrung&lt;/strong&gt; gibt es auch. Ein Lastgenerator, der auf langsame Antworten wartet, schickt in langsamen Phasen weniger Anfragen, und der Apdex sieht besser aus als die Wirklichkeit; siehe &lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wie setzt man Apdex im Lasttest ein?&lt;/h2&gt;
&lt;p&gt;Nutzen Sie ihn als Zusammenfassung für Leute, die kein Histogramm lesen, und treffen Sie die Pass/Fail-Entscheidung über ausdrückliche Limits.&lt;/p&gt;
&lt;p&gt;Eine Routine, die funktioniert:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Setzen Sie T pro wichtiger Transaktion aus Ihrem Latenzziel.&lt;/li&gt;
&lt;li&gt;Führen Sie den Test aus und notieren Sie den Apdex bei diesem T, dazu das 95. und 99. Perzentil und die Fehlerrate.&lt;/li&gt;
&lt;li&gt;Vergleichen Sie den Apdex mit dem vorigen Lauf beim gleichen T. Ein Rückgang von 0,93 auf 0,86 ist auch für Leute außerhalb des Teams ein klares Signal.&lt;/li&gt;
&lt;li&gt;Lassen Sie den Build an Perzentil- und Fehlerlimits scheitern, wie in unserem Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests&lt;/a&gt; beschrieben, und berichten Sie den Apdex daneben.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist ein höherer Apdex-Score besser?&lt;/strong&gt;
Ja. 1,0 heißt, jede Anfrage war innerhalb von T fertig, und 0 heißt, jede Anfrage lag über der tolerierbaren Grenze oder wurde als frustriert gezählt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welche Apdex-Schwelle nutzt JMeter standardmäßig?&lt;/strong&gt;
Das HTML-Dashboard nutzt 500 ms für zufrieden und 1.500 ms für toleriert. Ändern Sie die Werte mit &lt;code&gt;jmeter.reportgenerator.apdex_satisfied_threshold&lt;/code&gt; und &lt;code&gt;apdex_tolerated_threshold&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bezieht Apdex Fehler ein?&lt;/strong&gt;
Das hängt vom Tool ab. JMeter zählt fehlgeschlagene Samples als frustriert und New Relic Serverfehler ebenso, während das Artillery-Plugin nur Anfragen bewertet, die eine Antwort erhalten haben.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann man Apdex-Scores aus zwei Tools vergleichen?&lt;/strong&gt;
Nur wenn T, die tolerierbare Grenze und der Umgang mit Fehlern übereinstimmen. Sonst vergleichen Sie besser die zugrunde liegenden Perzentile und Fehlerraten.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests: so legen Sie sie fest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission: was es ist und wie man es vermeidet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/artillery-load-testing/&quot;&gt;Artillery-Lasttests: das Node.js-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/slo-vs-sla/&quot;&gt;SLO vs. SLA: der Unterschied, SLIs und Fehlerbudgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Artillery-Lasttests: das Node.js-Tool im Überblick</title><link>https://loadtest.app/de/artillery-load-testing/</link><guid isPermaLink="true">https://loadtest.app/de/artillery-load-testing/</guid><description>Lasttests mit Artillery im Überblick: YAML- und TypeScript-Skripte, Arrival-Rate-Phasen, Playwright, ensure-Checks, Läufe auf AWS und Azure und Preise.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Artillery ist ein Open-Source-Lasttest-Tool, das auf Node.js läuft und jeden Test als YAML-, TypeScript- oder JavaScript-Datei beschreibt. Ein Artillery-Lasttest passt zu Teams, die im JavaScript-Umfeld arbeiten, neue Benutzer mit fester Rate eintreffen lassen wollen oder Browsertests mit Playwright im selben Tool möchten. Wer ein einzelnes Binary ohne Laufzeitumgebung will, ist mit k6 besser bedient, und wer viele Protokolle ab Werk braucht, mit JMeter.&lt;/p&gt;
&lt;p&gt;Wir haben Artillery für dieses Review nicht selbst ausgeführt. Die Fakten stammen aus der Dokumentation, dem Repository, dem npm-Paket und der Preisseite von Artillery, geprüft am 19. Oktober 2026; die Einschätzungen sind unsere eigenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thema&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;Lizenz&lt;/td&gt;
&lt;td&gt;MPL-2.0; einige Azure-Module unter BSL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laufzeit&lt;/td&gt;
&lt;td&gt;Node.js, aktuelle LTS (Paket verlangt 22.18.0 oder neuer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aktuelle Version&lt;/td&gt;
&lt;td&gt;2.0.34 (14. August 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests als&lt;/td&gt;
&lt;td&gt;YAML, TypeScript oder JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lastmodell&lt;/td&gt;
&lt;td&gt;Neue virtuelle Benutzer pro Sekunde, in Phasen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eingebaute Engines&lt;/td&gt;
&lt;td&gt;HTTP, WebSocket, Socket.IO, Playwright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass/Fail-Checks&lt;/td&gt;
&lt;td&gt;Plugin &lt;code&gt;ensure&lt;/code&gt;, Exit-Code ungleich null&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skalierung&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;Gehostete Berichte&lt;/td&gt;
&lt;td&gt;Artillery Cloud, optional, mit Gratisstufe&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Wer entwickelt Artillery, und wie ist es lizenziert?&lt;/h2&gt;
&lt;p&gt;Artillery Software Inc. pflegt es auf GitHub. Der größte Teil des Codes steht unter MPL-2.0, die kommerzielle Nutzung erlaubt; einige Azure-spezifische Module stehen unter der Business Source License.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;README des Repositorys&lt;/a&gt; erlaubt die Nutzung von Artillery auf Azure für Evaluierung und Proof of Concept und verlangt für kommerzielle oder produktive Nutzung dort eine kommerzielle Lizenz. Die neueste Version ist &lt;a href=&quot;https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.34&quot;&gt;2.0.34&lt;/a&gt;, am 14. August 2026 auf npm erschienen, und die Paketmetadaten verlangen Node.js 22.18.0 oder neuer; die &lt;a href=&quot;https://www.artillery.io/docs/get-started/get-artillery&quot;&gt;Installationsanleitung&lt;/a&gt; empfiehlt die aktuelle LTS-Version (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie funktioniert ein Artillery-Testskript?&lt;/h2&gt;
&lt;p&gt;Ein Skript hat zwei Teile: &lt;code&gt;config&lt;/code&gt; mit Ziel, Lastphasen und Plugins, und &lt;code&gt;scenarios&lt;/code&gt; mit dem, was jeder virtuelle Benutzer tut. Sie können es in YAML schreiben oder &lt;code&gt;config&lt;/code&gt; und &lt;code&gt;scenarios&lt;/code&gt; aus einer TypeScript- oder JavaScript-Datei exportieren.&lt;/p&gt;
&lt;p&gt;Dieser Test steigert in zwei Minuten von 5 auf 50 neue Benutzer pro Sekunde, hält zehn Minuten lang 50 pro Sekunde und scheitert, wenn das 99. Perzentil der Antwortzeit 800 ms erreicht:&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;Laut &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;Referenz zum Testskript&lt;/a&gt; gibt es vier Phasentypen: eine konstante Ankunftsrate, eine lineare Rampe mit &lt;code&gt;rampTo&lt;/code&gt;, eine feste Zahl von Ankünften (&lt;code&gt;arrivalCount&lt;/code&gt;) über einen Zeitraum und eine &lt;code&gt;pause&lt;/code&gt;. Eigener Code über &lt;code&gt;config.processor&lt;/code&gt; kann lokal und auf Fargate ein TypeScript-Modul sein, auf Lambda aber nicht (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welches Lastmodell nutzt Artillery?&lt;/h2&gt;
&lt;p&gt;Artillery startet neue virtuelle Benutzer mit der Rate, die Sie festlegen, egal ob frühere Benutzer fertig sind. Das ist ein offenes Lastmodell, das die Ankünfte konstant hält, auch wenn das System langsamer wird.&lt;/p&gt;
&lt;p&gt;Jeder neue Benutzer wählt ein Szenario, durchläuft es und geht, ein langsames System sammelt also Benutzer an, wie es echter Verkehr täte. &lt;code&gt;maxVusers&lt;/code&gt; begrenzt die Zahl gleichzeitiger Benutzer in einer Phase, falls Sie den Lastgenerator schützen müssen. Unser Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; erklärt den Unterschied, und &lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law&lt;/a&gt; zeigt, wie Ankunftsrate und Antwortzeit die Zahl gleichzeitiger Benutzer bestimmen.&lt;/p&gt;
&lt;h2&gt;Welche Protokolle und Browser kann es testen?&lt;/h2&gt;
&lt;p&gt;HTTP ist der Standard, WebSocket, Socket.IO und Playwright sind eingebaut. gRPC und AWS Kinesis brauchen separat installierte Engines.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;Seite zu den Engines&lt;/a&gt; beschreibt das Modell: Jedes Szenario läuft auf einer Engine, und Sie können eigene schreiben. Auf npm steht &lt;code&gt;artillery-engine-grpc&lt;/code&gt; bei 0.0.9 und &lt;code&gt;artillery-engine-kinesis&lt;/code&gt; bei 1.1.1, beide unter MPL-2.0. Die &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/playwright&quot;&gt;Playwright-Engine&lt;/a&gt; führt Ihren Playwright-Code in echten Headless-Browsern aus und meldet Web Vitals wie TTFB, FCP und LCP pro Seite. Die Dokumentation warnt, dass ein eigener Browser pro Benutzer statt eines Browser-Kontexts deutlich mehr CPU und Speicher braucht (geprüft am 19. Oktober 2026). Unsere Übersicht der &lt;a href=&quot;https://loadtest.app/de/websocket-load-testing-tools/&quot;&gt;WebSocket-Lasttest-Tools&lt;/a&gt; stellt Artillery neben andere Optionen für Echtzeit-Apps.&lt;/p&gt;
&lt;h2&gt;Wie passt es in CI?&lt;/h2&gt;
&lt;p&gt;Das Plugin &lt;code&gt;ensure&lt;/code&gt; macht aus Metriken Pass/Fail-Checks, und ein fehlgeschlagener Check lässt Artillery mit einem Exit-Code ungleich null enden. Das genügt jedem CI-System, um den Build scheitern zu lassen.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;Referenz zu ensure&lt;/a&gt; bietet zwei Arten von Checks: &lt;code&gt;thresholds&lt;/code&gt;, bei denen eine Metrik unter einem Wert bleiben muss, und &lt;code&gt;conditions&lt;/code&gt;, die Metriken in einem Ausdruck wie &lt;code&gt;http.response_time.p95 &amp;lt; 250 and http.request_rate &amp;gt; 1000&lt;/code&gt; kombinieren. Eine Bedingung mit &lt;code&gt;strict: false&lt;/code&gt; meldet nur, ohne zu scheitern. Das &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/apdex&quot;&gt;Apdex-Plugin&lt;/a&gt; ergänzt bei HTTP-Tests einen Apdex-Score mit einer Standardschwelle von 500 ms (geprüft am 19. Oktober 2026); unser Artikel zum &lt;a href=&quot;https://loadtest.app/de/apdex-score/&quot;&gt;Apdex-Score&lt;/a&gt; erklärt, wie man ihn liest. Für eine Workflow-Datei siehe unseren Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-testing-in-github-actions/&quot;&gt;Lasttests in GitHub Actions&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Wie skaliert man einen Artillery-Test?&lt;/h2&gt;
&lt;p&gt;Von der Kommandozeile aus, im eigenen Cloud-Konto: &lt;code&gt;run-lambda&lt;/code&gt; und &lt;code&gt;run-fargate&lt;/code&gt; auf AWS, &lt;code&gt;run-aci&lt;/code&gt; auf Azure Container Instances. Artillery legt die Ressourcen an, die der Lauf braucht, und entfernt die temporären danach.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-fargate&quot;&gt;Fargate-Anleitung&lt;/a&gt; listet die beteiligten Ressourcen und IAM-Berechtigungen. Die &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-lambda&quot;&gt;Lambda-Anleitung&lt;/a&gt; nennt ihre Grenzen: Ein Test kann nicht länger als 15 Minuten laufen, ein laufender Test lässt sich nicht stoppen, und &lt;code&gt;before&lt;/code&gt;- und &lt;code&gt;after&lt;/code&gt;-Hooks laufen einmal pro Worker. Die &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/azure-aci&quot;&gt;Azure-Anleitung&lt;/a&gt; verlangt Artillery 2.0.19 oder neuer und außerhalb einer Evaluierung ein Abonnement (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, führt keine Artillery-Skripte aus. LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=artillery-load-testing&quot;&gt;führt JMeter-Testpläne und k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen aus, für Artillery sind also die Befehle oben der Weg zum Skalieren.&lt;/p&gt;
&lt;h2&gt;Was kostet Artillery Cloud?&lt;/h2&gt;
&lt;p&gt;Das Dashboard ist optional: Ergebnisse landen nur dort, wenn Sie mit &lt;code&gt;--record&lt;/code&gt; und einem API-Schlüssel starten. Die Pläne reichen von einer Gratisstufe bis 499 $ im Monat.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://www.artillery.io/pricing&quot;&gt;Preisseite&lt;/a&gt; nennt (geprüft am 19. Oktober 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free:&lt;/strong&gt; 30 Berichte im Monat, 1 Monat Aufbewahrung, 2 Teammitglieder, verteilte Tests mit bis zu 5 Workern und 30 Minuten.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team, 199 $ im Monat:&lt;/strong&gt; 1.000 Berichte, 6 Monate, 8 Mitglieder, bis zu 25 Worker und 2 Stunden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business, 499 $ im Monat:&lt;/strong&gt; 2.500 Berichte, 18 Monate, keine Grenze bei Mitgliedern, Workern oder Dauer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enterprise-SSO, Audit-Logs und Support-SLAs beginnen bei 1.199 $ im Monat, und jährliche Abrechnung spart 20 %.&lt;/p&gt;
&lt;h2&gt;Was kann Artillery gut, und wo liegen seine Grenzen?&lt;/h2&gt;
&lt;p&gt;Stark ist es bei Last mit fester Ankunftsrate, kurzen lesbaren Skripten und Browsertests mit Playwright. Schwächer ist es, wenn Sie ein einzelnes Binary, viele Protokolle ohne Zusätze oder Azure ohne Lizenz brauchen.&lt;/p&gt;
&lt;p&gt;Als Node.js-Tool kann es in eigenen Funktionen jedes npm-Modul nutzen, um den Preis einer weiteren Laufzeitumgebung auf jeder Testmaschine. Grenzen, die die Dokumentation selbst nennt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lambda-Läufe enden nach 15 Minuten und lassen sich nicht abbrechen.&lt;/li&gt;
&lt;li&gt;Eigener Code in TypeScript (&lt;code&gt;config.processor&lt;/code&gt;) läuft nicht auf Lambda.&lt;/li&gt;
&lt;li&gt;gRPC und Kinesis sind separate Engines.&lt;/li&gt;
&lt;li&gt;Produktive Nutzung auf Azure erfordert eine kommerzielle Lizenz.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wann sollten Sie stattdessen k6, JMeter oder Locust wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie ein anderes Tool, wenn dessen Laufzeit, Protokolle oder Sprache besser zu Ihrem Team passen.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;k6&lt;/strong&gt;, wenn Sie ein Go-Binary ohne Node.js und Schwellenwerte im Skript wollen. Unser Vergleich &lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; stellt beide nebeneinander. LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=artillery-load-testing&quot;&gt;führt k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen aus, fährt Arrival-Rate-Szenarien aber mit einer festen Zahl von Benutzern; für eine gehaltene Ankunftsrate führen Sie sie mit k6 selbst aus.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;JMeter&lt;/strong&gt;, wenn Sie JDBC, JMS, LDAP oder FTP ab Werk brauchen oder wenn Ihre Tester Tests lieber in einer GUI erstellen.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;Locust&lt;/strong&gt;, wenn Ihr Team Python schreibt; unser &lt;a href=&quot;https://loadtest.app/de/locust-load-testing/&quot;&gt;Locust-Review&lt;/a&gt; behandelt es. Die Übersicht der &lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools&lt;/a&gt; stellt alle nebeneinander.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist Artillery für kommerzielle Nutzung kostenlos?&lt;/strong&gt;
Die CLI steht größtenteils unter MPL-2.0, die kommerzielle Nutzung erlaubt. Die Ausnahme ist Azure: Kommerzielle oder produktive Nutzung der Azure-Module erfordert eine kommerzielle Lizenz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann Artillery Browsertests ausführen?&lt;/strong&gt;
Ja. Die eingebaute Playwright-Engine führt Ihren Playwright-Code in Headless-Browsern aus und meldet Web Vitals für jede Seite.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus Artillery-Skripte ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter-Testpläne und k6-Skripte aus. Um einen Artillery-Test zu skalieren, nutzen Sie &lt;code&gt;run-lambda&lt;/code&gt;, &lt;code&gt;run-fargate&lt;/code&gt; oder &lt;code&gt;run-aci&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery: welches Lasttest-Tool passt zu Ihrem Team?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools: sechs Optionen im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/websocket-load-testing-tools/&quot;&gt;WebSocket-Lasttest-Tools: sechs Optionen im Vergleich&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/apdex-score/&quot;&gt;Apdex-Score: was er bedeutet und wie man ihn berechnet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Azure Load Testing: der Microsoft-Dienst im Überblick</title><link>https://loadtest.app/de/azure-load-testing/</link><guid isPermaLink="true">https://loadtest.app/de/azure-load-testing/</guid><description>Azure Load Testing im Überblick: JMeter- und Locust-Tests, URL-Schnelltests, Engines und Limits, Regionen, private Endpunkte, Preise pro VUH und CI.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Azure Load Testing ist der verwaltete Dienst von Microsoft, um JMeter- und Locust-Tests in großem Maßstab aus Azure auszuführen, abgerechnet pro virtueller Benutzerstunde. Er passt gut, wenn das getestete System auf Azure läuft, denn er kann Servermetriken aus Azure Monitor holen und private Endpunkte in einem virtuellen Netzwerk erreichen. Teams, die k6-Skripte schreiben, kein Azure-Abonnement haben oder von außerhalb der Azure-Regionen testen wollen, finden andere Dienste einfacher.&lt;/p&gt;
&lt;p&gt;Wir haben Azure Load Testing für dieses Review nicht selbst ausgeführt. Die Fakten stammen aus der Dokumentation und der Preisseite von Microsoft, geprüft am 19. Oktober 2026; die Einschätzungen sind unsere eigenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thema&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;Art&lt;/td&gt;
&lt;td&gt;Verwalteter Dienst im Azure-App-Testing-Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test-Frameworks&lt;/td&gt;
&lt;td&gt;Nur Apache JMeter und Locust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ohne Code&lt;/td&gt;
&lt;td&gt;URL-basierter Schnelltest, bis zu fünf HTTP-Anfragen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skalierung pro Lauf&lt;/td&gt;
&lt;td&gt;Bis zu 400 Engine-Instanzen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Längster Test&lt;/td&gt;
&lt;td&gt;24 Stunden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Herkunft der Last&lt;/td&gt;
&lt;td&gt;Region der Ressource oder bis zu 5 Regionen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private Endpunkte&lt;/td&gt;
&lt;td&gt;Ja, über VNet-Injektion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preis&lt;/td&gt;
&lt;td&gt;0,15 $ pro virtueller Benutzerstunde, 0,06 $ ab 10.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aufbewahrung&lt;/td&gt;
&lt;td&gt;6 Monate; clientseitige Metriken 365 Tage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was ist Azure Load Testing?&lt;/h2&gt;
&lt;p&gt;Ein vollständig verwalteter Dienst, der Ihren Lasttest auf Test-Engines von Microsoft ausführt, sodass Sie nie Lastgeneratoren aufbauen oder patchen. Sie legen in einer gewählten Azure-Region eine Load-Testing-Ressource an, fügen ihr Tests hinzu und starten Läufe aus dem Portal, der Azure CLI oder einer Pipeline.&lt;/p&gt;
&lt;p&gt;Laut &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/overview-what-is-azure-load-testing&quot;&gt;Übersichtsseite&lt;/a&gt; kann die getestete Anwendung überall laufen: in Azure, on-premises oder in einer anderen Cloud. Microsoft führt den Dienst inzwischen im Azure-App-Testing-Hub neben Playwright Workspaces; der &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/quickstart-create-run-load-test-with-locust&quot;&gt;Locust-Schnellstart&lt;/a&gt; legt die Ressource über diesen Hub an (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welche Testarten und Tools unterstützt er?&lt;/h2&gt;
&lt;p&gt;Drei Wege: ein URL-basierter Schnelltest, ein hochgeladenes JMeter-Skript oder ein hochgeladenes Locust-Skript. Die Dokumentation sagt klar, dass kein anderes Test-Framework unterstützt wird.&lt;/p&gt;
&lt;p&gt;Der &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/quickstart-create-and-run-load-test&quot;&gt;Schnelltest&lt;/a&gt; nimmt bis zu fünf HTTP-Anfragen und eine Zielzahl virtueller Benutzer oder Anfragen pro Sekunde. Jede Engine bewältigt bis zu 250 virtuelle Benutzer, 400 Benutzer laufen also auf zwei Engines mit je 200.&lt;/p&gt;
&lt;p&gt;Mit &lt;strong&gt;JMeter&lt;/strong&gt; können Sie Plugins von jmeter-plugins.org nutzen oder eigene hochladen, und laut Übersicht funktioniert jedes Protokoll, das JMeter unterstützt, etwa eine Datenbankverbindung oder eine Message Queue. Mit &lt;strong&gt;Locust&lt;/strong&gt; können Sie Locust-Plugins und andere Python-Bibliotheken hinzufügen. Die Locust-Dokumentation verweist selbst auf den Dienst als &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;gehostete Option&lt;/a&gt;, und unser &lt;a href=&quot;https://loadtest.app/de/locust-load-testing/&quot;&gt;Locust-Review&lt;/a&gt; behandelt das Tool selbst. k6-, Gatling- und Artillery-Skripte laufen hier nicht (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie funktionieren Engines, virtuelle Benutzer und Limits?&lt;/h2&gt;
&lt;p&gt;Sie skalieren einen Test, indem Sie Engine-Instanzen hinzufügen. Bei JMeter ist die Gesamtlast die Zahl der Benutzer im Testplan mal die Zahl der Engines; bei Locust legen Sie die Gesamtzahl der Benutzer fest und wählen, wie viele Engines sie erzeugen.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/concept-load-testing-concepts&quot;&gt;Konzeptseite&lt;/a&gt; nennt beide Formeln, und die &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/resource-limits-quotas-capacity&quot;&gt;Seite zu den Dienstlimits&lt;/a&gt; legt die Obergrenzen pro Region und Abonnement fest (geprüft am 19. Oktober 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Engine-Instanzen pro Testlauf: standardmäßig 1 bis 400 je nach Angebot, höchstens 400.&lt;/li&gt;
&lt;li&gt;Gleichzeitige Engine-Instanzen: standardmäßig 5 bis 400, auf Anfrage bis 1.000.&lt;/li&gt;
&lt;li&gt;Testdauer: standardmäßig 3 bis 24 Stunden, höchstens 24 Stunden.&lt;/li&gt;
&lt;li&gt;Fehlerkriterien: bis zu 50 pro Test.&lt;/li&gt;
&lt;li&gt;Aufbewahrung: serverseitige Metriken 90 Tage, clientseitige Metriken 365 Tage, Testergebnisse und Logs 6 Monate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ein höheres Standardlimit erfordert eine Supportanfrage; über die genannten Maximalwerte geht nichts hinaus.&lt;/p&gt;
&lt;h2&gt;Kann er private Endpunkte testen und Last aus mehreren Regionen erzeugen?&lt;/h2&gt;
&lt;p&gt;Ja, beides, mit einem Haken: Es lässt sich nicht kombinieren. Last aus mehreren Regionen funktioniert nur gegen öffentliche Endpunkte.&lt;/p&gt;
&lt;p&gt;Standardmäßig laufen die Engines in der Region Ihrer Load-Testing-Ressource. Mit der &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-generate-load-from-multiple-regions&quot;&gt;Anleitung für mehrere Regionen&lt;/a&gt; wählen Sie bis zu 5 Regionen pro Test und verteilen die Last auf sie, und der Test wird dabei auf öffentlichen Verkehr umgestellt. Für Dienste ohne öffentlichen Endpunkt platziert die &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-test-private-endpoint&quot;&gt;VNet-Injektion&lt;/a&gt; die Engines in dem Netzwerk, das die Anwendung enthält (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Was zeigen die Ergebnisse und Servermetriken?&lt;/h2&gt;
&lt;p&gt;Das Dashboard zeigt während des Laufs live clientseitige Metriken wie virtuelle Benutzer, Antwortzeit und Anfragen pro Sekunde. Für Apps auf Azure kommen serverseitige Metriken aus Azure Monitor, Application Insights und Container Insights auf derselben Zeitachse hinzu.&lt;/p&gt;
&lt;p&gt;Diese Kombination ist der größte Vorteil des Dienstes: Sie sehen die Datenbank oder den Container, der genau dann an seine Grenze kommt, wenn die Antwortzeiten steigen, ohne ein separates Dashboard zu bauen. Die &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-monitor-server-side-metrics&quot;&gt;Anleitung zu serverseitigen Metriken&lt;/a&gt; beschreibt die Schritte. Frühere Läufe lassen sich nebeneinander vergleichen, und Sie können Ergebnisse für andere Tools herunterladen.&lt;/p&gt;
&lt;h2&gt;Wie funktionieren Pass/Fail-Kriterien und CI?&lt;/h2&gt;
&lt;p&gt;Sie setzen Fehlerkriterien auf Client- oder Servermetriken, und der Lauf gilt als fehlgeschlagen, sobald eines verletzt ist. Pipelines in Azure DevOps, GitHub Actions oder jedem CI-Tool, das die Azure CLI aufrufen kann, können einen Test starten und auf dieses Ergebnis prüfen.&lt;/p&gt;
&lt;p&gt;Laut &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-define-test-criteria&quot;&gt;Anleitung zu Fehlerkriterien&lt;/a&gt; ist ein Kriterium ein Aggregat einer Clientmetrik, etwa durchschnittliche Antwortzeit oder Fehleranteil, verglichen mit einem Schwellenwert, entweder für den ganzen Test oder für eine benannte Anfrage. Für Servermetriken braucht die Ressource eine verwaltete Identität mit Lesezugriff. Auto-Stop beendet einen Lauf, wenn die Fehlerrate ein Limit überschreitet, damit eine falsche URL nicht weiter kostet. Die &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-configure-load-test-cicd&quot;&gt;CI/CD-Anleitung&lt;/a&gt; behandelt GitHub Actions und Azure Pipelines (geprüft am 19. Oktober 2026). Unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests&lt;/a&gt; erklärt, wie Sie die Limits wählen.&lt;/p&gt;
&lt;h2&gt;Was kostet Azure Load Testing?&lt;/h2&gt;
&lt;p&gt;Sie zahlen pro virtueller Benutzerstunde (VUH): 0,15 $ pro VUH für die ersten 10.000 VUH und 0,06 $ pro VUH danach, in jeder Region der Preisseite gleich. Seit dem 1. März 2026 gibt es zudem eine Mindestgebühr pro Testlauf.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://azure.microsoft.com/en-us/pricing/details/load-testing/&quot;&gt;Preisseite&lt;/a&gt; definiert eine VUH als virtuelle Benutzer mal Minuten, geteilt durch 60, gezählt alle 10 Sekunden; 1.000 Benutzer für 30 Minuten sind 500 VUH, also 75 $ zum Preis der ersten Stufe. Das Minimum sind 10 virtuelle Benutzer pro Engine für die Dauer des Laufs, mindestens 10 Minuten. Ein 3-stündiger Lauf mit 5 Benutzern auf einer Engine wird daher mit 30 VUH abgerechnet statt mit 15 (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wann sollten Sie etwas anderes wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie eine andere Option, wenn Ihre Skripte, Ihre Cloud oder Ihr Budget woandershin zeigen.&lt;/p&gt;
&lt;p&gt;Unser Überblick über &lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools&lt;/a&gt; behandelt die Tools, die Sie selbst betreiben können.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;LoadFocus&lt;/strong&gt;, den Herausgeber dieser Website, wenn Sie &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=azure-load-testing&quot;&gt;JMeter-Testpläne und k6-Skripte&lt;/a&gt; ohne Azure-Abonnement aus 25 Cloud-Regionen ausführen wollen. LoadFocus führt kein Locust aus und fährt k6-Arrival-Rate-Szenarien mit einer festen Zahl von Benutzern.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;Grafana Cloud k6&lt;/strong&gt; oder den &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt;, wenn Ihre Tests für k6 geschrieben sind, das Azure Load Testing nicht ausführen kann (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;selbst betriebenes Locust&lt;/strong&gt;, wenn Sie bereits Kubernetes oder freie Maschinen haben: Sein &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;verteilter Modus&lt;/a&gt; ist kostenlos, und Sie zahlen nur die Hardware.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Unterstützt Azure Load Testing k6?&lt;/strong&gt;
Nein. Er führt Apache-JMeter- und Locust-Tests aus, dazu URL-basierte Schnelltests, aus denen er selbst ein Skript erzeugt. k6-Skripte brauchen einen anderen Dienst oder eigene Infrastruktur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann ich Azure Load Testing für eine App nutzen, die nicht auf Azure läuft?&lt;/strong&gt;
Ja. Die Test-Engines können jeden öffentlichen Endpunkt ansprechen. Serverseitige Metriken werden nur für Azure-Ressourcen erfasst, bei anderem Hosting lesen Sie Servermetriken aus Ihrem eigenen Monitoring.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gibt es eine kostenlose Stufe?&lt;/strong&gt;
Die Preisseite nennt für Lasttests nur Preise pro Stunde, mit einem Minimum pro Testlauf. Neue Azure-Konten erhalten laut derselben Seite für die ersten 30 Tage ein Guthaben von 200 $.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-load-testing/&quot;&gt;Locust-Lasttests: das Python-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools: sechs Optionen im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests: so legen Sie sie fest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: Python-Skripte oder JMeter-Testpläne?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-testing-in-github-actions/&quot;&gt;Lasttests in GitHub Actions: ein praktischer Leitfaden&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Tail-Latenz: was sie ist und wie man sie misst</title><link>https://loadtest.app/de/tail-latency/</link><guid isPermaLink="true">https://loadtest.app/de/tail-latency/</guid><description>Tail-Latenz erklärt: warum das langsamste 1 % der Anfragen zählt, wie Fan-out sie verschärft, woher sie kommt und wie Sie p99 im Lasttest ehrlich messen.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Tail-Latenz ist die Antwortzeit der wenigen langsamsten Anfragen, meist als 99. oder 99,9. Perzentil angegeben. Sie zählt, weil eine Nutzeraktion oft auf viele Anfragen wartet, sodass eine Verzögerung, die 1 von 100 Anfragen trifft, die meisten Ihrer Nutzer erreichen kann. Ein Lasttest, der nur Durchschnitt oder Median meldet, zeigt sie nicht.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Backend-Aufrufe pro Seite&lt;/th&gt;
&lt;th&gt;Anteil der Seiten mit mindestens einem 1-von-100-langsamen Aufruf&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;Die Tabelle nimmt an, dass jeder Aufruf unabhängig von den anderen mit 1 % Wahrscheinlichkeit langsam ist: Der Anteil ist &lt;code&gt;1 - 0.99^n&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Was zählt zum Tail?&lt;/h2&gt;
&lt;p&gt;Der Tail ist der Teil der Antwortzeitverteilung oberhalb eines hohen Perzentils, meist p99 und p99,9. Der Median beschreibt eine typische Anfrage, der Tail die Anfragen, über die sich Leute beschweren.&lt;/p&gt;
&lt;p&gt;Ein Perzentil ist eine Grenze: p99 = 800 ms heißt, 99 % der Anfragen brauchten 800 ms oder weniger und 1 % länger. Der Tail liegt in einem Antwortzeit-Histogramm rechts dieser Grenze, oft als langer, dünner Ausläufer weit weg vom Hauptgipfel. Unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz&lt;/a&gt; erklärt, wie Lasttest-Tools Latenz und Perzentile messen.&lt;/p&gt;
&lt;h2&gt;Warum ist Tail-Latenz so wichtig?&lt;/h2&gt;
&lt;p&gt;Weil sich Anfragen vervielfachen. Eine Seite oder ein API-Aufruf, der an viele Dienste verteilt wird, ist erst fertig, wenn der langsamste antwortet, und so wird der Tail jedes Dienstes zur typischen Erfahrung des Ganzen.&lt;/p&gt;
&lt;p&gt;Die Standardquelle ist „The Tail at Scale“ von Jeffrey Dean und Luiz André Barroso, 2013 in Communications of the ACM erschienen (&lt;a href=&quot;https://www.barroso.org/publications/TheTailAtScale.pdf&quot;&gt;Paper als PDF&lt;/a&gt;, geprüft am 19. Oktober 2026). Ihr Beispiel: ein Server, der meist in 10 ms antwortet, beim 99. Perzentil aber eine Sekunde braucht. Berührt eine Anfrage einen solchen Server, ist 1 von 100 Nutzeranfragen langsam. Muss sie Antworten von 100 solchen Servern parallel einsammeln, dauern 63 % der Nutzeranfragen länger als eine Sekunde. Selbst wenn nur 1 von 10.000 Aufrufen langsam ist, sieht ein Dienst mit 2.000 Servern fast jede fünfte Anfrage über einer Sekunde.&lt;/p&gt;
&lt;p&gt;Dean und Barroso berichten außerdem von Messungen aus einem echten Google-Dienst: Das 99. Perzentil für eine einzelne Leaf-Anfrage lag bei 10 ms, bis alle Leaf-Anfragen fertig waren aber bei 140 ms, und das Warten auf die langsamsten 5 % davon machte die Hälfte aus.&lt;/p&gt;
&lt;h2&gt;Was verursacht Tail-Latenz?&lt;/h2&gt;
&lt;p&gt;Meist Störungen durch andere Arbeit auf der Maschine oder im Netzwerk. Dieselbe Anfrage ist meist schnell und nur dann langsam, wenn gerade etwas anderes passiert.&lt;/p&gt;
&lt;p&gt;Dean und Barroso nennen die üblichen Verdächtigen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Geteilte Ressourcen:&lt;/strong&gt; andere Arbeit auf derselben Maschine, die um CPU-Kerne, Prozessor-Caches, Speicher- oder Netzwerkbandbreite konkurriert.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hintergrund-Daemons&lt;/strong&gt;, die aufwachen und sich einen Teil der Maschine nehmen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wartungsarbeit&lt;/strong&gt; wie Log-Kompaktierung oder Garbage Collection in verwalteten Laufzeitumgebungen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Warteschlangen&lt;/strong&gt; in Servern und Netzwerk-Switches, die jede andere Quelle verstärken.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leistungs- und Temperaturgrenzen&lt;/strong&gt;, die eine CPU nach einer Lastspitze bremsen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Im Lasttest tauchen dieselben Punkte als GC-Pausen in JVM- oder Node.js-Diensten auf, als erschöpfter Verbindungspool, als langsame Datenbankabfrage, die nur manche Anfragen auslösen, als kalte Caches nach einem Deploy und als Wiederholungen nach einem Timeout. Ein Tail, der mit der Last wächst, deutet auf Warteschlangen; ein Tail, der schon bei geringer Last da ist, deutet auf etwas Periodisches wie GC oder einen geplanten Job.&lt;/p&gt;
&lt;h2&gt;Wie misst man Tail-Latenz im Lasttest?&lt;/h2&gt;
&lt;p&gt;Sammeln Sie genug Samples, fragen Sie Ihr Tool nach den richtigen Perzentilen und mitteln Sie Perzentile nie über Maschinen oder Zeitfenster.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Genug Samples.&lt;/strong&gt; p99 wird vom langsamsten 1 % der Anfragen bestimmt, ein Lauf mit 500 Anfragen stützt ihn also auf 5 davon. Für ein stabiles p99 brauchen Sie Tausende Anfragen pro Transaktion, für p99,9 Zehntausende. Kurze Smoke-Tests eignen sich gut, um Fehler zu finden, und schlecht, um den Tail zu beurteilen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Die richtigen Perzentile.&lt;/strong&gt; Standardwerte hören oft vor dem Tail auf. Bei k6 ist &lt;code&gt;summaryTrendStats&lt;/code&gt; standardmäßig &lt;code&gt;avg,min,med,max,p(90),p(95)&lt;/code&gt;, p99 erscheint also nur, wenn Sie es hinzufügen (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/k6-options/reference/&quot;&gt;k6-Optionsreferenz&lt;/a&gt;, geprüft am 19. Oktober 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;Der &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Aggregate_Report&quot;&gt;Aggregate Report&lt;/a&gt; von JMeter zeigt die 90-%-, 95-%- und 99-%-Linien, und die Properties &lt;code&gt;aggregate_rpt_pct1&lt;/code&gt; bis &lt;code&gt;aggregate_rpt_pct3&lt;/code&gt; legen fest, welche Perzentile erscheinen (geprüft am 19. Oktober 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keine gemittelten Perzentile.&lt;/strong&gt; Das p99 eines ganzen Laufs ist weder der Durchschnitt der p99-Werte jeder Minute noch der Durchschnitt der p99-Werte jedes Lastgenerators. Führen Sie die Roh-Samples oder ein Histogramm zusammen und berechnen Sie das Perzentil einmal. Der Artikel zu &lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission&lt;/a&gt; behandelt HdrHistogram, das übliche Werkzeug dafür, und eine zweite Falle: Ein Lastgenerator, der auf langsame Antworten wartet, schickt weniger Anfragen, während das System langsam ist, und verbirgt genau den Tail, den Sie suchen.&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, zeigt pro Lauf P95- und P99-Kacheln, ein &lt;a href=&quot;https://loadfocus.com/docs/de-de/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tail-latency&quot;&gt;Antwortzeit-Histogramm&lt;/a&gt; aus den einzelnen Samples und die langsamsten Anfragen, sodass ein langer Ausläufer rechts vom Gipfel auf einen Blick sichtbar ist.&lt;/p&gt;
&lt;h2&gt;Wie setzt man ein Pass/Fail-Limit auf den Tail?&lt;/h2&gt;
&lt;p&gt;Setzen Sie ein Limit auf p99 pro wichtiger Transaktion, neben ein p95-Limit und ein Fehlerraten-Limit. Leiten Sie es aus dem ab, was die Nutzer dieser Transaktion brauchen, und lassen Sie den Lauf lang genug laufen, damit p99 stabil ist.&lt;/p&gt;
&lt;p&gt;Eine sinnvolle Kombination für eine Checkout-API könnte lauten: p95 unter 400 ms, p99 unter 1.200 ms, Fehler unter 0,5 %. In k6 sind das Schwellenwerte auf &lt;code&gt;http_req_duration&lt;/code&gt; wie &lt;code&gt;p(99)&amp;lt;1200&lt;/code&gt;, und ein verletzter Schwellenwert lässt k6 mit einem Exit-Code ungleich null enden (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;k6-Thresholds&lt;/a&gt;, geprüft am 19. Oktober 2026). LoadFocus hat neben Max P95 ein Feld &lt;a href=&quot;https://loadfocus.com/docs/de-de/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; für Cloud-, JMeter- und k6-Tests, und jeder Lauf wird dann mit PASS oder FAIL bewertet. Unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests&lt;/a&gt; behandelt die übrigen Kriterien.&lt;/p&gt;
&lt;p&gt;Wenn Sie auch einen &lt;a href=&quot;https://loadtest.app/de/apdex-score/&quot;&gt;Apdex-Score&lt;/a&gt; melden, denken Sie daran, dass er jede Anfrage über dem Vierfachen von T in dieselbe Kategorie wirft und einen Tail von 2 Sekunden nicht von einem mit 30 Sekunden unterscheiden kann. Das p99 kann es.&lt;/p&gt;
&lt;h2&gt;Wie senkt man Tail-Latenz?&lt;/h2&gt;
&lt;p&gt;Beseitigen Sie Quellen der Schwankung, wo es geht, und bauen Sie Aufrufer so, dass ein langsamer Aufruf nicht die ganze Antwort aufhält.&lt;/p&gt;
&lt;p&gt;Übliche Maßnahmen, grob von günstig bis aufwendig:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GC und Poolgrößen abstimmen&lt;/strong&gt;, damit Pausen und das Warten auf eine freie Verbindung unter Last kurz bleiben.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reserve einplanen.&lt;/strong&gt; Warteschlangen wachsen kurz vor der Sättigung stark, freie Kapazität verkürzt also den Tail; der Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz&lt;/a&gt; zeigt, wie Sie den Knick finden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timeouts setzen und Wiederholungen begrenzen&lt;/strong&gt;, damit ein hängender Aufruf schnell scheitert, statt dass sich alles dahinter staut.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abgesicherte Anfragen (Hedging)&lt;/strong&gt; für idempotente Lesezugriffe nutzen: eine zweite Kopie an ein anderes Replikat schicken, wenn das erste nicht rechtzeitig antwortet. Dean und Barroso beschreiben, die Reserveanfrage erst nach der erwarteten Latenz des 95. Perzentils zu senden, was die Zusatzlast auf etwa 5 % begrenzt. In einem ihrer Tests senkte ein Hedge nach 10 ms das 99,9. Perzentil von 1.800 ms auf 74 ms, bei nur 2 % mehr Anfragen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weniger Fan-out.&lt;/strong&gt; Weniger Backend-Aufrufe pro Seite heißt weniger Chancen, den Tail zu treffen, wie die Tabelle oben zeigt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Führen Sie nach jeder Änderung denselben Test mit demselben Lastprofil erneut aus und vergleichen Sie p99 und p99,9 zwischen den Läufen.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist Tail-Latenz dasselbe wie p99?&lt;/strong&gt;
p99 ist die üblichste Art, sie anzugeben, und der Tail ist das ganze langsame Ende der Verteilung. Verfolgen Sie auch p99,9 und das Maximum, wenn der Lauf genug Anfragen hat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warum ist mein p99 so viel höher als mein Durchschnitt?&lt;/strong&gt;
Weil ein paar langsame Anfragen den Durchschnitt kaum bewegen und das p99 vollständig bestimmen. Eine große Lücke ist normal; eine Lücke, die mit der Last wächst, deutet meist auf Warteschlangen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wie viele Anfragen brauche ich, um p99 zu messen?&lt;/strong&gt;
Mindestens einige Tausend pro Transaktion, damit das p99 auf Dutzenden langsamer Anfragen beruht. Für p99,9 planen Sie Zehntausende ein.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission: was es ist und wie man es vermeidet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/apdex-score/&quot;&gt;Apdex-Score: was er bedeutet und wie man ihn berechnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests: so legen Sie sie fest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law im Lasttest: Tests dimensionieren und prüfen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/ycsb/&quot;&gt;YCSB: Workloads A-F, Ausführung und Grenzen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/slo-vs-sla/&quot;&gt;SLO vs. SLA: der Unterschied, SLIs und Fehlerbudgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>gRPC-Lasttest: Tools, Einrichtung und Kennzahlen</title><link>https://loadtest.app/de/grpc-load-testing/</link><guid isPermaLink="true">https://loadtest.app/de/grpc-load-testing/</guid><description>gRPC-Lasttest erklärt: welche Tools gRPC nativ sprechen, wie Sie einen Test mit k6 oder ghz schreiben und warum Fehler trotzdem HTTP 200 liefern.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Für einen gRPC-Lasttest brauchen Sie ein Tool, das HTTP/2 und Protocol Buffers spricht: k6 und ghz können das von Haus aus, JMeter braucht ein Plugin, Gatlings gRPC-Unterstützung ist in der kostenlosen Edition begrenzt, und bei Locust müssen Sie selbst einen gRPC-Client einbinden. Werten Sie die Ergebnisse nach gRPC-Status aus, nicht nach HTTP-Status, denn fehlgeschlagene Aufrufe kommen trotzdem als HTTP 200 an, und prüfen Sie, ob die Last jedes Backend erreicht.&lt;/p&gt;
&lt;p&gt;Für diesen Artikel wurde kein gRPC-Test ausgeführt. Die Fakten zu den Tools stammen aus der Dokumentation und den Repositories der jeweiligen Projekte, geprüft am 16. Oktober 2026; die Fakten zu LoadFocus stammen aus dessen Code.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;gRPC-Unterstützung&lt;/th&gt;
&lt;th&gt;Liest die API aus&lt;/th&gt;
&lt;th&gt;Ratensteuerung&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;Eingebaut (&lt;code&gt;k6/net/grpc&lt;/code&gt;), unäre Aufrufe und Streams&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.proto&lt;/code&gt;-Dateien oder Server Reflection&lt;/td&gt;
&lt;td&gt;Arrival-Rate-Executors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ghz&lt;/td&gt;
&lt;td&gt;Eigenes gRPC-Kommandozeilentool&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.proto&lt;/code&gt;, Protoset oder Server Reflection&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--rps&lt;/code&gt; und Lastpläne&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Plugin eines Drittanbieters (jmeter-grpc-request)&lt;/td&gt;
&lt;td&gt;Einem Ordner mit &lt;code&gt;.proto&lt;/code&gt;-Dateien&lt;/td&gt;
&lt;td&gt;Thread Groups und Timer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Eigene gRPC-Komponente; kostenlose Edition auf 5 Benutzer, 5 Minuten begrenzt&lt;/td&gt;
&lt;td&gt;Mit protoc aus &lt;code&gt;.proto&lt;/code&gt; generiertem Code&lt;/td&gt;
&lt;td&gt;Injektionsprofile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Kein eingebauter Client; einen einbinden und Aufrufe melden&lt;/td&gt;
&lt;td&gt;Ihrem Python-gRPC-Client&lt;/td&gt;
&lt;td&gt;Wartezeiten, &lt;code&gt;constant_throughput&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Warum braucht gRPC einen anderen Lasttest als REST?&lt;/h2&gt;
&lt;p&gt;gRPC läuft über HTTP/2, sendet binäre Protocol Buffers statt JSON, legt das Ergebnis eines Aufrufs in einen Trailer statt in den HTTP-Status und bündelt viele Aufrufe auf einer Verbindung. Jeder dieser Punkte ändert, wie Sie den Test skripten oder seine Ergebnisse lesen.&lt;/p&gt;
&lt;p&gt;Der &lt;a href=&quot;https://grpc.io/blog/grpc-load-balancing/&quot;&gt;Beitrag zum gRPC-Load-Balancing&lt;/a&gt; nennt die HTTP/2-Eigenschaften, auf die es hier ankommt: ein binäres Protokoll, viele Anfragen gemultiplext auf einer Verbindung und Header-Kompression, darüber stark typisierte Protobuf-Nachrichten (geprüft am 16. Oktober 2026). Ein Tool, das nur JSON über HTTP/1.1 sendet, kann keine gRPC-Methode aufrufen, prüfen Sie also zuerst die Protokollunterstützung.&lt;/p&gt;
&lt;h2&gt;Welches Tool sollten Sie verwenden?&lt;/h2&gt;
&lt;p&gt;Nehmen Sie k6, wenn Sie Szenarien, Checks und Schwellenwerte als Code wollen; nehmen Sie ghz für einen schnellen Benchmark einer Methode von der Kommandozeile. Greifen Sie zu JMeter, Gatling oder Locust, wenn Ihr Team alles andere bereits damit testet.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;k6.&lt;/strong&gt; Das &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/&quot;&gt;Modul k6/net/grpc&lt;/a&gt; lädt Protobuf-Definitionen, baut Verbindungen auf, macht unäre Aufrufe mit &lt;code&gt;invoke&lt;/code&gt; und öffnet Streams. Es meldet &lt;code&gt;grpc_req_duration&lt;/code&gt; und die Zahl der Stream-Nachrichten in seinen &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;Metriken&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ghz.&lt;/strong&gt; Ein reines gRPC-Benchmark-Tool für die Kommandozeile. Zu seinen &lt;a href=&quot;https://ghz.sh/docs/options&quot;&gt;Optionen&lt;/a&gt; gehören &lt;code&gt;--rps&lt;/code&gt;, &lt;code&gt;--concurrency&lt;/code&gt;, &lt;code&gt;--total&lt;/code&gt; und &lt;code&gt;--duration&lt;/code&gt;, und wenn Sie weder &lt;code&gt;--proto&lt;/code&gt; noch &lt;code&gt;--protoset&lt;/code&gt; angeben, versucht es Server Reflection. Das neueste &lt;a href=&quot;https://github.com/bojand/ghz/releases&quot;&gt;Release&lt;/a&gt; ist v0.121.0 (geprüft am 16. Oktober 2026).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Der JMeter-Kern hat keinen gRPC-Sampler; das &lt;a href=&quot;https://github.com/zalopay-oss/jmeter-grpc-request&quot;&gt;Plugin jmeter-grpc-request&lt;/a&gt; fügt einen hinzu, der einen Ordner mit &lt;code&gt;.proto&lt;/code&gt;-Dateien liest, ohne Codegenerierung (neuester Tag v1.2.6, geprüft am 16. Oktober 2026).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; Die &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;Gatling-README&lt;/a&gt; stellt gRPC, MQTT und GraphQL unter die Gatling Enterprise Component License, in der Community Edition begrenzt auf 5 gleichzeitige Benutzer und 5 Minuten Testdauer (geprüft am 16. Oktober 2026). Die &lt;a href=&quot;https://docs.gatling.io/reference/script/grpc/setup/&quot;&gt;Anleitung zur gRPC-Einrichtung&lt;/a&gt; generiert Code aus Ihren &lt;code&gt;.proto&lt;/code&gt;-Dateien mit protoc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Locust.&lt;/strong&gt; Die Dokumentation zum &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;Testen anderer Systeme&lt;/a&gt; enthält ein gRPC-Beispiel: Sie umhüllen einen gRPC-Client, damit jeder Aufruf an Locust gemeldet wird, und &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; taktet eine Aufgabe auf höchstens eine feste Zahl von Läufen pro Sekunde.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nehmen Sie ghz statt k6, wenn Sie nur wissen müssen, wie sich eine Methode bei einer bestimmten Rate verhält, und kein Skript schreiben wollen. Nehmen Sie stattdessen Locust, wenn Ihr Team in Python schreibt und der Test Logik braucht, die dort einfacher ist.&lt;/p&gt;
&lt;h2&gt;Wie schreiben Sie einen gRPC-Lasttest in k6?&lt;/h2&gt;
&lt;p&gt;Laden Sie die &lt;code&gt;.proto&lt;/code&gt;-Datei im Init-Code, dann bauen Sie in jeder Iteration die Verbindung auf, rufen die Methode auf und prüfen den gRPC-Status. Der Aufbau folgt dem Beispiel aus der k6-Dokumentation.&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;Die &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/client/client-invoke/&quot;&gt;Seite zu &lt;code&gt;invoke&lt;/code&gt;&lt;/a&gt; nutzt dieselbe Abfolge aus Laden, Verbinden, Aufrufen, Prüfen und Schließen. &lt;code&gt;connect&lt;/code&gt; verwendet TLS, außer Sie übergeben &lt;code&gt;plaintext: true&lt;/code&gt;, und mit &lt;code&gt;reflect: true&lt;/code&gt; fragt es den Server nach seiner API, statt eine &lt;code&gt;.proto&lt;/code&gt;-Datei zu lesen (&lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/client/client-connect/&quot;&gt;Verbindungsparameter&lt;/a&gt;). Um eine Anfragerate statt einer Benutzerzahl zu halten, führen Sie die Funktion in einem Arrival-Rate-Szenario aus.&lt;/p&gt;
&lt;h2&gt;Wie machen Sie einen schnellen Benchmark mit ghz?&lt;/h2&gt;
&lt;p&gt;Geben Sie ghz die Methode, einen Anfrage-Body und eine Rate oder Parallelität, und es gibt ein Latenz-Histogramm, Perzentile und eine Zählung pro Statuscode aus. Das passt für einen ersten Blick auf eine Methode.&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; setzt die angestrebte Anfragerate, verteilt auf die Worker, &lt;code&gt;-c&lt;/code&gt; bestimmt, wie viele Worker es gibt, und &lt;code&gt;-z&lt;/code&gt; die Dauer. Lassen Sie &lt;code&gt;--proto&lt;/code&gt; weg, damit ghz Server Reflection nutzt, sofern der Server sie aktiviert hat. Die &lt;a href=&quot;https://ghz.sh/docs/output&quot;&gt;Ausgabeseite von ghz&lt;/a&gt; zeigt einen Beispielbericht.&lt;/p&gt;
&lt;h2&gt;Was sollten Sie in einem gRPC-Lasttest messen?&lt;/h2&gt;
&lt;p&gt;Messen Sie Latenz-Perzentile der Aufrufe, den Durchsatz und die Zahl jedes gRPC-Statuscodes. Eine Erfolgsquote auf HTTP-Ebene kann 100 % zeigen, während Aufrufe fehlschlagen, weil das Ergebnis im Trailer &lt;code&gt;grpc-status&lt;/code&gt; steht.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://raw.githubusercontent.com/grpc/grpc/master/doc/PROTOCOL-HTTP2.md&quot;&gt;gRPC-Spezifikation für HTTP/2&lt;/a&gt; setzt den HTTP-Status auf &lt;code&gt;:status 200&lt;/code&gt; und überträgt das Ergebnis des Aufrufs in Trailern als &lt;code&gt;grpc-status&lt;/code&gt; und &lt;code&gt;grpc-message&lt;/code&gt;. Die &lt;a href=&quot;https://grpc.github.io/grpc/core/md_doc_statuscodes.html&quot;&gt;Liste der Statuscodes&lt;/a&gt; enthält die Codes, die unter Last am meisten zählen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DEADLINE_EXCEEDED&lt;/code&gt; (4): die Deadline lief ab, bevor der Aufruf fertig war.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RESOURCE_EXHAUSTED&lt;/code&gt; (8): ein Kontingent oder eine Ressource war erschöpft.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INTERNAL&lt;/code&gt; (13): eine interne Invariante ist verletzt, ein Code für schwere Fehler.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UNAVAILABLE&lt;/code&gt; (14): meist vorübergehend; ein erneuter Versuch mit Backoff kann helfen, ist bei nicht idempotenten Aufrufen aber nicht immer sicher.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zählen Sie jeden Code pro Laststufe. Deadline-Fehler können steigen, während die erfolgreichen Aufrufe noch schnell aussehen, weil die langsamen an der Deadline abgebrochen werden, statt als langsam erfasst zu werden. Unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests&lt;/a&gt; zeigt, wie Sie aus diesen Zahlen Schwellenwerte machen.&lt;/p&gt;
&lt;h2&gt;Warum landet die ganze Last auf einem Server?&lt;/h2&gt;
&lt;p&gt;Weil gRPC viele Aufrufe auf einer langlebigen Verbindung bündelt, schickt ein Load Balancer, der pro Verbindung arbeitet, jeden Aufruf darauf an dasselbe Backend. Ein Lastgenerator mit wenigen Verbindungen kann dann einen Server auslasten, während die anderen untätig sind.&lt;/p&gt;
&lt;p&gt;Der Beitrag zum gRPC-Load-Balancing erklärt den Mechanismus. Ein Balancer auf Transportebene (L3/L4) terminiert die TCP-Verbindung und öffnet eine weitere zu einem gewählten Backend und kopiert die HTTP/2- und gRPC-Frames zwischen beiden; ein Balancer auf Anwendungsebene (L7) parst HTTP/2 und kann die Streams einer Client-Verbindung auf mehrere Backends verteilen. Laufen Ihre Produktions-Clients über einen L7-Balancer oder balancieren clientseitig, testen Sie über denselben Weg und prüfen Sie während des Laufs CPU und Anfragezahlen pro Backend.&lt;/p&gt;
&lt;h2&gt;Können Sie gRPC-Lasttests auf LoadFocus ausführen?&lt;/h2&gt;
&lt;p&gt;Nicht so, dass seine Berichte sie zeigen würden. LoadFocus führt das unveränderte k6-Release v0.57.0 aus, das das gRPC-Modul enthält, aber sein k6-Agent leitet nur HTTP-Anfragewerte an die Ergebnisse weiter, sodass gRPC-Aufrufe Last erzeugen würden, ohne in seinen Diagrammen oder Fehlerzahlen aufzutauchen.&lt;/p&gt;
&lt;p&gt;Dazu kommen zwei weitere Grenzen. Der k6-Upload akzeptiert &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;- und &lt;code&gt;.properties&lt;/code&gt;-Dateien, keine &lt;code&gt;.proto&lt;/code&gt;-Dateien, ein Skript müsste sich also mit &lt;code&gt;reflect: true&lt;/code&gt; verbinden. Und der Weg über JMeter ist verschlossen: Die JMeter-Agenten von LoadFocus bringen JMeter 5.6.2 mit vorinstallierten Plugins mit, unter denen kein gRPC-Sampler ist, und der JMeter-Upload akzeptiert keine Plugin-JAR-Dateien. Für gRPC führen Sie k6 oder ghz auf eigenen Rechnern aus und nutzen &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=grpc-load-testing&quot;&gt;k6-Skripte&lt;/a&gt; auf LoadFocus für die HTTP-Seite desselben Systems, wo es Last aus 25 Regionen erzeugt.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Kann man gRPC-Streaming-Aufrufe lasttesten?&lt;/strong&gt;
Ja, mit k6 und ghz. Das gRPC-Modul von k6 hat eine Klasse &lt;code&gt;Stream&lt;/code&gt; mit &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;end&lt;/code&gt; und Event-Handlern, und ghz hat Optionen für Streaming-Intervalle und -Dauern. Messen Sie gesendete und empfangene Nachrichten ebenso wie die Latenz der Aufrufe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Braucht man die .proto-Datei, um einen gRPC-Dienst zu lasttesten?&lt;/strong&gt;
Nicht, wenn der Server Reflection aktiviert hat. k6 kann sich mit &lt;code&gt;reflect: true&lt;/code&gt; verbinden, und ghz greift auf Reflection zurück, wenn Sie weder &lt;code&gt;--proto&lt;/code&gt; noch &lt;code&gt;--protoset&lt;/code&gt; angeben. Ohne Reflection brauchen Sie die &lt;code&gt;.proto&lt;/code&gt;-Datei oder ein kompiliertes Protoset.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warum erscheinen meine gRPC-Fehler nicht als fehlgeschlagene Anfragen?&lt;/strong&gt;
Weil der HTTP-Status eines gRPC-Aufrufs auch bei einem Fehler 200 ist. Das Ergebnis steht im Trailer &lt;code&gt;grpc-status&lt;/code&gt;, prüfen Sie also diesen Wert in Ihrem Skript und zählen Sie jeden Code einzeln.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/websocket-load-testing-tools/&quot;&gt;WebSocket-Lasttest-Tools: sechs Optionen im Vergleich&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/how-to-load-test-a-graphql-api/&quot;&gt;GraphQL-API-Lasttest: ein praktischer Leitfaden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-k6/&quot;&gt;Gatling vs k6: JVM-Simulationen oder ein Go-Binary?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/http-benchmarking-tools/&quot;&gt;HTTP-Benchmark-Tools: wrk, hey, oha, ab und weitere&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Durchsatz vs. Latenz: wie sie unter Last zusammenhängen</title><link>https://loadtest.app/de/throughput-vs-latency/</link><guid isPermaLink="true">https://loadtest.app/de/throughput-vs-latency/</guid><description>Durchsatz vs. Latenz erklärt: was beide messen, warum JMeters Latency nicht die Antwortzeit ist und warum die Latenz am Kapazitätslimit steigt.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Durchsatz (Throughput) ist die Arbeit, die ein System pro Zeiteinheit erledigt, etwa Anfragen pro Sekunde. Latenz ist die Zeit, die eine einzelne Arbeitseinheit braucht, etwa 120 Millisekunden für eine Anfrage. Bei geringer Last beeinflussen sich beide kaum; nähert sich die Last der Kapazität des Systems, hört der Durchsatz auf zu steigen und die Latenz beginnt zu klettern, und genau diesen Punkt soll ein Lasttest finden.&lt;/p&gt;
&lt;p&gt;Das Rechenbeispiel unten ist reine Arithmetik ohne Testlauf dahinter. Die Definitionen der Tools stammen aus der Dokumentation der jeweiligen Projekte, geprüft am 16. Oktober 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Durchsatz&lt;/th&gt;
&lt;th&gt;Latenz&lt;/th&gt;
&lt;th&gt;Bandbreite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Beantwortete Frage&lt;/td&gt;
&lt;td&gt;Wie viel wird pro Sekunde fertig?&lt;/td&gt;
&lt;td&gt;Wie lange dauert eine Einheit?&lt;/td&gt;
&lt;td&gt;Wie viel könnte die Leitung tragen?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typische Einheit&lt;/td&gt;
&lt;td&gt;Anfragen oder Transaktionen pro Sekunde&lt;/td&gt;
&lt;td&gt;Millisekunden&lt;/td&gt;
&lt;td&gt;Megabit pro Sekunde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http_reqs&lt;/code&gt; (Anzahl und Rate)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http_req_duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;kein Testziel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In JMeter&lt;/td&gt;
&lt;td&gt;Throughput&lt;/td&gt;
&lt;td&gt;Elapsed time (und ein separates „Latency“)&lt;/td&gt;
&lt;td&gt;kein Testziel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was ist der Unterschied zwischen Durchsatz und Latenz?&lt;/h2&gt;
&lt;p&gt;Der Durchsatz zählt erledigte Arbeit über die Zeit; die Latenz misst die Zeit, die eine Arbeitseinheit braucht. Ein System kann eine niedrige Latenz und einen niedrigen Durchsatz haben oder einen hohen Durchsatz und eine hohe Latenz, deshalb brauchen Sie beide Zahlen, um es zu beschreiben.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://jmeter.apache.org/usermanual/glossary.html&quot;&gt;JMeter-Glossar&lt;/a&gt; berechnet den Durchsatz als Zahl der Anfragen geteilt durch die Gesamtzeit, vom Start der ersten Probe bis zum Ende der letzten, einschließlich der Pausen zwischen den Proben, weil er die Last auf dem Server darstellen soll (geprüft am 16. Oktober 2026). Damit ist der Durchsatz eine Eigenschaft des ganzen Laufs, während die Latenz zu jeder Anfrage gehört und am besten als Verteilung gelesen wird: Median, p95, p99.&lt;/p&gt;
&lt;h2&gt;Ist Bandbreite dasselbe wie Durchsatz?&lt;/h2&gt;
&lt;p&gt;Nein. Bandbreite ist die größte Datenmenge, die eine Netzwerkverbindung tragen könnte; Durchsatz ist das, was tatsächlich durchkommt. Im Lasttest meint Durchsatz meist erledigte Anfragen, und die Bandbreite zählt erst, wenn große Nutzlasten die Leitung füllen, bevor der Anwendung die Kapazität ausgeht.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://aws.amazon.com/compare/the-difference-between-throughput-and-latency/&quot;&gt;Vergleichsseite von AWS&lt;/a&gt; fasst die Netzwerksicht knapp: Latenz ist die Verzögerung in der Netzwerkkommunikation, Durchsatz die durchschnittliche Datenmenge, die über einen Zeitraum tatsächlich durchkommt, und Bandbreite das theoretische Maximum (geprüft am 16. Oktober 2026). Vieles, was Sie online dazu finden, meint diese Netzwerkbedeutung. Lasttests benutzen dieselben Wörter für Anfragen statt für Pakete, deshalb lohnt es sich zu sagen, welche Bedeutung ein Bericht meint.&lt;/p&gt;
&lt;h2&gt;Was bedeutet „Latenz“ in einem Lasttest-Tool?&lt;/h2&gt;
&lt;p&gt;Das hängt vom Tool ab. In JMeter ist Latency die Zeit bis zum ersten Teil der Antwort, die vollständige Antwortzeit heißt Elapsed time. In k6 umfasst &lt;code&gt;http_req_duration&lt;/code&gt; Senden, Warten und Empfangen, und die Zeit bis zum ersten Byte ist eine eigene Metrik.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://jmeter.apache.org/usermanual/glossary.html&quot;&gt;JMeter-Glossar&lt;/a&gt; misst die Elapsed time von kurz vor dem Senden der Anfrage bis kurz nach dem Empfang der letzten Antwort, die Latency dagegen bis kurz nach dem Empfang der ersten Antwort. Die &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;k6-Metrikreferenz&lt;/a&gt; definiert &lt;code&gt;http_req_duration&lt;/code&gt; als &lt;code&gt;http_req_sending + http_req_waiting + http_req_receiving&lt;/code&gt;, ohne DNS-Auflösung und Verbindungsaufbau, und nennt &lt;code&gt;http_req_waiting&lt;/code&gt; die Zeit bis zum ersten Byte (beides geprüft am 16. Oktober 2026). JMeters Latency entspricht also k6s &lt;code&gt;http_req_waiting&lt;/code&gt;, nicht &lt;code&gt;http_req_duration&lt;/code&gt;. Wer eine JMeter-„Latenz“ mit einer k6-„Duration“ vergleicht, sieht bei JMeter die bessere Zahl, ohne dass das System besser ist.&lt;/p&gt;
&lt;h2&gt;Wie verändern sich Durchsatz und Latenz, wenn die Last steigt?&lt;/h2&gt;
&lt;p&gt;Zuerst bedeutet mehr Last mehr Durchsatz, und die Latenz bleibt ungefähr gleich. Sobald das System seine Kapazität erreicht, wächst der Durchsatz nicht mehr, und jeder zusätzliche Benutzer fügt nur Wartezeit hinzu, also steigt die Latenz mit der Last.&lt;/p&gt;
&lt;p&gt;Ein Rechenbeispiel, reine Arithmetik. Ein Dienst schafft höchstens 200 Anfragen pro Sekunde und antwortet in 0,1 Sekunden, wenn er nicht ausgelastet ist. Jeder virtuelle Benutzer sendet eine Anfrage und pausiert dann 1 Sekunde. Bei einer festen Zahl von Benutzern verbindet die Form von Little&amp;#39;s Law für das geschlossene Modell die Größen: Benutzer = Anfragen pro Sekunde × (Latenz + Think Time), wie unser &lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Artikel zu Little&amp;#39;s Law&lt;/a&gt; Schritt für Schritt zeigt.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Virtuelle Benutzer&lt;/th&gt;
&lt;th&gt;Durchsatz (Anfragen/s)&lt;/th&gt;
&lt;th&gt;Latenz (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;Bis 220 Benutzer wächst der Durchsatz im Gleichschritt mit ihnen. Danach bleibt er bei 200 stehen, und die Latenz muss den Rest aufnehmen: 300 Benutzer brauchen 300 ÷ 200 = 1,5 Sekunden pro Durchlauf, also bleiben 0,5 Sekunden Latenz. Echte Systeme verlaufen typischerweise sanfter, weil sich Warteschlangen schon vor der genauen Grenze bilden. Mit einem Arrival-Rate-Test ist das Bild härter: Kommen mehr als 200 Anfragen pro Sekunde an, wächst der Rückstau, solange der Überschuss anhält; den Unterschied erklärt der Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs. geschlossenen Lastmodell&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Wie finden Sie den Knick in Ihren eigenen Ergebnissen?&lt;/h2&gt;
&lt;p&gt;Erhöhen Sie die Last in Stufen, halten Sie jede Stufe lange genug, damit sie sich einpendelt, und notieren Sie für jede Stufe den Durchsatz und ein Latenz-Perzentil. Der Knick ist die erste Stufe, auf der der Durchsatz nicht mehr mit der Last steigt, während die Latenz zu klettern beginnt.&lt;/p&gt;
&lt;p&gt;Einige Punkte machen diese Ablesung verlässlich:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Halten Sie jede Stufe einige Minuten, damit der Durchsatz auf einer stabilen Phase gemessen wird, nicht auf einer Rampe.&lt;/li&gt;
&lt;li&gt;Lesen Sie ein Perzentil, nicht nur den Durchschnitt; ein Durchschnitt kann ruhig bleiben, während die langsamsten paar Prozent der Anfragen deutlich langsamer werden.&lt;/li&gt;
&lt;li&gt;Prüfen Sie auf jeder Stufe die Fehler. Schnelle Fehlschläge zählen als erledigte Anfragen mit kurzen Zeiten, sodass ein fehlerhaftes System steigenden Durchsatz und sinkende Latenz zeigen kann.&lt;/li&gt;
&lt;li&gt;Beobachten Sie den Lastgenerator. Ist seine CPU ausgelastet, ist die gefundene Grenze womöglich seine eigene.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das &lt;a href=&quot;https://loadfocus.com/docs/de-de/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;Diagramm Antwortzeit gegen virtuelle Benutzer&lt;/a&gt; von LoadFocus zeigt die durchschnittliche und maximale Antwortzeit gegen die aktiven virtuellen Benutzer, ein Punkt pro erreichter Benutzerstufe; dort wird der Knick in einem gestuften Test sichtbar.&lt;/p&gt;
&lt;h2&gt;Lässt sich der Durchsatz steigern, ohne die Latenz zu erhöhen?&lt;/h2&gt;
&lt;p&gt;Manchmal. Mehr Kapazität verschiebt die Grenze, sodass die Latenz länger flach bleibt. Batching tauscht meist in die andere Richtung: Es erhöht den Durchsatz, indem einzelne Anfragen warten.&lt;/p&gt;
&lt;p&gt;Der Nagle-Algorithmus von TCP ist das klassische Beispiel für diesen Tausch. &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc896.html&quot;&gt;RFC 896&lt;/a&gt; hält neue Segmente zurück, solange frühere Daten auf der Verbindung noch nicht bestätigt sind, sodass das Netz weniger, vollere Pakete trägt und jeder kleine Schreibvorgang warten kann (geprüft am 16. Oktober 2026). Batching von Anfragen und Schreibpuffer funktionieren genauso: mehr pro Sekunde erledigt, mehr Zeit pro Element. Wenn Sie so etwas ändern, wiederholen Sie den gestuften Test und vergleichen Sie beide Kurven, nicht nur eine Zahl.&lt;/p&gt;
&lt;h2&gt;Welche der beiden gehört in Ihre Pass/Fail-Kriterien?&lt;/h2&gt;
&lt;p&gt;Beide, miteinander verknüpft. Ein Latenzziel sagt wenig ohne den Durchsatz, bei dem es gemessen wurde, und ein Durchsatzziel sagt wenig, wenn sich die Latenz dafür verdoppelt hat. Formulieren Sie sie als Paar, etwa p95 unter 300 Millisekunden bei 200 Anfragen pro Sekunde mit weniger als 1 % Fehlern.&lt;/p&gt;
&lt;p&gt;Unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests&lt;/a&gt; zeigt, wie Sie dieses Paar formulieren und automatisieren. Wartet Ihr Tool auf langsame Antworten, bevor es die nächste Anfrage sendet, können seine Latenzwerte das Problem untertreiben; &lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission&lt;/a&gt; erklärt, wie das passiert und wie Sie es vermeiden. Der &lt;a href=&quot;https://loadfocus.com/de-de/glossary/what-is-latency?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=throughput-vs-latency&quot;&gt;Glossareintrag von LoadFocus zur Latenz&lt;/a&gt; zeigt, woher Latenz kommt und warum Perzentile zählen.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Bedeutet niedrige Latenz einen hohen Durchsatz?&lt;/strong&gt;
Nicht unbedingt. Ein System kann jede Anfrage schnell beantworten, aber nur wenige gleichzeitig bearbeiten, oder viele gleichzeitig bearbeiten, während jede wartet. Sie wissen beides erst, wenn Sie beides unter derselben Last messen, am besten über mehrere Laststufen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Was ist der Unterschied zwischen Latenz und Antwortzeit?&lt;/strong&gt;
Im Alltag meinen beide oft dasselbe. In JMeter ist Latency die Zeit bis zum ersten Teil der Antwort und Elapsed time die vollständige Antwortzeit, prüfen Sie also, welche ein Bericht zeigt, bevor Sie Tools vergleichen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warum steigt der Durchsatz in einem Lasttest nicht mehr?&lt;/strong&gt;
Etwas hat seine Grenze erreicht: CPU, eine Datenbank, ein Verbindungspool, ein Rate Limit oder der Lastgenerator selbst. Ab diesem Punkt stehen zusätzliche Benutzer nur noch an, was sich als steigende Latenz bei flachem Durchsatz zeigt.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law im Lasttest: Tests dimensionieren und prüfen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission: was es ist und wie man es vermeidet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests: so legen Sie sie fest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/apdex-score/&quot;&gt;Apdex-Score: was er bedeutet und wie man ihn berechnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/amdahls-law/&quot;&gt;Amdahlsches Gesetz: Formel, Beispiele und Grenzen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs Locust: JVM-Simulationen oder Python-Locustfiles?</title><link>https://loadtest.app/de/gatling-vs-locust/</link><guid isPermaLink="true">https://loadtest.app/de/gatling-vs-locust/</guid><description>Gatling vs Locust im Vergleich: Lizenz, Laufzeit, Testcode, Lastmodell, Skalierung, Pass/Fail-Kriterien und Berichte, mit Hinweisen zur passenden Wahl.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Gatling und Locust sind beide kostenlose Open-Source-Tools, die Lasttests als Code in Ihrem Repository halten. Nehmen Sie Gatling, wenn Ihr Team auf der JVM arbeitet oder Sie offene und geschlossene Injektionsprofile, Assertions und einen HTML-Bericht in einem Paket wollen. Nehmen Sie Locust, wenn Ihr Team Python schreibt, eine Web-Oberfläche zum Starten und Beobachten eines Laufs schätzt und den verteilten Modus ohne kommerzielle Edition braucht.&lt;/p&gt;
&lt;p&gt;Die Fakten in diesem Vergleich Gatling vs Locust stammen aus der Dokumentation und den Repositories der beiden Projekte, geprüft am 13. Oktober 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;Lizenz&lt;/td&gt;
&lt;td&gt;Apache 2.0; gRPC, MQTT und GraphQL unter einer eigenen Komponentenlizenz (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laufzeit&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS 11 bis 25 (Version 3.16.0)&lt;/td&gt;
&lt;td&gt;Python 3.11 oder neuer (Version 2.46.7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testcode&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript oder TypeScript&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eingebaute Protokolle&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events, JMS&lt;/td&gt;
&lt;td&gt;HTTP und HTTPS; weitere über einen Python-Client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lastmodell&lt;/td&gt;
&lt;td&gt;Offene oder geschlossene Injektionsprofile&lt;/td&gt;
&lt;td&gt;Ein Pool von Benutzern, also ein geschlossenes Modell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass/Fail&lt;/td&gt;
&lt;td&gt;Assertions, nach dem Lauf ausgewertet&lt;/td&gt;
&lt;td&gt;Exit-Code 1 bei fehlgeschlagenen Anfragen oder ein eigener Listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berichte&lt;/td&gt;
&lt;td&gt;HTML-Bericht nach jedem Lauf&lt;/td&gt;
&lt;td&gt;Live-Diagramme in der Web-Oberfläche, CSV-Dateien, HTML-Bericht&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skalierung&lt;/td&gt;
&lt;td&gt;Gatling Enterprise&lt;/td&gt;
&lt;td&gt;Eingebauter Master mit Workern, Kubernetes-Operator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was ist der Unterschied zwischen Gatling und Locust?&lt;/h2&gt;
&lt;p&gt;Gatling führt Simulationen auf der JVM aus, Locust führt gewöhnliche Python-Programme aus. Gatling bringt ein Lastmodell und einen Bericht von Haus aus mit, bei Locust schreiben Sie die Testlogik selbst.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; von Gatling beschreibt eine nicht blockierende Engine auf Basis von Netty und ein SDK in fünf Sprachen: Java, Kotlin und Scala laufen über Maven, Gradle oder sbt, JavaScript und TypeScript über ein eigenes SDK. Die &lt;a href=&quot;https://docs.gatling.io/reference/deploy/install-local/&quot;&gt;Installationsseite&lt;/a&gt; verlangt ein 64-Bit-OpenJDK-LTS von 11 bis 25 und für das JavaScript-SDK Node.js 24 oder neuer.&lt;/p&gt;
&lt;p&gt;Die README von Locust nennt es eine Möglichkeit, skalierbare Lasttests in reinem Python zu schreiben, und die &lt;a href=&quot;https://raw.githubusercontent.com/locustio/locust/master/pyproject.toml&quot;&gt;Paketmetadaten&lt;/a&gt; verlangen Python 3.11 oder neuer. Die Seite &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; sagt, Locust sei ereignisbasiert auf gevent, sodass ein Prozess viele tausend gleichzeitige Benutzer bewältigen kann (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie schreibt man denselben Test in beiden Tools?&lt;/h2&gt;
&lt;p&gt;In Gatling verketten Sie Anfragen zu einem Szenario und geben ihm ein Injektionsprofil. In Locust schreiben Sie eine Benutzerklasse mit Tasks und einer Wartezeit dazwischen.&lt;/p&gt;
&lt;p&gt;Fünfzig gleichzeitige Benutzer rufen die Benutzerliste ab und pausieren danach ein bis drei Sekunden, fünf Minuten lang. In Gatlings Java-SDK (Imports weggelassen):&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;Derselbe Test in 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;Die &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;Referenz zur Injektion&lt;/a&gt; von Gatling nennt &lt;code&gt;constantConcurrentUsers&lt;/code&gt; unter den Schritten des geschlossenen Modells. Locust bekommt Benutzerzahl und Laufzeit als Flags (geprüft am 13. Oktober 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;Wie modellieren Gatling und Locust die Last?&lt;/h2&gt;
&lt;p&gt;Gatling bietet offene und geschlossene Modelle, je nachdem, welche Methode Sie aufrufen. Locust arbeitet mit einem Pool von Benutzern und damit mit einem geschlossenen Modell.&lt;/p&gt;
&lt;p&gt;Die Seite zu &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;Lastmodellen&lt;/a&gt; von Gatling definiert geschlossene Systeme als solche mit begrenzter Zahl gleichzeitiger Benutzer und offene Systeme als solche, in denen Benutzer weiter eintreffen, egal wie langsam die Anwendung antwortet. Die meisten Websites seien offen. &lt;code&gt;injectOpen&lt;/code&gt; nimmt Ankunftsraten, &lt;code&gt;injectClosed&lt;/code&gt; nimmt Zielwerte für die Gleichzeitigkeit.&lt;/p&gt;
&lt;p&gt;Im &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;Locustfile-Leitfaden&lt;/a&gt; steht, dass die Wartezeit den Durchsatz nur begrenzen kann und keine neuen Benutzer startet, um eine Zielrate zu erreichen. Dauert ein Durchlauf länger als die Wartezeit erlaubt, fällt die Rate unter den Zielwert (geprüft am 13. Oktober 2026). Warum das wichtig ist, erklärt unser Leitfaden zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Wie führt man einen Test aus, der größer ist als eine Maschine erzeugen kann?&lt;/h2&gt;
&lt;p&gt;Locust bringt den verteilten Modus mit. Die Open-Source-Edition von Gatling erzeugt Last von einer Maschine, verteilte Läufe brauchen Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;Locust startet einen Prozess mit &lt;code&gt;--master&lt;/code&gt; und beliebig viele Prozesse mit &lt;code&gt;--worker&lt;/code&gt;. Laut den &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;Docs zur verteilten Last&lt;/a&gt; nutzt ein Python-Prozess nicht mehr als einen Kern, daher läuft ein Worker pro Kern, und &lt;code&gt;--processes&lt;/code&gt; startet mehrere auf einer Maschine. Ein &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;Kubernetes-Operator&lt;/a&gt; verwaltet verteilte Läufe in einem Cluster.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.gatling.io/tutorials/faq/&quot;&gt;FAQ&lt;/a&gt; von Gatling sagt, die Community Edition unterstütze keine verteilten Tests, und die README beschreibt Enterprise als Betrieb auf verwalteten Lastgeneratoren oder privater Infrastruktur (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Es gibt einen Ausweg aus beiden. LoadFocus, der Herausgeber dieser Website, führt weder Gatling-Simulationen noch Locust-Tests aus. Wer keines von beiden im großen Maßstab betreiben möchte, kann dort &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-locust&quot;&gt;k6-Skripte&lt;/a&gt; und &lt;a href=&quot;https://loadfocus.com/de-de/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-locust&quot;&gt;JMeter-Testpläne&lt;/a&gt; aus 25 Cloud-Regionen laufen lassen. Der k6-Validator von LoadFocus warnt, dass Arrival-Rate-Szenarien dort mit einer festen Zahl von Benutzern laufen und deshalb keine Anfragerate halten. Der Umstieg von einem der beiden Tools bedeutet, den Test neu zu schreiben.&lt;/p&gt;
&lt;h2&gt;Wie entscheiden sie, ob ein Test bestanden ist, und welche Berichte gibt es?&lt;/h2&gt;
&lt;p&gt;Gatling wertet Assertions nach dem Lauf aus und schreibt jedes Mal einen HTML-Bericht. Locust beendet sich mit Exit-Code 1, wenn eine Anfrage fehlgeschlagen ist, und weitere Prüfungen ergänzen Sie als Listener.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;Assertions&lt;/a&gt; in Gatling werden nach der Simulation ausgewertet, und eine einzige fehlgeschlagene Assertion lässt die Simulation scheitern. Der &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;HTML-Bericht&lt;/a&gt; zeigt Perzentile der Antwortzeit, gestartete Benutzer pro Sekunde, gleichzeitige Benutzer und Anfragen pro Sekunde.&lt;/p&gt;
&lt;p&gt;Laut den &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;Headless-Docs&lt;/a&gt; von Locust endet der Lauf mit Exit-Code 1, wenn eine Stichprobe fehlgeschlagen ist, und ein Listener-Beispiel lässt den Lauf an Fehlerquote, durchschnittlicher Antwortzeit oder 95. Perzentil scheitern. Die &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;Konfigurationsreferenz&lt;/a&gt; nennt &lt;code&gt;--csv&lt;/code&gt; für Statistikdateien und &lt;code&gt;--html&lt;/code&gt; für einen Bericht (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welche Protokolle kann jedes Tool testen?&lt;/h2&gt;
&lt;p&gt;Gatling liefert mehr Protokolle mit, bei den neueren mit Grenzen. Locust liefert HTTP und HTTPS und erwartet für den Rest einen Python-Client.&lt;/p&gt;
&lt;p&gt;Die README von Gatling führt HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events und JMS unter Apache 2.0 ohne Limits auf. gRPC, MQTT und GraphQL fallen unter die Gatling Enterprise Component License, und Tests damit sind in der Community Edition auf 5 gleichzeitige Benutzer und 5 Minuten begrenzt.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;Seite zu anderen Systemen&lt;/a&gt; von Locust zeigt, wie man eine Protokollbibliothek einhüllt und jeden Aufruf meldet, mit Beispielen für gRPC und MQTT. Die Bibliothek muss mit gevent funktionieren, das I/O in kompiliertem C-Code nicht patchen kann, und locust-plugins ergänzt Benutzer für Kafka, Selenium und Playwright (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welches Tool sollten Sie wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie nach Sprache und danach, wie Sie das System belasten. Gatling passt zu JVM-Teams und Tests im offenen Modell, Locust zu Python-Teams und Tests mit eigener Logik.&lt;/p&gt;
&lt;p&gt;Wählen Sie Gatling statt Locust, wenn Ihr Team auf der JVM zu Hause ist und Tests in Java, Kotlin oder Scala mit Maven, Gradle oder sbt bauen will, wenn Sie ein offenes Modell wie eine feste Ankunftsrate brauchen, wenn Sie JMS oder Server-Sent Events benötigen oder wenn Sie Assertions und einen Bericht ohne zusätzlichen Code wollen.&lt;/p&gt;
&lt;p&gt;Wählen Sie Locust statt Gatling, wenn Ihr Team Python schreibt und Tests einen internen Python-Client wiederverwenden sollen, wenn Sie eine Web-Oberfläche wollen, um einen Lauf zu starten und die Last währenddessen zu ändern, wenn Sie den verteilten Modus im kostenlosen Tool brauchen oder wenn das System überwiegend wartende Benutzer sieht und es für Ihr Protokoll eine gevent-taugliche Python-Bibliothek gibt.&lt;/p&gt;
&lt;p&gt;Für einen GUI-Testbuilder lohnt ein Blick auf JMeter, für ein einzelnes Binary ohne JVM oder Python auf k6.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist Gatling schneller als Locust?&lt;/strong&gt;
Das haben wir nicht selbst gemessen, deshalb nennen wir keinen Sieger. Fair vergleichen lässt sich das nur mit demselben Szenario in beiden Tools auf Ihrer eigenen Hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann Locust Gatling-Simulationen ausführen?&lt;/strong&gt;
Nicht laut der Dokumentation von Locust, die Tests nur als Python-Code beschreibt. Eine Gatling-Simulation muss als Locustfile neu geschrieben werden, und umgekehrt gilt dasselbe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus Gatling- oder Locust-Tests ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter-Testpläne und k6-Skripte aus. Um eine Gatling-Simulation auf mehrere Maschinen zu verteilen, nutzen Sie Gatling Enterprise, bei Locust den Master-Worker-Modus oder den Kubernetes-Operator.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-load-testing/&quot;&gt;Gatling-Lasttests: das JVM-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-load-testing/&quot;&gt;Locust-Lasttests: das Python-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-k6/&quot;&gt;Gatling vs k6: JVM-Simulationen oder ein Go-Binary?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: Python-Skripte oder JMeter-Testpläne?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>JMeter vs Postman: welches Tool für Lasttests?</title><link>https://loadtest.app/de/jmeter-vs-postman/</link><guid isPermaLink="true">https://loadtest.app/de/jmeter-vs-postman/</guid><description>JMeter vs Postman für Lasttests: was virtuelle Benutzer, Cloud-Läufe und Preise von Postman leisten, wo die Grenzen liegen und wann JMeter besser passt.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Postman ist ein API-Client für funktionale Prüfungen, Collections und Teamarbeit, der nachträglich einen Performancetest-Modus bekommen hat. Apache JMeter ist von Anfang an ein Lastgenerator. Nehmen Sie Postman, wenn Sie die vorhandene Collection für einen schnellen Lasttest oder einen Smoke-Test in der CI wiederverwenden wollen. Nehmen Sie JMeter, wenn Lasttests die eigentliche Aufgabe sind: viele Protokolle, große Benutzerzahlen, ausführliche Berichte und verteilte Lasterzeugung.&lt;/p&gt;
&lt;p&gt;Die Fakten zu Postman stammen aus der Dokumentation und der Preisseite, die zu JMeter von der eigenen Website des Projekts, alle geprüft am 13. Oktober 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;Hauptzweck&lt;/td&gt;
&lt;td&gt;API-Client, funktionale Tests und Collections, mit Performance-Modus&lt;/td&gt;
&lt;td&gt;Last- und Performancetests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testdefinition&lt;/td&gt;
&lt;td&gt;Eine Collection aus Anfragen mit Skripten und &lt;code&gt;pm.test()&lt;/code&gt;-Assertions&lt;/td&gt;
&lt;td&gt;Ein Testplan, in einer GUI gebaut und als &lt;code&gt;.jmx&lt;/code&gt;-Datei gespeichert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtuelle Benutzer&lt;/td&gt;
&lt;td&gt;Jeder durchläuft die Collection in einer Schleife; lokale Läufe sind durch Ihren Rechner begrenzt&lt;/td&gt;
&lt;td&gt;Ein Java-Thread pro Benutzer in einer Thread Group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lastprofile&lt;/td&gt;
&lt;td&gt;Fixed, Ramp up, Spike und Peak&lt;/td&gt;
&lt;td&gt;Thread Groups mit Ramp-up-Phase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Woher die Last kommt&lt;/td&gt;
&lt;td&gt;Ihr Rechner oder CI-Runner, in bezahlten Tarifen Postmans Cloud&lt;/td&gt;
&lt;td&gt;Ihr Rechner oder Remote-JMeter-Server, die Sie selbst betreiben&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kosten der Last&lt;/td&gt;
&lt;td&gt;Lokale Läufe in allen Tarifen; Cloud-Läufe zu 0,04 $ pro Stunde und virtuellem Benutzer&lt;/td&gt;
&lt;td&gt;Kostenlos, Apache-2.0-Lizenz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass/Fail in der CI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;postman performance run&lt;/code&gt; mit &lt;code&gt;--pass-if&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CLI-Modus (&lt;code&gt;jmeter -n&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was leistet das Performance-Testing von Postman?&lt;/h2&gt;
&lt;p&gt;Es führt die Anfragen einer Collection mit mehreren virtuellen Benutzern parallel aus, für eine festgelegte Zahl von Minuten. Jeder Benutzer wiederholt die Anfragen der Reihe nach, und Ihre vorhandenen Skripte und Assertions laufen unter Last mit.&lt;/p&gt;
&lt;p&gt;Laut der &lt;a href=&quot;https://learning.postman.com/docs/tests-and-scripts/performance-testing/testing-api-performance&quot;&gt;Dokumentation zum Performance-Testing&lt;/a&gt; ist die Collection für Ihre funktionalen Tests zugleich Ihr Lasttest, ohne separates Skript oder eigene Sprache (geprüft am 13. Oktober 2026). Sie wählen Dauer und Zahl der virtuellen Benutzer und dann ein Profil: Fixed, Ramp up, Spike oder Peak, wie die &lt;a href=&quot;https://learning.postman.com/docs/tests-and-scripts/performance-testing/performance-test-configuration&quot;&gt;Konfigurationsseite&lt;/a&gt; beschreibt.&lt;/p&gt;
&lt;h2&gt;Wo liegen die Grenzen von Postman bei Lasttests?&lt;/h2&gt;
&lt;p&gt;Die wichtigste Grenze ist, woher die Last kommt. Ein lokaler Lauf ist durch den Rechner begrenzt, auf dem er läuft, und alles darüber hinaus braucht einen bezahlten Tarif.&lt;/p&gt;
&lt;p&gt;Für lokale Läufe sagt die Dokumentation von Postman, dass die Zahl der virtuellen Benutzer von den verfügbaren Systemressourcen und der verwendeten Collection abhängt, dass Pre-request- und Post-response-Skripte die Zahl simulierbarer Benutzer senken und dass der Lauf stoppt, wenn der Rechner seine Ressourcenschwelle überschreitet. Als erster Test werden 10 bis 20 virtuelle Benutzer vorgeschlagen (geprüft am 13. Oktober 2026). Darüber kann der Lastgenerator selbst Ihre Messwerte verfälschen, weshalb Postman auch die Spitzenwerte von CPU und Arbeitsspeicher des Testrechners ausweist.&lt;/p&gt;
&lt;p&gt;Die nächste Grenze sind Daten. CSV- und JSON-Dateien funktionieren laut derselben Konfigurationsseite nur bei lokalen Läufen, Datasets dagegen bei lokalen und Cloud-Läufen.&lt;/p&gt;
&lt;h2&gt;Was kostet Lasttesting mit Postman?&lt;/h2&gt;
&lt;p&gt;Lokale Performance-Läufe sind in jedem Tarif enthalten. Cloud-Läufe gibt es in bezahlten Tarifen und sie werden nutzungsabhängig in virtuellen Benutzerstunden abgerechnet.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://www.postman.com/pricing/&quot;&gt;Preisseite&lt;/a&gt; von Postman nennt unbegrenztes lokales Performance-Testing und Cloud-Performance-Testing zu 0,04 $ pro virtueller Benutzerstunde (geprüft am 13. Oktober 2026). Zu diesem Listenpreis sind 500 virtuelle Benutzer über eine Stunde 500 virtuelle Benutzerstunden, also 20 $, zusätzlich zur Tarifgebühr. Statische IP-Adressen, um Ziele hinter einer Firewall zu erreichen, gibt es nur im Enterprise-Tarif. Die Tarife selbst haben wir nicht bepreist, die aktuellen Gebühren pro Benutzer stehen auf der Seite.&lt;/p&gt;
&lt;h2&gt;Welche Protokolle lassen sich testen?&lt;/h2&gt;
&lt;p&gt;JMeter hat eine lange, dokumentierte Liste. Für Postman haben wir keine Liste der in Performance-Läufen unterstützten Protokolle gefunden und treffen deshalb keine Aussage dazu.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://jmeter.apache.org/&quot;&gt;Startseite&lt;/a&gt; von JMeter nennt HTTP und HTTPS, SOAP und REST, FTP, Datenbanken über JDBC, LDAP, JMS-Messaging, SMTP-, POP3- und IMAP-Mail, native Befehle und Shell-Skripte, TCP und Java-Objekte (geprüft am 13. Oktober 2026). Postman beherrscht in der App weitere Anfragetypen wie GraphQL, gRPC und WebSocket, aber das sagt nicht, welche davon unter Last laufen. Probieren Sie einen Typ aus, bevor Sie sich darauf verlassen.&lt;/p&gt;
&lt;h2&gt;Wie skaliert man über einen Rechner hinaus?&lt;/h2&gt;
&lt;p&gt;Postman skaliert über die eigene Cloud, JMeter über Server, die Sie selbst betreiben. Das Erste ist einfacher zu starten, das Zweite gibt Ihnen Kontrolle.&lt;/p&gt;
&lt;p&gt;In bezahlten Tarifen verteilen die Cloud-Läufe von Postman die Last auf verwaltete Worker, sodass ein einzelner Rechner den Test nicht mehr begrenzt. Der &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;Remote-Modus&lt;/a&gt; von JMeter lässt einen Client viele JMeter-Server steuern. Jeder Knoten braucht dieselbe JMeter-Version, einen Keystore für RMI über SSL, sofern Sie es nicht abschalten, und eine eigene Kopie aller Datendateien (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Für JMeter-Testpläne gibt es einen dritten Weg. LoadFocus, der Herausgeber dieser Website, &lt;a href=&quot;https://loadfocus.com/de-de/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=jmeter-vs-postman&quot;&gt;führt vorhandene JMeter-Testpläne&lt;/a&gt; aus 25 Cloud-Regionen aus. Sie laden die &lt;code&gt;.jmx&lt;/code&gt;-Datei hoch und legen virtuelle Benutzer, Dauer und Ramp-up fest, ganz ohne Remote-Server. LoadFocus führt nur JMeter und k6 aus, eine Postman-Collection also nicht.&lt;/p&gt;
&lt;h2&gt;Welches Tool sollten Sie wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie Postman statt JMeter für funktionale und Contract-Prüfungen, für ein Team, das Collections in einem Workspace teilt, und für einen schnellen Smoke-Lauf einer API, die Sie ohnehin testen. Wählen Sie JMeter, wenn Lasttests das Hauptziel sind oder wenn Sie mehrere Protokolle, große Benutzerzahlen oder Tests im eigenen Repository brauchen.&lt;/p&gt;
&lt;p&gt;Postman passt zu einem kurzen Check in der CI: &lt;code&gt;postman performance run&lt;/code&gt; endet mit einem Exit-Code ungleich null, wenn ein Schwellenwert wie das 95. Perzentil verfehlt wird, und lässt so den Build scheitern. JMeter ist die bessere Wahl für Last auf Datenbanken oder Messaging, für lange Soak-Tests und für das HTML-Dashboard mit APDEX- und Perzentil-Tabellen, das &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;seine Dokumentation&lt;/a&gt; beschreibt.&lt;/p&gt;
&lt;p&gt;Viele Teams nutzen beide: Postman, um die API-Prüfungen zu bauen und zu verifizieren, JMeter, um den kritischen Abläufen echte Last zu geben.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Kann Postman JMeter für Lasttests ersetzen?&lt;/strong&gt;
Für kleine Prüfungen von HTTP-APIs ja, denn die vorhandene Collection ist der Test. Bei hoher Parallelität, anderen Protokollen oder langen Läufen sprechen die dokumentierten Grenzen lokaler Läufe und die nutzungsabhängigen Preise der Cloud-Läufe für JMeter als sicherere Basis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann Postman eine JMeter-.jmx-Datei ausführen?&lt;/strong&gt;
In der Dokumentation haben wir nichts gefunden, was einen JMeter-Testplan importiert. Postman-Performancetests entstehen aus Collections, eine &lt;code&gt;.jmx&lt;/code&gt;-Datei müsste also neu aufgebaut werden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ist JMeter kostenlos?&lt;/strong&gt;
Ja. Die aktuelle Version auf der &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;Download-Seite&lt;/a&gt; ist 5.6.3 und braucht Java 8 oder neuer (geprüft am 13. Oktober 2026). Sie zahlen für die Rechner, die Last erzeugen, oder für einen Cloud-Dienst, der Ihre Pläne ausführt.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools: sechs Optionen im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: Tests als Code oder GUI-Testplan?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: Python-Skripte oder JMeter-Testpläne?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/apdex-score/&quot;&gt;Apdex-Score: was er bedeutet und wie man ihn berechnet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>k6 vs Locust: JavaScript-Skripte oder Python-Nutzer?</title><link>https://loadtest.app/de/k6-vs-locust/</link><guid isPermaLink="true">https://loadtest.app/de/k6-vs-locust/</guid><description>k6 vs Locust im Vergleich: Lizenz, Skriptsprache, Lastmodelle, Pass/Fail-Kriterien, Protokolle und Skalierung, mit Hinweisen, wann welches Tool passt.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;k6 und Locust sind beide Open-Source-Tools, die einen Lasttest als Code in Ihrem Repository halten, und mit beiden lässt sich eine HTTP-API gut unter Last testen. Nehmen Sie Locust, wenn Ihr Team Python schreibt und die Testlogik in reinem Python haben möchte. Nehmen Sie k6, wenn Sie JavaScript schreiben, Schwellenwerte für Pass/Fail eingebaut haben wollen oder einen Test brauchen, der eine Ankunftsrate hält.&lt;/p&gt;
&lt;p&gt;Die Angaben in diesem Vergleich von k6 und Locust stammen aus der Dokumentation und dem Repository des jeweiligen Projekts, geprüft am 13. Oktober 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;Lizenz&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laufzeit&lt;/td&gt;
&lt;td&gt;Ein Go-Binary mit eingebetteter JavaScript-Engine (Release v2.3.0)&lt;/td&gt;
&lt;td&gt;Python 3.11 oder neuer (Release 2.46.7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testskripte&lt;/td&gt;
&lt;td&gt;JavaScript oder TypeScript, bei dem die Typen entfernt werden&lt;/td&gt;
&lt;td&gt;Python-Klassen in einem Locustfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eingebaute Protokolle&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSockets, gRPC&lt;/td&gt;
&lt;td&gt;HTTP und HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lastmodell&lt;/td&gt;
&lt;td&gt;Sechs Executors, davon zwei Arrival-Rate (offenes Modell)&lt;/td&gt;
&lt;td&gt;Ein Pool von Nutzern, die jeweils eine Wartezeit einlegen (geschlossenes Modell)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass/Fail&lt;/td&gt;
&lt;td&gt;Schwellenwerte, die einen Lauf vorzeitig abbrechen können&lt;/td&gt;
&lt;td&gt;Exit-Code 1 bei fehlgeschlagenen Anfragen; weitere Grenzen per Listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browsertests&lt;/td&gt;
&lt;td&gt;Eingebautes Browser-Modul&lt;/td&gt;
&lt;td&gt;Browser-Nutzer über das separate Projekt &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;Skalierung&lt;/td&gt;
&lt;td&gt;k6-operator auf Kubernetes oder Grafana Cloud k6&lt;/td&gt;
&lt;td&gt;Master und Worker, ein Kubernetes-Operator oder Azure Load Testing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was ist der Unterschied zwischen k6 und Locust?&lt;/h2&gt;
&lt;p&gt;Der Hauptunterschied ist die Sprache, in der Sie Tests schreiben. k6 führt JavaScript in einem kompilierten Go-Programm aus, während Locust Ihren Python-Code ausführt und für viele gleichzeitige Nutzer auf gevent aufbaut.&lt;/p&gt;
&lt;p&gt;k6 wird als &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;Paket oder eigenständiges Binary&lt;/a&gt; ohne weitere Laufzeit installiert. Es führt auch &lt;code&gt;.ts&lt;/code&gt;-Dateien aus, doch seine &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/javascript-typescript-compatibility-mode/&quot;&gt;TypeScript-Unterstützung&lt;/a&gt; entfernt die Typen, ohne sie zu prüfen. Locust installieren Sie mit &lt;code&gt;pip install locust&lt;/code&gt;, und laut der Seite &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; sind Tests gewöhnlicher Python-Code, den Sie wie jeden anderen Code in der Versionsverwaltung halten (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie schreibt man denselben Test in beiden Tools?&lt;/h2&gt;
&lt;p&gt;Beide drücken den Test als kurzes Programm aus. Hier ein Test mit 50 Nutzern über fünf Minuten, der fehlschlägt, wenn das 95. Perzentil über 500 ms liegt oder mehr als 1 % der Anfragen scheitern.&lt;/p&gt;
&lt;p&gt;In k6 gehören die Ziele zum Skript, als &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;Schwellenwerte&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;In Locust ist der Nutzer eine Klasse, und dieselben Ziele stehen in einem Listener, nach dem Muster aus den &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;Docs zum Headless-Modus&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;Gestartet werden sie mit &lt;code&gt;k6 run script.js&lt;/code&gt; und &lt;code&gt;locust -f locustfile.py --headless -u 50 -r 10 -t 5m --host https://staging.example.com&lt;/code&gt; (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie modellieren k6 und Locust die Last?&lt;/h2&gt;
&lt;p&gt;k6 unterstützt beide Lastmodelle, während Locust die Last als feste Zahl von Nutzern beschreibt. In k6 wählen Sie das Modell über den Executor, in Locust über Nutzerzahl und Wartezeit.&lt;/p&gt;
&lt;p&gt;k6 hat &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;sechs Executors&lt;/a&gt;. Vier davon sind geschlossen: Ein virtueller Benutzer startet seine nächste Iteration erst, wenn die letzte beendet ist. Die zwei Arrival-Rate-Executors folgen dem &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;offenen Modell&lt;/a&gt;, in dem Iterationen unabhängig davon starten, wie lange frühere dauern. Der &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;Locustfile-Leitfaden&lt;/a&gt; sagt, dass die Wartezeit den Durchsatz nur begrenzen und keine neuen Nutzer starten kann, um eine Zielrate zu erreichen (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Lautet Ihr Ziel &amp;quot;300 Anfragen pro Sekunde, egal wie die Antwortzeit ausfällt&amp;quot;, kann k6 das direkt ausdrücken. Unser Leitfaden zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen und geschlossenen Lastmodell&lt;/a&gt; erklärt, wann welches Modell passt.&lt;/p&gt;
&lt;h2&gt;Wie entscheiden k6 und Locust, ob ein Test bestanden ist?&lt;/h2&gt;
&lt;p&gt;k6 hat Pass/Fail-Kriterien als Kernfunktion, Locust überlässt das meiste Ihrem Code. Ein verletzter k6-Schwellenwert beendet den Lauf mit einem Exit-Code ungleich null, und &lt;code&gt;abortOnFail&lt;/code&gt; stoppt den Test in dem Moment, in dem er scheitert.&lt;/p&gt;
&lt;p&gt;Locust beendet sich mit Exit-Code 1, wenn eine Anfrage fehlgeschlagen ist. Für Grenzen bei der Fehlerquote, dem Durchschnitt oder dem 95. Perzentil zeigen die Docs einen Listener wie den oben, der den Exit-Code selbst setzt (geprüft am 13. Oktober 2026). Unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests&lt;/a&gt; hilft bei der Wahl der Grenzen.&lt;/p&gt;
&lt;h2&gt;Welche Protokolle deckt jedes Tool ab?&lt;/h2&gt;
&lt;p&gt;k6 liefert vier Protokolle und ein Browser-Modul mit, Locust liefert HTTP und HTTPS mit und lässt Sie jeden Python-Client für den Rest einbinden.&lt;/p&gt;
&lt;p&gt;k6 nennt HTTP/1.1, HTTP/2, WebSockets und gRPC als &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;eingebaute Protokolle&lt;/a&gt;, weitere über xk6-Erweiterungen, dazu ein &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6-browser/&quot;&gt;Browser-Modul&lt;/a&gt;, das einen Chromium-basierten Browser steuert. Laut Locusts Seite zu &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;anderen Systemen&lt;/a&gt; bringt es eingebaute Unterstützung nur für HTTP/HTTPS mit, lässt sich aber erweitern, um fast jedes System zu testen: Man umhüllt eine Protokollbibliothek und meldet jeden Aufruf als Anfrage. Die Bibliothek muss mit gevent zusammenarbeiten (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie fährt man einen größeren Test, als eine Maschine erzeugen kann?&lt;/h2&gt;
&lt;p&gt;Locust skaliert mit einem Master und Workern, k6 mit einem Kubernetes-Operator oder einem gehosteten Dienst. Beide können einen Test auf viele Maschinen verteilen.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;Docs zum verteilten Betrieb&lt;/a&gt; von Locust sagen, ein Prozess schaffe bei einem einfachen Testplan mehr als tausend Anfragen pro Sekunde; größere Tests laufen daher mit einem Worker pro Prozessorkern auf so vielen Maschinen wie nötig. Der &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; verteilt einen Test auf mehrere k6-Instanzen in einem Kubernetes-Cluster, und Grafana Cloud k6 ist der gehostete Weg (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Für k6-Skripte gibt es einen dritten Weg. LoadFocus, der Herausgeber dieser Seite, &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=k6-vs-locust&quot;&gt;führt k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen aus, wobei Nutzer und Dauer aus den Einstellungen des Tests stammen. Der Skript-Validator warnt, dass Arrival-Rate-Szenarien dort mit einer festen Zahl von Nutzern laufen; ein Skript im offenen Modell hält seine Ankunftsrate bei LoadFocus also nicht. LoadFocus führt Locust nicht aus: Es führt nur k6-Skripte und JMeter-Testpläne aus.&lt;/p&gt;
&lt;h2&gt;Welche Berichte erhält man?&lt;/h2&gt;
&lt;p&gt;k6 gibt eine Zusammenfassung am Ende des Tests aus und kann aus seinem Web-Dashboard einen HTML-Bericht exportieren. Locust zeigt Live-Diagramme in der Web-UI und schreibt auf Wunsch Dateien.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/end-of-test/&quot;&gt;Zusammenfassung am Testende&lt;/a&gt; von k6 erscheint im Terminal, und das &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/web-dashboard/&quot;&gt;Web-Dashboard&lt;/a&gt; exportiert einen eigenständigen HTML-Bericht, wenn Sie &lt;code&gt;K6_WEB_DASHBOARD_EXPORT&lt;/code&gt; setzen. Locust stellt eine Web-UI auf Port 8089 mit Live-Diagrammen bereit, und die &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;Konfigurationsreferenz&lt;/a&gt; führt die Ausgaben &lt;code&gt;--csv&lt;/code&gt;, &lt;code&gt;--html&lt;/code&gt; und &lt;code&gt;--json&lt;/code&gt; auf (geprüft am 13. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welches Tool sollten Sie wählen?&lt;/h2&gt;
&lt;p&gt;Locust passt zu Python-Teams, k6 zu Teams, die eingebaute Schwellenwerte und ein offenes Lastmodell wollen. Protokolle und Skalierung entscheiden die meisten übrigen Fälle.&lt;/p&gt;
&lt;p&gt;Wählen Sie Locust statt k6, wenn Ihr Team Python schreibt und Schleifen, Verzweigungen, generierte Daten und einen eigenen API-Client in reinem Python haben möchte, wenn Sie Python-Bibliotheken für ein Protokoll wiederverwenden wollen oder wenn Sie eine Web-UI mit Live-Diagrammen nutzen möchten, um ein System zu erkunden. Wählen Sie k6 statt Locust, wenn Ihr Team JavaScript oder TypeScript schreibt, wenn Schwellenwerte einen CI-Build scheitern lassen und einen schlechten Lauf früh stoppen sollen, wenn Sie eine konstante Ankunftsrate brauchen oder wenn gRPC und Browsertests im selben Tool liegen sollen.&lt;/p&gt;
&lt;p&gt;Einen breiteren Blick bietet unser Überblick über &lt;a href=&quot;https://loadtest.app/de/locust-load-testing/&quot;&gt;Locust-Lasttests&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist Locust schneller als k6?&lt;/strong&gt;
Wir haben das nicht selbst gemessen, also nennen wir keinen Sieger. Der faire Test ist dasselbe Szenario mit beiden Tools auf Ihrer eigenen Hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann Locust k6-Skripte ausführen?&lt;/strong&gt;
Laut den Locust-Docs nicht, sie beschreiben Tests als Python-Code in einem Locustfile. Ein k6-Skript ist JavaScript und muss daher als Python-Nutzerklasse neu geschrieben werden; aus den Schwellenwerten wird ein Listener.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus Locust-Tests ausführen?&lt;/strong&gt;
Nein. LoadFocus führt k6-Skripte und JMeter-Testpläne aus. Um einen Locust-Test zu skalieren, nutzen Sie dessen Master-Worker-Betrieb, den Kubernetes-Operator oder Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-load-testing/&quot;&gt;Locust-Lasttests: das Python-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: Python-Skripte oder JMeter-Testpläne?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-k6/&quot;&gt;Gatling vs k6: JVM-Simulationen oder ein Go-Binary?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery: welches Lasttest-Tool passt zu Ihrem Team?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs. geschlossenes Lastmodell: welches sollten Sie verwenden?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/azure-load-testing/&quot;&gt;Azure Load Testing: der Microsoft-Dienst im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Coordinated Omission: was es ist und wie man es vermeidet</title><link>https://loadtest.app/de/coordinated-omission/</link><guid isPermaLink="true">https://loadtest.app/de/coordinated-omission/</guid><description>Coordinated Omission erklärt: warum ein Lastgenerator, der auf langsame Antworten wartet, sie verbirgt, und wie wrk2, k6, Gatling und JMeter das vermeiden.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Coordinated Omission ist ein Messfehler: Ein Lastgenerator wartet auf jede langsame Antwort, bevor er die nächste Anfrage sendet, schickt also gerade dann weniger, wenn das System langsam ist, und erfasst zu wenige der schlechten Momente. Die Perzentile, die Sie danach ablesen, sehen deshalb besser aus als das, was die Nutzer erlebt haben. Sie vermeiden ihn, indem Sie Anfragen nach einem Zeitplan senden, der Antwortzeiten ignoriert, und jede Anfrage ab dem Moment messen, zu dem sie hätte rausgehen sollen.&lt;/p&gt;
&lt;p&gt;Die Fakten zu den Tools stammen aus der Dokumentation oder dem Repository des jeweiligen Projekts, geprüft am 9. Oktober 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Was es bietet&lt;/th&gt;
&lt;th&gt;Was Sie prüfen sollten&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;Konstante Rate (&lt;code&gt;-R&lt;/code&gt;), Latenz ab dem geplanten Sendezeitpunkt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--u_latency&lt;/code&gt; zeigt zusätzlich die unkorrigierte Sicht&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HdrHistogram&lt;/td&gt;
&lt;td&gt;Zwei Methoden, die fehlende Messwerte auffüllen&lt;/td&gt;
&lt;td&gt;Nur eine davon anwenden, nie beide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;Arrival-Rate-Executors&lt;/td&gt;
&lt;td&gt;Den Zähler &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;&lt;code&gt;injectOpen&lt;/code&gt;-Schritte wie &lt;code&gt;constantUsersPerSec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Die Schritte stehen in &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; taktet jeden Nutzer&lt;/td&gt;
&lt;td&gt;Die erreichte Rate im Vergleich zum Ziel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Open Model Thread Group (ab 5.5, experimentell)&lt;/td&gt;
&lt;td&gt;Eine normale Thread Group ist ein geschlossener Pool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was ist Coordinated Omission?&lt;/h2&gt;
&lt;p&gt;Der Fehler entsteht, wenn die messende Seite keine Messwerte mehr erfasst, weil das System langsam ist, sodass genau die langsamen Messwerte fehlen. Zufällig verlorene Messwerte verschieben ein Perzentil kaum; gehen sie im Gleichschritt mit einer Verlangsamung verloren, verzerrt das alle Perzentile.&lt;/p&gt;
&lt;p&gt;Der Name stammt von Gil Tene, dessen &lt;a href=&quot;https://groups.google.com/g/mechanical-sympathy/c/icNZJejUHfE&quot;&gt;Beitrag auf einer Mailingliste von 2013&lt;/a&gt; genau diese Grenze zieht. Er ist der ursprüngliche Autor von &lt;a href=&quot;https://hdrhistogram.github.io/HdrHistogram/&quot;&gt;HdrHistogram&lt;/a&gt;, wrk2 liegt in seinem GitHub-Konto, und die Dokumentation beider Projekte erklärt den Effekt (geprüft am 9. Oktober 2026). Die k6-Dokumentation verwendet den Begriff für ein geschlossenes Lastmodell, das seine eigene Last drosselt, eine häufige Ursache. Unser Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; behandelt diese Wahl, hier geht es um die Messung.&lt;/p&gt;
&lt;h2&gt;Wie verbirgt ein Lasttest langsame Antworten?&lt;/h2&gt;
&lt;p&gt;Ein Generator mit geschlossener Schleife sendet die nächste Anfrage auf einer Verbindung erst, wenn die vorherige Antwort da ist. Dauert eine Antwort eine Sekunde, sendet diese Verbindung eine Sekunde lang nichts, und die Anfragen, die sie in dieser Zeit gesendet hätte, bekommen nie eine Antwortzeit.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;README von wrk2&lt;/a&gt; sagt das über das Modell von wrk, das jede Anfrage vom ersten gesendeten Byte bis zur vollständigen Antwort misst: Weil eine Verbindung erst nach einer Antwort sendet, stimmt sich der Generator mit dem Server ab und misst in Phasen hoher Latenz nicht (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/HdrHistogram/HdrHistogram&quot;&gt;README von HdrHistogram&lt;/a&gt; bietet ein Gedankenexperiment. Ein System, das alle 10 ms gemessen wird, antwortet 100 Sekunden lang in 1 ms und hängt dann 100 Sekunden lang, wobei ein einziger Messwert von 100 Sekunden entsteht. Das Roh-Histogramm zeigt etwa 99,99 % der Ergebnisse bei 1 ms oder darunter; korrigiert um die blockierten Messwerte ist es nur etwa die Hälfte.&lt;/p&gt;
&lt;h2&gt;Woran erkennen Sie Coordinated Omission in Ihren Ergebnissen?&lt;/h2&gt;
&lt;p&gt;Vergleichen Sie die gesendete Rate mit der geplanten. Ist die Anfragerate gefallen, während die Antwortzeiten stiegen, hat der Generator zurückgesteckt, und die langsame Phase ist unterrepräsentiert.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Die Last war als Nutzer oder Verbindungen ohne Rate definiert.&lt;/strong&gt; Jede geschlossene Schleife kann den Fehler auslösen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Die Anfragerate sinkt dort, wo die Antwortzeiten steigen.&lt;/strong&gt; Ein Einbruch der Rate während einer Spitze heißt, dass Anfragen nie gesendet wurden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Das Maximum stellt das 99. Perzentil weit in den Schatten.&lt;/strong&gt; Ein paar riesige Messwerte zwischen Tausenden schnellen sind das Beispiel oben im Kleinen. Lesen Sie die gesamte &lt;a href=&quot;https://loadfocus.com/docs/de-de/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;Antwortzeitverteilung&lt;/a&gt; und denken Sie daran, dass sie nur gesendete Anfragen zählt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dem Lastgenerator fehlte CPU.&lt;/strong&gt; LoadFocus dokumentiert, dass eine Engine nahe 100 % CPU nicht mit der eingestellten Rate senden kann, und die Ergebnisse zeigen eine Warnung zur &lt;a href=&quot;https://loadfocus.com/docs/de-de/guides/load-testing/load-generator-saturation?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;Sättigung des Lastgenerators&lt;/a&gt;, wenn eine Engine in der Spitze 80 % CPU oder mehr erreicht hat.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wie vermeidet wrk2 Coordinated Omission?&lt;/h2&gt;
&lt;p&gt;Es sendet mit konstanter Rate und misst jede Anfrage ab dem Zeitpunkt, zu dem sie laut Plan hätte rausgehen sollen. Eine Anfrage, die zu spät losgeht, weil ihre Verbindung belegt war, bekommt die Wartezeit angerechnet.&lt;/p&gt;
&lt;p&gt;wrk2 ergänzt wrk um ein Raten-Argument (&lt;code&gt;-R&lt;/code&gt;, Anfragen pro Sekunde insgesamt) und erfasst Latenzen in einem HdrHistogram. &lt;code&gt;--u_latency&lt;/code&gt; fügt dem Bericht das unkorrigierte Histogramm hinzu, markiert mit CO, wie im Beispiel aus dem 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;Im zweiten Beispiel des README machte eine Serverpause von 1,4 Sekunden während eines 30-Sekunden-Laufs das korrigierte 99. Perzentil 200-mal so groß wie das unkorrigierte. Das README nennt das Projekt außerdem experimentell und warnt, dass Läufe unter 10 bis 20 Sekunden womöglich nichts Brauchbares liefern (geprüft am 9. Oktober 2026). Unser &lt;a href=&quot;https://loadtest.app/de/http-benchmarking-tools/&quot;&gt;Überblick über HTTP-Benchmark-Tools&lt;/a&gt; vergleicht wrk2 mit hey, oha und weiteren Tools.&lt;/p&gt;
&lt;h2&gt;Wie korrigiert HdrHistogram aufgezeichnete Latenzen?&lt;/h2&gt;
&lt;p&gt;Wenn Sie das Intervall kennen, in dem Anfragen rausgehen sollten, ergänzt es die Messwerte, die eine lange Antwort blockiert hat. Die Korrektur geht beim Aufzeichnen oder nachträglich an einer Kopie.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;recordValueWithExpectedInterval&lt;/code&gt; zeichnet einen Wert auf und fügt, wenn er das Intervall übersteigt, Werte hinzu, die in Schritten dieses Intervalls kleiner werden. &lt;code&gt;copyCorrectedForCoordinatedOmission&lt;/code&gt; liefert eine korrigierte Kopie eines fertigen Histogramms. Das &lt;a href=&quot;https://hdrhistogram.github.io/HdrHistogram/JavaDoc/org/HdrHistogram/AbstractHistogram.html&quot;&gt;JavaDoc&lt;/a&gt; nennt die beiden Methoden gegenseitig ausschließend (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// geplantes Intervall: 10 ms, Werte in Mikrosekunden
Histogram h = new Histogram(3);
h.recordValueWithExpectedInterval(latencyUs, 10_000);

// oder nach dem Lauf, an einem Roh-Histogramm:
Histogram fixed = raw.copyCorrectedForCoordinatedOmission(10_000);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Korrektur ist nur so gut wie das Intervall, das Sie übergeben. Sie passt also zu einem Generator, der in gleichmäßigem Takt senden sollte.&lt;/p&gt;
&lt;h2&gt;Wie gehen k6, Gatling, Locust und JMeter damit um?&lt;/h2&gt;
&lt;p&gt;k6, Gatling und JMeter können Arbeit nach einem Zeitplan starten, der nicht auf Antworten wartet. Locust taktet jeden Nutzer, kann aber keine zusätzlichen Nutzer starten, um eine Rate zu halten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6.&lt;/strong&gt; In den Arrival-Rate-Executors &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;starten Iterationen unabhängig von der Antwort des Systems&lt;/a&gt;, solange ein virtueller Benutzer frei ist. Ist keiner frei, überspringt k6 die Iteration und zählt sie in &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;, was spät im Test heißen kann, dass das System nachlässt (geprüft am 9. Oktober 2026). Eine verworfene Iteration hat keine Antwortzeit, also lesen Sie diesen Zähler neben den Perzentilen. Auf LoadFocus laufen Arrival-Rate-Szenarien von &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;k6-Skripten&lt;/a&gt; mit einer festen Zahl von Nutzern, also als geschlossenes Modell. Führen Sie k6 selbst aus, wenn es gerade um die Ankunftsrate geht.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; Schritte wie &lt;code&gt;constantUsersPerSec&lt;/code&gt; innerhalb von &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; starten neue virtuelle Benutzer mit fester Rate, ganz gleich, ob frühere schon fertig sind (geprüft am 9. Oktober 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; passt die Wartezeit jedes Nutzers so an, dass er eine Task höchstens eine bestimmte Zahl von Malen pro Sekunde ausführt. Laut Dokumentation kann die Wartezeit die Rate nur begrenzen und keine neuen Nutzer starten, und die &lt;a href=&quot;https://docs.locust.io/en/stable/api.html&quot;&gt;API-Referenz&lt;/a&gt; ergänzt, dass nach einer Task, die ihr Intervall überzieht, keine Wartezeit folgt. Eine langsame Antwort verzögert diesen Nutzer also trotzdem (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Eine &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; ist ein Pool von Threads in Schleifen, also eine geschlossene Schleife. JMeter 5.5 brachte die experimentelle &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;, die einem Zeitplan wie &lt;code&gt;rate(1/sec) random_arrivals(2 min)&lt;/code&gt; folgt und laut &lt;a href=&quot;https://jmeter.apache.org/changes_history.html&quot;&gt;Versionshinweisen&lt;/a&gt; bei Bedarf Threads erzeugt (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Beseitigt ein offenes Lastmodell Coordinated Omission?&lt;/h2&gt;
&lt;p&gt;Es beseitigt die Hauptursache, einen Generator, der vor dem Senden wartet. Zwei Lücken bleiben: Ein Generator, dem Nutzer oder CPU fehlen, fällt trotzdem hinter seinen Zeitplan zurück, und jeder Nutzer in einer mehrstufigen Nutzerreise wartet weiter auf seine eigenen Antworten.&lt;/p&gt;
&lt;p&gt;Die erste Lücke zeigt sich als verworfene Iterationen oder als ausgelastete Engine; beides ist ein Grund, mit mehr Reserve neu zu testen. Die zweite steckt in den meisten HTTP-Tests: Das README von wrk2 hält fest, dass Senden ohne Warten nur bei nicht blockierenden Protokollen oder einer Anfrage pro Verbindung funktioniert, und deshalb korrigiert wrk2 stattdessen die Zeitmessung.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Von wem stammt der Begriff Coordinated Omission?&lt;/strong&gt;
Gil Tene, der ursprüngliche Autor von HdrHistogram, dessen wrk2-Fork von wrk darauf ausgelegt ist, den Fehler zu vermeiden. Sein Beitrag von 2013 auf der Mailingliste mechanical-sympathy beschreibt ihn als ein Problem, das er so nennt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ist Coordinated Omission dasselbe wie ein geschlossenes Lastmodell?&lt;/strong&gt;
Die beiden hängen zusammen. Ein geschlossenes Modell ist eine häufige Ursache, weil jeder virtuelle Benutzer auf seine Antwort wartet, bevor er erneut sendet, und das README von wrk2 findet den Effekt auch in Monitoring-Code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sollte man jedes Latenz-Histogramm dafür korrigieren?&lt;/strong&gt;
Nur wenn Sie das Intervall kennen, in dem Anfragen geplant waren, denn HdrHistogram braucht es, um die fehlenden Messwerte aufzufüllen. Wenden Sie auf einen Datensatz eine der beiden Korrekturmethoden an, nie beide.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/http-benchmarking-tools/&quot;&gt;HTTP-Benchmark-Tools: wrk, hey, oha, ab und weitere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests: so legen Sie sie fest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/ycsb/&quot;&gt;YCSB: Workloads A-F, Ausführung und Grenzen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling-Lasttests: das JVM-Tool im Überblick</title><link>https://loadtest.app/de/gatling-load-testing/</link><guid isPermaLink="true">https://loadtest.app/de/gatling-load-testing/</guid><description>Lasttests mit Gatling im Überblick: Simulationen, offene und geschlossene Injektion, Checks, Assertions, HTML-Berichte, Build-Plugins, CI und Grenzen.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Gatling ist ein kostenloses Lasttest-Tool unter Apache-2.0-Lizenz, in dem jeder Test eine als Code geschriebene Simulation ist, die auf der JVM läuft und nach jedem Lauf einen HTML-Bericht liefert. Ein Gatling-Lasttest passt zu Entwicklerteams, die Tests im Repository, offene oder geschlossene Lastmodelle und Assertions wollen, die den Build scheitern lassen. Wer einen grafischen Test-Builder oder viele Protokolle braucht, ist mit JMeter besser bedient, und wer ein einzelnes Binary ohne JVM möchte, mit k6.&lt;/p&gt;
&lt;p&gt;Wir haben Gatling für dieses Review nicht selbst ausgeführt. Die Fakten stammen aus der Dokumentation, dem Repository und den Release-Seiten von Gatling, geprüft am 9. Oktober 2026; die Einschätzungen sind unsere eigenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thema&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;Lizenz&lt;/td&gt;
&lt;td&gt;Apache 2.0, außer den Plugins für gRPC, MQTT und GraphQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laufzeit&lt;/td&gt;
&lt;td&gt;JVM, 64-Bit-OpenJDK-LTS 11 bis 25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aktuelle Version&lt;/td&gt;
&lt;td&gt;3.16.0 (29. September 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests in&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript, TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eingebaute Protokolle&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;Ergebnisse&lt;/td&gt;
&lt;td&gt;Statischer HTML-Bericht pro Lauf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build und CI&lt;/td&gt;
&lt;td&gt;Plugins für Maven, Gradle, sbt und npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skalierung&lt;/td&gt;
&lt;td&gt;Gatling Enterprise (kommerziell)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Wer entwickelt Gatling, und wird es noch gepflegt?&lt;/h2&gt;
&lt;p&gt;Gatling Corp, ein französisches Unternehmen, entwickelt Gatling und hält das Urheberrecht daran. Das Projekt wird aktiv gepflegt: 2026 sind bisher drei JVM-Versionen erschienen.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.gatling.io/project/licenses/project-licenses/&quot;&gt;Lizenzseite&lt;/a&gt; weist Gatling Corp das Urheberrecht zu. &lt;a href=&quot;https://repo1.maven.org/maven2/io/gatling/gatling-core/&quot;&gt;Maven Central&lt;/a&gt; führt 3.15.0 im Februar, 3.15.1 im Mai und 3.16.0 am 29. September 2026, und das JavaScript-SDK erreichte am 6. Oktober &lt;a href=&quot;https://github.com/gatling/gatling-js/releases/tag/v3.16.1&quot;&gt;Version 3.16.1&lt;/a&gt;. Die &lt;a href=&quot;https://docs.gatling.io/release-notes/gatling/whats-new/3.16/&quot;&gt;Release Notes zu 3.16&lt;/a&gt; bringen GraphQL und gemeinsame Queues zwischen virtuellen Benutzern. Das &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; nennt das Repository die Community Edition, frei nutzbar auch für kommerzielle Zwecke (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Was brauchen Sie, um Gatling auszuführen?&lt;/h2&gt;
&lt;p&gt;Eine 64-Bit-JVM für Java, Kotlin oder Scala, oder Node.js für JavaScript und TypeScript. In beiden Fällen läuft die Simulation selbst auf einer JVM.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.gatling.io/reference/deploy/install-local/&quot;&gt;Installationsseite&lt;/a&gt; unterstützt OpenJDK-LTS-Versionen von 11 bis 25 und schließt 32-Bit-JVMs und OpenJ9 aus. Die &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/js-cli/&quot;&gt;JavaScript-CLI&lt;/a&gt; setzt Node.js 24 oder neuer voraus und lädt ein Gatling-Runtime-Bundle herunter, laut &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;README von gatling-js&lt;/a&gt; samt GraalVM (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie ist eine Gatling-Simulation aufgebaut?&lt;/h2&gt;
&lt;p&gt;Eine Simulation definiert Szenarien, gibt jedem ein Injektionsprofil und hängt eine Protokollkonfiguration an; registriert wird alles in einem einzigen &lt;code&gt;setUp&lt;/code&gt;-Aufruf.&lt;/p&gt;
&lt;p&gt;In der &lt;a href=&quot;https://docs.gatling.io/concepts/simulation/&quot;&gt;Simulationsreferenz&lt;/a&gt; verkettet ein Szenario Anfragen mit Pausen, Schleifen und Bedingungen. Diese Java-Simulation speichert eine Produkt-ID aus einer Suche, pausiert eine bis drei Sekunden und öffnet das Produkt, während die Ankünfte auf 20 Benutzer pro Sekunde steigen und zehn Minuten lang gehalten werden:&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;Die Imports sind weggelassen, und &lt;code&gt;#{id}&lt;/code&gt; liest über Gatlings &lt;a href=&quot;https://docs.gatling.io/concepts/session/el/&quot;&gt;Expression Language&lt;/a&gt; den gespeicherten Wert. &lt;a href=&quot;https://loadtest.app/de/gatling-vs-k6/&quot;&gt;Gatling vs k6&lt;/a&gt; zeigt eine Simulation in JavaScript.&lt;/p&gt;
&lt;h2&gt;Sollten Sie Benutzer offen oder geschlossen injizieren?&lt;/h2&gt;
&lt;p&gt;Offen, für die meisten Websites und APIs, bei denen neue Benutzer weiter eintreffen, egal wie langsam das System wird. Geschlossen passt zu Systemen, die die Parallelität begrenzen, etwa einer Ticket-Warteschlange.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;Referenz zu Injektionsprofilen&lt;/a&gt; trennt die API: &lt;code&gt;injectOpen&lt;/code&gt; nimmt Ankunftsraten wie &lt;code&gt;rampUsersPerSec&lt;/code&gt;, &lt;code&gt;injectClosed&lt;/code&gt; Parallelitätsziele wie &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. Die &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;Seite zu Lastmodellen&lt;/a&gt; sagt, dass sich die meisten Websites als offene Systeme verhalten und ein Profil die beiden nicht mischen kann (geprüft am 9. Oktober 2026). Unser Beitrag zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; erklärt die Wahl.&lt;/p&gt;
&lt;h2&gt;Wie funktionieren Checks, Assertions und der Bericht?&lt;/h2&gt;
&lt;p&gt;Checks prüfen jede Antwort und können Werte daraus speichern, Assertions bewerten den ganzen Lauf, sobald er endet. Danach schreibt jeder Lauf einen HTML-Bericht.&lt;/p&gt;
&lt;p&gt;Ohne expliziten Status-Check &lt;a href=&quot;https://docs.gatling.io/reference/script/http/checks/&quot;&gt;prüft Gatling&lt;/a&gt;, ob jede HTTP-Antwort 2XX oder 304 ist. &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;Assertions&lt;/a&gt; prüfen Antwortzeiten, Anfragezahlen oder Anfragen pro Sekunde, global oder pro Anfrage, und eine einzige gescheiterte Assertion lässt die Simulation scheitern. Der &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;HTML-Bericht&lt;/a&gt; zeigt Antwortzeitbereiche und Perzentile, gestartete Benutzer pro Sekunde, gleichzeitige Benutzer und Anfragen pro Sekunde; seine Perzentile im Zeitverlauf zählen nur erfolgreiche Anfragen (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie passt Gatling in Build und CI?&lt;/h2&gt;
&lt;p&gt;Über das Plugin für Maven, Gradle, sbt oder npm, das in jedem CI-System läuft. Eine gescheiterte Assertion lässt den Build scheitern.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/maven-plugin/&quot;&gt;Maven-Plugin&lt;/a&gt; bindet &lt;code&gt;gatling:test&lt;/code&gt; an die Phase &lt;code&gt;integration-test&lt;/code&gt;, sodass &lt;code&gt;mvn verify&lt;/code&gt; es ausführt, und mit &lt;code&gt;CI=true&lt;/code&gt; entfällt die Abfrage der Simulation (der Lauf scheitert dann, wenn das Projekt mehr als eine Simulation enthält und keine benannt ist). Das &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/gradle-plugin/&quot;&gt;Gradle-Plugin&lt;/a&gt; nutzt &lt;code&gt;gatlingRun&lt;/code&gt;, und das &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/sbt-plugin/&quot;&gt;sbt-Plugin&lt;/a&gt; nimmt nur Scala-Simulationen an. Die fertigen &lt;a href=&quot;https://docs.gatling.io/integrations/ci-cd/&quot;&gt;CI-Integrationen&lt;/a&gt; von Gatling, etwa die GitHub Action, starten Läufe in Gatling Enterprise (geprüft am 9. Oktober 2026). Unser &lt;a href=&quot;https://loadtest.app/de/load-testing-in-github-actions/&quot;&gt;Leitfaden zu GitHub Actions&lt;/a&gt; zeigt den Workflow dazu.&lt;/p&gt;
&lt;h2&gt;Welche Protokolle unterstützt Gatling?&lt;/h2&gt;
&lt;p&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events und JMS sind ohne Grenzen dabei. gRPC, MQTT und GraphQL sind separate Plugins, die außerhalb von Gatling Enterprise auf 5 Benutzer und 5 Minuten begrenzt sind.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; stellt die ersten fünf unter Apache 2.0. Die Setup-Seiten für &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; und &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/setup/&quot;&gt;GraphQL&lt;/a&gt; stellen jedes Plugin unter die Gatling Enterprise Component License: unbegrenzt in Gatling Enterprise, während ein Test mit der Community Edition bei 5 Benutzern oder 5 Minuten stoppt. Diese &lt;a href=&quot;https://docs.gatling.io/project/licenses/enterprise-component/&quot;&gt;Lizenz&lt;/a&gt; erlaubt die kostenlose Nutzung für höchstens ein Jahr, nur für interne Tests der eigenen Webanwendungen; sie endet, sobald ein Limit erreicht ist, und Gatling kann die Limits ändern. GraphQL setzt 3.16.0 oder neuer voraus. Laut Release Notes und README unterstützt das JavaScript-SDK GraphQL noch nicht, obwohl die Setup-Seite bereits ein npm-Paket nennt; prüfen Sie das also, bevor Sie einen GraphQL-Test in JavaScript planen (geprüft am 9. Oktober 2026). Unser Leitfaden zum &lt;a href=&quot;https://loadtest.app/de/how-to-load-test-a-graphql-api/&quot;&gt;Lasttest einer GraphQL-API&lt;/a&gt; umgeht die Grenze mit einfachen HTTP-Anfragen.&lt;/p&gt;
&lt;h2&gt;Was bringt Gatling Enterprise zusätzlich?&lt;/h2&gt;
&lt;p&gt;Gatling Enterprise ist die kommerzielle Edition auf derselben Engine. Sie erzeugt Last aus verwalteter oder privater Infrastruktur, was die freie Edition nicht tut.&lt;/p&gt;
&lt;p&gt;Laut README führt Enterprise Tests auf verwalteten Lastgeneratoren oder in Ihren eigenen Konten bei AWS, Azure, GCP oder Kubernetes aus und ergänzt Live-Dashboards, Trends, Teams mit SSO und CI/CD-Integrationen. Die &lt;a href=&quot;https://docs.gatling.io/tutorials/faq/&quot;&gt;FAQ&lt;/a&gt; sagt, dass die Community Edition keine verteilten Tests unterstützt und dass Simulationen unverändert zu Enterprise wechseln können (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, führt keine Gatling-Simulationen aus. LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-load-testing&quot;&gt;führt JMeter-Testpläne und k6-Skripte aus&lt;/a&gt;, und zwar aus 25 Cloud-Regionen. Für Gatling führt der Weg zu mehr Maschinen also über Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Was kann Gatling gut, und wo liegen seine Grenzen?&lt;/h2&gt;
&lt;p&gt;Stark ist Gatling bei Tests als Code, den man im Review prüfen kann, bei Lastmodellen und bei Berichten ohne Einrichtung. Schwächer ist es bei Protokollen jenseits von Web und Messaging und bei kostenloser Skalierung über eine Maschine hinaus.&lt;/p&gt;
&lt;p&gt;Das README hebt die Engine hervor: nicht blockierend, auf Netty gebaut, jeder virtuelle Benutzer eine leichtgewichtige Nachricht. Grenzen, die die Dokumentation selbst nennt (geprüft am 9. Oktober 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gatling ist kein Browser: Laut der &lt;a href=&quot;https://docs.gatling.io/reference/script/http/protocol/&quot;&gt;Seite zum HTTP-Protokoll&lt;/a&gt; führt es kein JavaScript aus.&lt;/li&gt;
&lt;li&gt;Das JavaScript-SDK kennt kein &lt;a href=&quot;https://docs.gatling.io/reference/script/jms/&quot;&gt;JMS&lt;/a&gt; und kann keine npm-Bibliotheken nutzen, die native Binaries oder Node.js-APIs brauchen.&lt;/li&gt;
&lt;li&gt;HTTP-Caching ist standardmäßig aktiv, was die Zahl der Anfragen senken kann.&lt;/li&gt;
&lt;li&gt;Das Format von &lt;code&gt;simulation.log&lt;/code&gt; ist nicht dokumentiert und kann sich jederzeit ändern.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wann sollten Sie stattdessen k6, JMeter oder Locust wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie ein anderes Tool, wenn dessen Sprache, Protokolle oder kostenloser Weg zur Skalierung besser zu Ihrem Team passen.&lt;/p&gt;
&lt;p&gt;Unser Überblick über &lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools&lt;/a&gt; stellt Gatling neben fünf weitere.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;k6&lt;/strong&gt;, wenn Sie in der CI &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;ein einzelnes Binary&lt;/a&gt; ohne JVM, &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;Thresholds&lt;/a&gt;, die einen scheiternden Lauf früh stoppen können, oder gRPC als &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;eingebautes Protokoll&lt;/a&gt; wollen (geprüft am 9. Oktober 2026). &lt;a href=&quot;https://loadtest.app/de/gatling-vs-k6/&quot;&gt;Gatling vs k6&lt;/a&gt; vergleicht die beiden.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;JMeter&lt;/strong&gt;, wenn Ihre Tester Tests in einer GUI bauen oder Sie JDBC, LDAP oder FTP aus dem &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;Kern&lt;/a&gt; brauchen (geprüft am 9. Oktober 2026). LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-load-testing&quot;&gt;führt vorhandene JMeter-Testpläne aus&lt;/a&gt;, aus 25 Cloud-Regionen, und &lt;a href=&quot;https://loadtest.app/de/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter&lt;/a&gt; geht tiefer.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;Locust&lt;/strong&gt;, wenn Ihr Team Python schreibt und einen &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;verteilten Modus&lt;/a&gt; im kostenlosen Tool möchte (geprüft am 9. Oktober 2026). Unser &lt;a href=&quot;https://loadtest.app/de/locust-load-testing/&quot;&gt;Locust-Review&lt;/a&gt; beschreibt es.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Darf man Gatling kostenlos kommerziell nutzen?&lt;/strong&gt;
Ja. Die Community Edition steht unter Apache 2.0. Die Plugins für gRPC, MQTT und GraphQL haben eine eigene Lizenz und sind außerhalb von Gatling Enterprise auf 5 Benutzer und 5 Minuten begrenzt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Braucht man Java, um Gatling zu nutzen?&lt;/strong&gt;
Für Java, Kotlin oder Scala ja: ein 64-Bit-OpenJDK-LTS von 11 bis 25. Das JavaScript-SDK braucht Node.js 24 oder neuer, und seine CLI lädt die JVM-Laufzeit selbst herunter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus Gatling-Tests ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter-Testpläne und k6-Skripte aus. Um eine Gatling-Simulation auf mehrere Maschinen zu verteilen, nutzen Sie Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: Tests als Code oder GUI-Testplan?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-k6/&quot;&gt;Gatling vs k6: JVM-Simulationen oder ein Go-Binary?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools: sechs Optionen im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-locust/&quot;&gt;Gatling vs Locust: JVM-Simulationen oder Python-Locustfiles?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/nbomber-load-testing/&quot;&gt;NBomber-Lasttests: das .NET-Framework im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs JMeter: Tests als Code oder GUI-Testplan?</title><link>https://loadtest.app/de/gatling-vs-jmeter/</link><guid isPermaLink="true">https://loadtest.app/de/gatling-vs-jmeter/</guid><description>Gatling und JMeter im Vergleich: Lizenz, Skripte, Protokolle, Recorder, Lastmodelle, Skalierung, CI und Berichte, mit klaren Hinweisen zur Wahl.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Gatling und Apache JMeter sind beide kostenlose Open-Source-Lasttest-Tools, die auf der JVM laufen, und die Wahl hängt vor allem davon ab, wie Ihr Team Tests bauen möchte. Nehmen Sie Gatling, wenn Sie Tests als Code in Java, Kotlin, Scala, JavaScript oder TypeScript, offene Injektionsprofile und nach jedem Lauf einen HTML-Bericht wollen. Nehmen Sie JMeter, wenn Sie Protokolle wie JDBC, LDAP, FTP oder Mail ohne Zusatzaufwand brauchen, Tests lieber in einer GUI zusammenstellen oder bereits &lt;code&gt;.jmx&lt;/code&gt;-Testpläne besitzen.&lt;/p&gt;
&lt;p&gt;Die Fakten in diesem Vergleich Gatling vs JMeter stammen aus der Dokumentation und den Repositories der beiden Projekte, geprüft am 9. Oktober 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;Lizenz&lt;/td&gt;
&lt;td&gt;Apache 2.0; gRPC, MQTT und GraphQL unter einer eigenen Komponentenlizenz (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Apache 2.0 (&lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laufzeit&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS 11 bis 25 (Version 3.16.0)&lt;/td&gt;
&lt;td&gt;JVM, Java 8 oder neuer (Version 5.6.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests geschrieben als&lt;/td&gt;
&lt;td&gt;Code in Java, Kotlin, Scala, JavaScript oder TypeScript&lt;/td&gt;
&lt;td&gt;Testpläne, in einer GUI gebaut und als XML-Dateien (&lt;code&gt;.jmx&lt;/code&gt;) gespeichert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eingebaute Protokolle&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, Shell-Befehle, Java-Objekte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recorder&lt;/td&gt;
&lt;td&gt;HTTP-Proxy oder Konverter für HAR-Dateien&lt;/td&gt;
&lt;td&gt;HTTP(S) Test Script Recorder (Proxy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lastmodell&lt;/td&gt;
&lt;td&gt;Offene oder geschlossene Injektionsprofile&lt;/td&gt;
&lt;td&gt;Thread Groups; eine experimentelle Open Model Thread Group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skalierung&lt;/td&gt;
&lt;td&gt;Ein Rechner; verteilte Läufe brauchen Gatling Enterprise&lt;/td&gt;
&lt;td&gt;Eingebauter Remote-Modus, ein Client steuert viele Server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI und Headless-Läufe&lt;/td&gt;
&lt;td&gt;Plugins für Maven, Gradle, sbt und npm; eine verfehlte Assertion lässt den Lauf scheitern&lt;/td&gt;
&lt;td&gt;CLI-Modus (&lt;code&gt;jmeter -n&lt;/code&gt;); Maven-, Gradle- und Jenkins-Plugins von Drittanbietern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berichte&lt;/td&gt;
&lt;td&gt;HTML-Bericht nach jedem Lauf&lt;/td&gt;
&lt;td&gt;HTML-Dashboard; Live-Ergebnisse über einen Backend Listener&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was ist der Unterschied zwischen Gatling und JMeter?&lt;/h2&gt;
&lt;p&gt;In Gatling ist ein Test ein Programm in einem Build-Projekt. In JMeter ist ein Test ein Baum aus Elementen, den Sie in einer Desktop-GUI zusammenstellen und als XML-Datei speichern, und daraus ergeben sich die meisten anderen Unterschiede.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; von Gatling nennt Tests Simulationen und legt sie wie Anwendungscode in Ihr Repository; ausgeführt werden sie über ein Plugin für Maven, Gradle, sbt oder npm. Das &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;SDK für JavaScript und TypeScript&lt;/a&gt; wird über npm installiert und lädt seine eigene GraalVM-Laufzeit herunter.&lt;/p&gt;
&lt;p&gt;Ein JMeter-Plan enthält eine Thread Group für die Benutzer, Sampler für die Anfragen sowie Assertions und Listener für die Ergebnisse. JMeter 5.6.3, die aktuelle Version auf der &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;Download-Seite&lt;/a&gt;, braucht Java 8 oder neuer. Das README im &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/README.md&quot;&gt;Entwicklungszweig&lt;/a&gt; von JMeter verlangt bereits Java 17 (geprüft am 10. Oktober 2026). Unter der Haube führt JMeter jeden virtuellen Benutzer als Java-Thread aus, während das README von Gatling virtuelle Benutzer als leichtgewichtige Nachrichten auf einer nicht blockierenden Engine auf Basis von Netty beschreibt.&lt;/p&gt;
&lt;h2&gt;Wie schreibt man in beiden Tools einen Test?&lt;/h2&gt;
&lt;p&gt;In Gatling schreiben Sie eine Simulationsklasse, die ein Szenario, ein Injektionsprofil und Assertions festlegt. In JMeter fügen Sie in der GUI eine Thread Group und Sampler hinzu, speichern den Plan und starten ihn dann von der Kommandozeile.&lt;/p&gt;
&lt;p&gt;Eine Java-Simulation nach dem Vorbild des &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/java-jvm/running-your-first-simulation/&quot;&gt;Tutorials zur ersten Simulation&lt;/a&gt; von Gatling: Neue Benutzer kommen anfangs mit einem pro Sekunde an, steigen innerhalb einer Minute auf zehn pro Sekunde und bleiben dann fünf Minuten auf diesem Niveau. Der Lauf scheitert, wenn das 95. Perzentil über 500 ms steigt oder mehr als 1 % der Anfragen fehlschlagen:&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;Starten Sie sie mit &lt;code&gt;./mvnw gatling:test&lt;/code&gt;; eine JavaScript- oder TypeScript-Simulation starten Sie mit &lt;code&gt;npx gatling run&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In JMeter ist derselbe Test eine Thread Group mit einem HTTP-Request-Sampler, und eine Duration Assertion kann jede zu langsame Antwort als fehlgeschlagen markieren. Der &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;Einstiegsleitfaden&lt;/a&gt; baut den Plan im GUI-Modus und führt ihn im CLI-Modus aus; &lt;code&gt;-e -o&lt;/code&gt; erzeugt am Ende den HTML-Bericht:&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;Beide Tools können einen ersten Entwurf im Browser aufzeichnen. Der &lt;a href=&quot;https://docs.gatling.io/reference/script/http/recorder/&quot;&gt;Recorder&lt;/a&gt; von Gatling arbeitet als HTTP-Proxy oder wandelt eine HAR-Datei in eine Simulation um, und der &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; von JMeter zeichnet Browser-Traffic in einen Plan auf (geprüft am 9. Oktober 2026). Die Dokumentation von Gatling führt diesen Recorder inzwischen als Legacy, und das neuere &lt;a href=&quot;https://docs.gatling.io/tutorials/low-code/browser/studio/&quot;&gt;Gatling Studio&lt;/a&gt; verlangt zum Anmelden ein Enterprise-Konto (geprüft am 10. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welche Protokolle kann jedes Tool testen?&lt;/h2&gt;
&lt;p&gt;JMeter deckt von Haus aus mehr Protokolle ab. Gatling bringt die wichtigsten Webprotokolle plus JMS mit und überlässt den Großteil des Rests eigenen Komponenten oder Community-Plugins.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt; von JMeter nennt jedes Protokoll aus der Tabelle oben, Mail eingeschlossen. JDBC und JMS brauchen Treiber-JARs von Ihrem Datenbank- oder JMS-Anbieter, und der &lt;a href=&quot;https://jmeter-plugins.org/install/Install/&quot;&gt;Plugins Manager&lt;/a&gt; installiert Community-Plugins direkt aus der GUI.&lt;/p&gt;
&lt;p&gt;Laut dem README von Gatling sind gRPC, MQTT und GraphQL eigene Komponenten unter der Gatling Enterprise Component License, ohne Enterprise begrenzt auf fünf gleichzeitige Benutzer und Tests von fünf Minuten. Kafka, AMQP, SFTP, FTP und JDBC kommen aus &lt;a href=&quot;https://docs.gatling.io/reference/script/third-parties/&quot;&gt;Drittanbieter-Plugins&lt;/a&gt; für Gatling 3.13, die Gatling nicht selbst pflegt (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie modellieren Gatling und JMeter Last?&lt;/h2&gt;
&lt;p&gt;Gatling lässt Sie schon im Skript zwischen einem offenen und einem geschlossenen Modell wählen. Die klassische Thread Group von JMeter ist ein geschlossener Pool von Benutzern, und für ankunftsbasierte Last brauchen Sie die neuere Open Model Thread Group.&lt;/p&gt;
&lt;p&gt;In Gatling nimmt &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; Ankunftsraten wie &lt;code&gt;constantUsersPerSec&lt;/code&gt; und &lt;code&gt;rampUsersPerSec&lt;/code&gt; entgegen, &lt;code&gt;injectClosed&lt;/code&gt; dagegen Zielwerte für die Parallelität wie &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. JMeter 5.5 hat die &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; eingeführt, die die Referenz weiterhin als experimentell kennzeichnet (geprüft am 9. Oktober 2026). Unser Leitfaden zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; erklärt, warum diese Wahl wichtig ist.&lt;/p&gt;
&lt;h2&gt;Wie verteilt man einen Test auf mehrere Rechner?&lt;/h2&gt;
&lt;p&gt;JMeter hat einen verteilten Modus eingebaut. Die Open-Source-Edition von Gatling erzeugt Last von einem Rechner aus, und die Dokumentation nennt ein Gatling-Enterprise-Konto als Voraussetzung für verteilte Läufe.&lt;/p&gt;
&lt;p&gt;Im &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;Remote-Modus&lt;/a&gt; steuert ein JMeter-Client beliebig viele Server. Jeder Server führt den ganzen Plan aus, 1.000 Threads auf sechs Servern ergeben also 6.000 Threads. Alle Knoten sollten dieselbe JMeter- und Java-Version verwenden, RMI braucht einen Keystore, sofern SSL nicht deaktiviert ist, und Datendateien müssen auf jeden Server kopiert werden.&lt;/p&gt;
&lt;p&gt;Für JMeter-Testpläne gibt es einen dritten Weg. LoadFocus, der Herausgeber dieser Website, &lt;a href=&quot;https://loadfocus.com/de-de/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-jmeter&quot;&gt;führt bestehende JMeter-Testpläne&lt;/a&gt; unverändert aus 25 Cloud-Regionen aus, ohne dass Sie Remote-Server einrichten müssen. LoadFocus führt keine Gatling-Simulationen aus.&lt;/p&gt;
&lt;h2&gt;Wie passen sie in die CI, und welche Berichte bekommen Sie?&lt;/h2&gt;
&lt;p&gt;Beide laufen headless. Die Assertions von Gatling können den Build direkt scheitern lassen, während die Assertions von JMeter einzelne Samples markieren und die CI-Anbindung aus Bibliotheken von Drittanbietern kommt.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;Assertions&lt;/a&gt; in Gatling werden nach dem Lauf geprüft, und eine einzige fehlgeschlagene Assertion lässt die Simulation und damit den Build-Task scheitern. Der &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;HTML-Bericht&lt;/a&gt; zeigt Perzentile der Antwortzeit, gestartete Benutzer pro Sekunde, gleichzeitige Benutzer und Anfragen pro Sekunde im Zeitverlauf.&lt;/p&gt;
&lt;p&gt;Der CLI-Modus von JMeter kennt keine Pass/Fail-Option, daher scheitert ein Build an einem verfehlten Ziel nur über die im README genannten Bibliotheken für Maven, Gradle und Jenkins oder über eine eigene Prüfung. Das &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;Dashboard&lt;/a&gt; bringt eine APDEX-Tabelle, eine Statistiktabelle mit drei konfigurierbaren Perzentilen und Fehlerübersichten mit, und ein Backend Listener streamt Live-Ergebnisse nach InfluxDB oder Graphite.&lt;/p&gt;
&lt;h2&gt;Welches Tool sollten Sie wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie Gatling, wenn Ihr Team Java, Kotlin, Scala oder TypeScript schreibt und Lasttests wie den übrigen Code reviewen möchte. Wählen Sie stattdessen JMeter, wenn Sie Protokolle jenseits des Webs brauchen, wenn Ihre Tester eine GUI bevorzugen oder wenn Sie bereits &lt;code&gt;.jmx&lt;/code&gt;-Pläne haben.&lt;/p&gt;
&lt;p&gt;Gatling passt zu Teams, die Traffic als Ankunftsraten beschreiben und Pass/Fail-Regeln direkt neben dem Szenario sowie einen lesbaren Bericht ohne Zusatzaufwand wollen.&lt;/p&gt;
&lt;p&gt;JMeter ist die bessere Wahl für Tests von JDBC, LDAP, FTP oder Mail, für Tester, die einen aufgezeichneten Ablauf visuell verfeinern, und für verteilte Läufe auf eigenen Servern ohne kommerzielle Lizenz. Ein Unternehmen, das JMeter bereits nutzt, behält außerdem seine Pläne, Plugins und sein Know-how.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist Gatling schneller als JMeter?&lt;/strong&gt;
Das haben wir nicht selbst gemessen, deshalb nennen wir keinen Sieger. Fair vergleichen lässt sich das nur mit demselben Szenario in beiden Tools auf Ihrer eigenen Hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann Gatling .jmx-Dateien von JMeter ausführen?&lt;/strong&gt;
Nicht direkt. Gatling führt Simulationen aus, die mit seinen SDKs geschrieben sind, ein JMeter-Plan muss also neu geschrieben werden. Das README von Gatling nennt KI-Erweiterungen, die JMeter-Testpläne umwandeln, und diese brauchen einen API-Token für Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus Gatling-Tests ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter-Testpläne und k6-Skripte aus. Um eine Gatling-Simulation auf mehrere Rechner zu verteilen, nutzen Sie Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-load-testing/&quot;&gt;Gatling-Lasttests: das JVM-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-k6/&quot;&gt;Gatling vs k6: JVM-Simulationen oder ein Go-Binary?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: Python-Skripte oder JMeter-Testpläne?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery: welches Lasttest-Tool passt zu Ihrem Team?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-locust/&quot;&gt;Gatling vs Locust: JVM-Simulationen oder Python-Locustfiles?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/jmeter-vs-postman/&quot;&gt;JMeter vs Postman: welches Tool für Lasttests?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs k6: JVM-Simulationen oder ein Go-Binary?</title><link>https://loadtest.app/de/gatling-vs-k6/</link><guid isPermaLink="true">https://loadtest.app/de/gatling-vs-k6/</guid><description>Gatling vs k6 im Vergleich: Lizenz, Laufzeit, Skriptsprachen, Protokolle, Lastmodelle, Pass/Fail-Kriterien und Skalierung, mit Hinweisen zur Wahl.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Gatling und k6 sind beide Open-Source-Tools, die Lasttests als Code in Ihrem Repository halten, und mit beiden lässt sich eine HTTP-API gut unter Last testen. Nehmen Sie Gatling, wenn Ihr Team in Java, Kotlin oder Scala arbeitet oder nach jedem Lauf ohne Zusatzaufwand einen HTML-Bericht haben möchte. Nehmen Sie k6, wenn Sie ein einzelnes Go-Binary ohne JVM, gRPC und Browsertests ab Werk sowie Schwellenwerte wollen, die einen scheiternden Lauf vorzeitig stoppen können.&lt;/p&gt;
&lt;p&gt;Die Fakten in diesem Vergleich Gatling vs k6 stammen aus der Dokumentation und den Repositories der beiden Projekte, geprüft am 9. Oktober 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;Lizenz&lt;/td&gt;
&lt;td&gt;Apache 2.0; gRPC, MQTT und GraphQL unter einer eigenen Komponentenlizenz (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laufzeit&lt;/td&gt;
&lt;td&gt;JVM; das Java-SDK braucht OpenJDK LTS 11 bis 25 (Version 3.16.0)&lt;/td&gt;
&lt;td&gt;Ein Go-Binary mit eingebetteter JavaScript-Engine (Version v2.3.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testskripte&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript oder TypeScript&lt;/td&gt;
&lt;td&gt;JavaScript, oder TypeScript ohne Typprüfung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kernprotokolle&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;Lastmodell&lt;/td&gt;
&lt;td&gt;Offene oder geschlossene Injektionsprofile&lt;/td&gt;
&lt;td&gt;Sechs Executors, davon zwei mit Ankunftsrate (offenes Modell)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass/Fail&lt;/td&gt;
&lt;td&gt;Assertions, geprüft nach dem Lauf&lt;/td&gt;
&lt;td&gt;Schwellenwerte (&lt;code&gt;thresholds&lt;/code&gt;), die einen Lauf auch vorzeitig abbrechen können&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berichte&lt;/td&gt;
&lt;td&gt;HTML-Bericht nach jedem Lauf&lt;/td&gt;
&lt;td&gt;Zusammenfassung am Testende; Web-Dashboard mit HTML-Export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browsertests&lt;/td&gt;
&lt;td&gt;Nicht eingebaut; der Recorder macht aus Browser-Traffic Code&lt;/td&gt;
&lt;td&gt;Eingebautes Browser-Modul (steuert einen Chromium-basierten Browser)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skalierung&lt;/td&gt;
&lt;td&gt;Gatling Enterprise&lt;/td&gt;
&lt;td&gt;k6-operator auf Kubernetes oder Grafana Cloud k6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was ist der Unterschied zwischen Gatling und k6?&lt;/h2&gt;
&lt;p&gt;Der größte Unterschied ist die Laufzeit. Gatling läuft auf der JVM, und Sie schreiben Tests mit einem seiner SDKs, während k6 ein einzelnes kompiliertes Go-Programm ist, das JavaScript ausführt.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; von Gatling nennt ein Java-SDK für Java, Kotlin und Scala, das über ein Plugin für Maven, Gradle oder sbt läuft. Das &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;SDK für JavaScript und TypeScript&lt;/a&gt; wird über npm installiert, und sein Kommandozeilen-Tool lädt GraalVM herunter, sodass auch eine JavaScript-Simulation auf einer JVM läuft.&lt;/p&gt;
&lt;p&gt;k6 wird als &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;Paket oder eigenständiges Binary&lt;/a&gt; installiert und braucht keine weitere Laufzeit. Es führt auch &lt;code&gt;.ts&lt;/code&gt;-Dateien direkt aus, wobei die &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/javascript-typescript-compatibility-mode/&quot;&gt;TypeScript-Unterstützung&lt;/a&gt; die Typen entfernt, ohne sie zu prüfen (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie schreibt man denselben Test in beiden Tools?&lt;/h2&gt;
&lt;p&gt;Beide Tools können denselben Test in JavaScript ausdrücken. Gatling nennt ihn eine Simulation und beschreibt die Last als Injektionsprofil, k6 nennt ihn ein Skript und beschreibt die Last als Szenario mit einem Executor.&lt;/p&gt;
&lt;p&gt;Hier ein Test, bei dem fünf Minuten lang jede Sekunde zehn neue Benutzer ankommen und der Lauf scheitert, wenn das 95. Perzentil über 500 ms steigt oder mehr als 1 % der Anfragen fehlschlagen. Im JavaScript-SDK von Gatling, nach dem Vorbild des &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/javascript/running-your-first-simulation/&quot;&gt;Tutorials zur ersten 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;Derselbe Test in k6, mit dem &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;Gestartet werden sie mit &lt;code&gt;npx gatling run&lt;/code&gt; und &lt;code&gt;k6 run script.js&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Wie modellieren Gatling und k6 Last?&lt;/h2&gt;
&lt;p&gt;Beide unterstützen offene und geschlossene Lastmodelle. In Gatling fällt die Wahl über die Injektionsmethode, die Sie aufrufen, in k6 über den Executor, den Sie auswählen.&lt;/p&gt;
&lt;p&gt;In Gatling nimmt &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; Ankunftsraten wie &lt;code&gt;constantUsersPerSec&lt;/code&gt; entgegen, &lt;code&gt;injectClosed&lt;/code&gt; dagegen Zielwerte für die Parallelität wie &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. k6 hat &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;sechs Executors&lt;/a&gt;: Die beiden mit Ankunftsrate folgen dem offenen Modell, die anderen vier dem geschlossenen, bei dem ein virtueller Benutzer seine nächste Iteration erst startet, wenn die letzte fertig ist.&lt;/p&gt;
&lt;p&gt;Ein Arrival-Rate-Szenario in k6 startet Iterationen aus einem Pool vorab angelegter virtueller Benutzer, und wenn dieser Pool erschöpft ist, überspringt k6 Iterationen und zählt sie als &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;verworfene Iterationen&lt;/a&gt; (&lt;code&gt;dropped_iterations&lt;/code&gt;) (geprüft am 9. Oktober 2026). Unser Leitfaden zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; erklärt, wann welches Modell passt.&lt;/p&gt;
&lt;h2&gt;Wie entscheiden Gatling und k6, ob ein Test bestanden ist?&lt;/h2&gt;
&lt;p&gt;Beide machen aus Performance-Zielen ein Ergebnis, mit dem eine CI-Pipeline arbeiten kann: bestanden oder nicht bestanden. Gatling prüft seine Ziele nach dem Ende des Laufs, und k6 kann einen Lauf zusätzlich stoppen, sobald ein Ziel verfehlt ist.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;Assertions&lt;/a&gt; in Gatling werden nach der Simulation ausgewertet, und eine einzige fehlgeschlagene Assertion lässt die Simulation und den Build scheitern. &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;Schwellenwerte&lt;/a&gt; in k6 beenden einen gescheiterten Lauf mit einem Exit-Code ungleich null, und ein Schwellenwert mit &lt;code&gt;abortOnFail&lt;/code&gt; stoppt den Test in dem Moment, in dem er verfehlt wird (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welche Protokolle und Browsertests decken die Tools ab?&lt;/h2&gt;
&lt;p&gt;Beide beherrschen HTTP und WebSockets ab Werk. Gatling bringt zusätzlich Server-Sent Events und JMS mit, k6 gRPC und echte Browser-Sitzungen.&lt;/p&gt;
&lt;p&gt;Laut README von Gatling sind gRPC, MQTT und GraphQL eigene Komponenten unter der Gatling Enterprise Component License, ohne Enterprise begrenzt auf fünf gleichzeitige Benutzer und fünf Minuten Testdauer. k6 nennt HTTP/1.1, HTTP/2, WebSockets und gRPC als &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;eingebaute Protokolle&lt;/a&gt;, weitere kommen über xk6-Erweiterungen wie Kafka und Redis hinzu.&lt;/p&gt;
&lt;p&gt;Für Browsertests hat k6 ein &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6-browser/&quot;&gt;Browser-Modul&lt;/a&gt;, das einen Chromium-basierten Browser steuert und Frontend-Metriken sammelt. Die Dokumentation von Gatling beschreibt keine Browser-Engine: Der &lt;a href=&quot;https://docs.gatling.io/reference/script/http/recorder/&quot;&gt;Recorder&lt;/a&gt; macht aus einer Browser-Sitzung oder einer HAR-Datei eine Simulation auf HTTP-Ebene (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie fährt man einen Test, der mehr Last braucht, als ein Rechner erzeugen kann?&lt;/h2&gt;
&lt;p&gt;Die Open-Source-Edition von Gatling erzeugt Last von einem Rechner aus, und verteilte Läufe brauchen Gatling Enterprise. k6 kann einen Test mit dem quelloffenen k6-operator auf einen Kubernetes-Cluster verteilen oder ihn in Grafana Cloud k6 ausführen.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/java-jvm/installation-guide/&quot;&gt;Installationsanleitung&lt;/a&gt; von Gatling nennt ein Enterprise-Konto als Voraussetzung für verteilte Läufe, die auf verwalteten Lastgeneratoren oder an privaten Standorten in Ihrem eigenen AWS-, Azure-, GCP- oder Kubernetes-Konto laufen. Der &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; teilt einen Test auf mehrere k6-Instanzen in einem Cluster auf (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Für k6-Skripte gibt es einen dritten Weg. LoadFocus, der Herausgeber dieser Website, &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-k6&quot;&gt;führt k6-Skripte&lt;/a&gt; auf seiner eigenen Cloud-Infrastruktur aus 25 Regionen aus, wobei Benutzerzahl und Dauer aus den Einstellungen des Tests kommen. Sein Skript-Validator weist darauf hin, dass Arrival-Rate-Szenarien dort mit einer festen Zahl von Benutzern laufen; ein Skript mit offenem Modell wie das obige hält auf LoadFocus also seine Ankunftsrate nicht. LoadFocus führt keine Gatling-Simulationen aus, für Gatling bleibt also Gatling Enterprise der Weg zu mehr Rechnern.&lt;/p&gt;
&lt;h2&gt;Welche Berichte bekommen Sie?&lt;/h2&gt;
&lt;p&gt;Gatling schreibt nach jedem Lauf ohne Einrichtung einen HTML-Bericht. k6 gibt eine Zusammenfassung im Terminal aus und kann über sein eingebautes Web-Dashboard einen HTML-Bericht erzeugen.&lt;/p&gt;
&lt;p&gt;Der &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;HTML-Bericht&lt;/a&gt; von Gatling zeigt Perzentile der Antwortzeit, gestartete Benutzer pro Sekunde und Anfragen pro Sekunde im Zeitverlauf. k6 gibt eine &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/end-of-test/&quot;&gt;Zusammenfassung am Testende&lt;/a&gt; aus, und sein &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/web-dashboard/&quot;&gt;Web-Dashboard&lt;/a&gt; zeigt Live-Diagramme und exportiert einen eigenständigen HTML-Bericht, wenn Sie &lt;code&gt;K6_WEB_DASHBOARD_EXPORT&lt;/code&gt; setzen.&lt;/p&gt;
&lt;h2&gt;Welches Tool sollten Sie wählen?&lt;/h2&gt;
&lt;p&gt;Gatling passt zu Teams auf der JVM, k6 zu Teams, die ein einzelnes Binary und JavaScript wollen. Protokolle, Browsertests und Skalierung entscheiden die meisten übrigen Fälle.&lt;/p&gt;
&lt;p&gt;Wählen Sie Gatling statt k6, wenn Ihr Team auf der JVM zu Hause ist und Tests in Java, Kotlin oder Scala mit Maven, Gradle oder sbt neben dem Anwendungscode bauen möchte, wenn Sie JMS oder Server-Sent Events brauchen oder wenn Sie nach jedem Lauf ohne Einrichtung einen HTML-Bericht wollen.&lt;/p&gt;
&lt;p&gt;Wählen Sie k6 statt Gatling, wenn Sie ein einzelnes Binary in der CI ohne zu installierende JVM wollen, wenn Ihre Tests gRPC oder echte Browser-Sitzungen brauchen, wenn Schwellenwerte einen scheiternden Lauf vorzeitig stoppen sollen oder wenn Sie mit einem quelloffenen Operator auf Kubernetes skalieren möchten.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist Gatling schneller als k6?&lt;/strong&gt;
Das haben wir nicht selbst gemessen, deshalb nennen wir keinen Sieger. Fair vergleichen lässt sich das nur mit demselben Szenario in beiden Tools auf Ihrer eigenen Hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann Gatling k6-Skripte ausführen?&lt;/strong&gt;
Nicht laut der Dokumentation von Gatling, die keinen Weg beschreibt, k6-Skripte auszuführen. Die beiden SDKs haben unterschiedliche APIs, und die &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;Konverter&lt;/a&gt; von Gatling decken JMeter und LoadRunner ab. Ein k6-Skript muss also als Gatling-Simulation neu geschrieben werden, auch mit dem JavaScript-SDK.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus Gatling-Tests ausführen?&lt;/strong&gt;
Nein. LoadFocus führt k6-Skripte und JMeter-Testpläne aus. Um eine Gatling-Simulation auf mehrere Rechner zu verteilen, nutzen Sie Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-load-testing/&quot;&gt;Gatling-Lasttests: das JVM-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery: welches Lasttest-Tool passt zu Ihrem Team?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: Tests als Code oder GUI-Testplan?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-locust/&quot;&gt;Gatling vs Locust: JVM-Simulationen oder Python-Locustfiles?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/grpc-load-testing/&quot;&gt;gRPC-Lasttest: Tools, Einrichtung und Kennzahlen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>GraphQL-API-Lasttest: ein praktischer Leitfaden</title><link>https://loadtest.app/de/how-to-load-test-a-graphql-api/</link><guid isPermaLink="true">https://loadtest.app/de/how-to-load-test-a-graphql-api/</guid><description>So gelingt ein GraphQL-API-Lasttest: jede Operation benennen, Abfragen und Mutationen mischen, Fehler hinter HTTP 200 finden, Caching und N+1 beobachten.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Für einen GraphQL-API-Lasttest skripten Sie die Operationen, die Ihre Clients tatsächlich senden, geben jeder im Testtool einen eigenen Namen und mischen sie mit wechselnden Variablen im selben Verhältnis wie in der Produktion. Prüfen Sie jeden Antwort-Body auf ein &lt;code&gt;errors&lt;/code&gt;-Array, denn ein GraphQL-Server antwortet meist mit HTTP 200, auch wenn ein Teil der Operation fehlgeschlagen ist. Steigern Sie dann die Last und beurteilen Sie jede Operation nach ihren eigenen Perzentilen.&lt;/p&gt;
&lt;p&gt;Quellen: graphql.org, der Entwurf der GraphQL-over-HTTP-Spezifikation und die Dokumentation der jeweiligen Tools, alles geprüft am 9. Oktober 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Operation benennen mit&lt;/th&gt;
&lt;th&gt;Antwort mit &lt;code&gt;errors&lt;/code&gt; scheitern lassen&lt;/th&gt;
&lt;th&gt;Variablen einspeisen aus&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;Ein &lt;code&gt;check()&lt;/code&gt; auf den geparsten Body&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;Dem Namen des Samplers&lt;/td&gt;
&lt;td&gt;JSON Assertion auf &lt;code&gt;$.errors&lt;/code&gt;, invertiert&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; oder dem GraphQL-Plugin&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;Feedern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;Einem &lt;code&gt;name&lt;/code&gt; an der Anfrage&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;Warum braucht eine GraphQL-API einen anderen Lasttest?&lt;/h2&gt;
&lt;p&gt;Weil jede Operation an dieselbe URL geht und die Arbeit dahinter von der Abfrage und ihren Variablen abhängt. Ein nach URL gruppierter Bericht wirft einen billigen Lookup und eine teure Suche in denselben Topf.&lt;/p&gt;
&lt;p&gt;Laut dem Leitfaden &lt;a href=&quot;https://graphql.org/learn/serving-over-http/&quot;&gt;Serving over HTTP&lt;/a&gt; von graphql.org arbeitet ein GraphQL-Server über einen einzigen Endpunkt, meist &lt;code&gt;/graphql&lt;/code&gt;. Operationen kommen dort per POST an, mit einem JSON-Body aus &lt;code&gt;query&lt;/code&gt;, einem optionalen &lt;code&gt;operationName&lt;/code&gt; und &lt;code&gt;variables&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Wie erhalten Sie Ergebnisse pro Operation?&lt;/h2&gt;
&lt;p&gt;Benennen Sie jede Anfrage nach ihrer GraphQL-Operation und lassen Sie das Tool seine Statistiken nach diesem Namen gruppieren. Jedes Tool hat dafür einen eigenen Schalter (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;k6&lt;/strong&gt;: Der &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/tags-and-groups/&quot;&gt;Leitfaden zu Tags und Gruppen&lt;/a&gt; empfiehlt &lt;code&gt;tags.name&lt;/code&gt;, um einer Anfrage einen sprechenden Namen zu geben, und &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;Thresholds&lt;/a&gt; können auf einen einzelnen Tag zielen, etwa &lt;code&gt;http_req_duration{name:GetProduct}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JMeter&lt;/strong&gt;: Der &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Aggregate_Report&quot;&gt;Aggregate Report&lt;/a&gt; legt für jede unterschiedlich benannte Anfrage eine eigene Zeile an. Seit JMeter 5.4 hat der Sampler &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#HTTP_Request&quot;&gt;GraphQL HTTP Request&lt;/a&gt; eigene Felder für Query, Variables und Operation Name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gatling&lt;/strong&gt;: Der &lt;a href=&quot;https://docs.gatling.io/reference/script/http/request/&quot;&gt;Name der Anfrage&lt;/a&gt; ist der Schlüssel für die Statistiken, und das &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/requests/&quot;&gt;GraphQL-Plugin&lt;/a&gt; benennt Anfragen nach der Operation, etwa &lt;code&gt;query GetUser&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Artillery&lt;/strong&gt;: Das &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/metrics-by-endpoint&quot;&gt;Plugin metrics-by-endpoint&lt;/a&gt; berichtet pro URL und ergänzt den Eintrag um den &lt;code&gt;name&lt;/code&gt; einer Anfrage, sodass benannte Operationen getrennt erscheinen; &lt;code&gt;useOnlyRequestNames: true&lt;/code&gt; lässt die URL weg und behält nur den Namen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Welche Operationen sollte der Test senden?&lt;/h2&gt;
&lt;p&gt;Die, die auch die Produktion erhält, im selben Verhältnis. Entnehmen Sie die Häufigkeit jeder Operation Ihren Server-Logs oder Ihrem GraphQL-Monitoring und machen Sie daraus einen gewichteten Mix aus Lesezugriffen und Mutationen.&lt;/p&gt;
&lt;p&gt;Verwenden Sie die Dokumente, die Ihre Clients ausliefern, in ihrer echten Tiefe, statt einer vereinfachten Abfrage. Speisen Sie Variablen aus einer Datei ein, damit der Server viele verschiedene Datensätze nachschlägt, statt ein einziges Ergebnis aus dem Cache zu liefern. Halten Sie auch die Zahl unterschiedlicher Operationen realistisch: Apollos &lt;a href=&quot;https://www.apollographql.com/docs/technotes/TN0035-load-testing-graphql&quot;&gt;Technote zum Lasttest von GraphQL&lt;/a&gt;, ein Herstellerdokument, erklärt, dass jede neue Operation vor der Ausführung geparst und validiert wird, und rät davon ab, weit mehr eindeutige Operationen zu erzeugen, als echte Clients senden.&lt;/p&gt;
&lt;p&gt;Mutationen verändern Daten, führen Sie sie also dort aus, wo sich die Daten zurücksetzen lassen. Die &lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Schritt-für-Schritt-Anleitung zum Lasttest&lt;/a&gt; behandelt Ziele und Ramp-up.&lt;/p&gt;
&lt;h2&gt;Warum kann eine Antwort mit HTTP 200 trotzdem ein Fehler sein?&lt;/h2&gt;
&lt;p&gt;Weil GraphQL Fehler im Antwort-Body meldet. Eine Anfrage kann Status 200 mit einem &lt;code&gt;errors&lt;/code&gt;-Array und unvollständigen Daten liefern, und eine reine Statusprüfung lässt sie durch.&lt;/p&gt;
&lt;p&gt;Die Seite &lt;a href=&quot;https://graphql.org/learn/response/&quot;&gt;Response&lt;/a&gt; auf graphql.org erklärt, dass die Ausführung weiterläuft, wenn ein Resolver fehlschlägt, und die Antwort dann &lt;code&gt;data&lt;/code&gt; neben &lt;code&gt;errors&lt;/code&gt; enthält. Der HTTP-Leitfaden ergänzt, dass eine solche Antwort trotzdem einen 2xx-Status erhalten soll, weil HTTP keinen Code für einen Teilerfolg kennt, und dass manche älteren Server sogar bei Validierungsfehlern mit 2xx antworten. Der &lt;a href=&quot;https://graphql.github.io/graphql-over-http/draft/&quot;&gt;Entwurf GraphQL over HTTP&lt;/a&gt; schlägt für Teilerfolge mit dem neueren Medientyp &lt;code&gt;application/graphql-response+json&lt;/code&gt; einen eigenen Status 294 vor.&lt;/p&gt;
&lt;p&gt;Im Lasttest schadet das doppelt. Fehler werden nicht gezählt, und Anfragen, die schnell scheitern, etwa an einem Tiefenlimit abgelehnte Operationen, drücken die Antwortzeiten nach unten.&lt;/p&gt;
&lt;h2&gt;Wie prüfen Sie das errors-Array in jedem Tool?&lt;/h2&gt;
&lt;p&gt;Parsen Sie den JSON-Body und lassen Sie die Anfrage scheitern, wenn &lt;code&gt;errors&lt;/code&gt; vorhanden ist. Jedes Tool bringt dafür ein eingebautes Mittel mit.&lt;/p&gt;
&lt;p&gt;In k6 erledigt das ein Check auf den geparsten Body, und ein Threshold auf die Metrik &lt;code&gt;checks&lt;/code&gt; lässt den Lauf scheitern, denn &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;Checks allein ändern den Exit-Code von k6 nicht&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; lädt die IDs einmal für alle virtuellen Benutzer. Das &lt;code&gt;try&lt;/code&gt; verhindert, dass ein Body, der kein JSON ist, etwa die Fehlerseite eines Proxys, die Iteration abbricht.&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;JMeter&lt;/strong&gt; fügen Sie eine &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#JSON_Assertion&quot;&gt;JSON Assertion&lt;/a&gt; mit dem Pfad &lt;code&gt;$.errors&lt;/code&gt; hinzu und setzen den Haken bei &amp;quot;Invert assertion&amp;quot;, damit das Sample scheitert, sobald der Pfad existiert. Ein &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#JSON_Extractor&quot;&gt;JSON Extractor&lt;/a&gt; übernimmt IDs in Variablen für die nächste Operation.&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;Gatling&lt;/strong&gt; ergänzen Sie &lt;code&gt;.check(jsonPath(&amp;quot;$.errors&amp;quot;).notExists())&lt;/code&gt;, beides aus der &lt;a href=&quot;https://docs.gatling.io/concepts/checks/&quot;&gt;Check-Referenz&lt;/a&gt;. Das GraphQL-Plugin prüft Status und Fehler standardmäßig, doch seine &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/setup/&quot;&gt;Setup-Seite&lt;/a&gt; begrenzt Läufe mit der Community Edition auf 5 Benutzer und 5 Minuten (geprüft am 9. Oktober 2026). Für größere Tests ohne Gatling Enterprise nehmen Sie normale HTTP-Anfragen mit diesem Check.&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;Artillery&lt;/strong&gt; bietet das &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/expect&quot;&gt;expect-Plugin&lt;/a&gt; &lt;code&gt;notHasProperty: &amp;quot;errors&amp;quot;&lt;/code&gt;, und &lt;code&gt;reportFailuresAsErrors: true&lt;/code&gt; bringt fehlgeschlagene Erwartungen in den Bericht. Ein &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/http&quot;&gt;&lt;code&gt;capture&lt;/code&gt;&lt;/a&gt; mit einem &lt;code&gt;json&lt;/code&gt;-Pfad trägt einen Wert in die nächste Anfrage.&lt;/p&gt;
&lt;h2&gt;Worauf sollten Sie neben den Antwortzeiten achten?&lt;/h2&gt;
&lt;p&gt;Auf Caching, Persisted Queries und die Datenbanklast pro Anfrage. Jedes davon kann einen Test schneller oder langsamer als die Produktion machen, aus Gründen, die mit der Kapazität nichts zu tun haben.&lt;/p&gt;
&lt;p&gt;Der &lt;a href=&quot;https://graphql.org/learn/performance/&quot;&gt;Performance-Leitfaden&lt;/a&gt; von graphql.org hält fest, dass per GET gesendete Abfragen HTTP- und CDN-Caching nutzen können und dass Persisted Queries einen Client statt des vollständigen Dokuments einen Hash senden lassen. Machen Ihre Clients das, sollte der Test es auch tun. Machen sie es nicht, misst ein Test, der eine Abfrage mit immer denselben Variablen wiederholt, einen Cache, den echter Traffic verfehlt. Apollos Technote ergänzt, dass Apollo Server, Gateway und der GraphOS Router Automatic Persisted Queries standardmäßig aktivieren.&lt;/p&gt;
&lt;p&gt;Derselbe Leitfaden beschreibt das N+1-Problem: Eine Liste, deren Resolver jedes Element einzeln lädt, macht aus einer Anfrage viele Datenbankabfragen, meist behoben durch Batching mit einem Tool wie DataLoader. Beobachten Sie Datenbankabfragen pro Sekunde neben Anfragen pro Sekunde; steigen sie unter wachsender Last viel schneller, ist ein Resolver der Verdächtige. Auch Tiefenlimits, Komplexitätslimits und Rate Limiting können während eines Tests greifen.&lt;/p&gt;
&lt;h2&gt;Woher sollte die Last kommen?&lt;/h2&gt;
&lt;p&gt;Von einem Rechner, solange Sie das Skript bauen und einen Smoke-Test fahren, dann aus der Cloud, wenn Sie mehr Last oder Traffic aus mehreren Regionen brauchen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://loadfocus.com/de-de/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 führt k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen aus. Dort kommen die Zahl der Benutzer und die Dauer aus den Testeinstellungen statt aus den &lt;code&gt;options&lt;/code&gt; des Skripts, und Arrival-Rate-Szenarien laufen mit einer festen Zahl von Benutzern statt mit einer festen Anfragerate, der Unterschied, den der Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen und geschlossenen Lastmodell&lt;/a&gt; erklärt. LoadFocus veröffentlicht außerdem eine &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;Vorlage für GraphQL-Endpunkte mit komplexen Abfragen&lt;/a&gt; (auf Englisch).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sollte ein GraphQL-Lasttest Abfragen per GET oder per POST senden?&lt;/strong&gt;
So, wie es Ihre Clients tun. graphql.org erlaubt GET nur für Abfragen, Mutationen müssen POST verwenden. Sendet die Produktion Persisted Queries per GET über ein CDN, testen Sie auch diesen Weg.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann dasselbe Skript auch GraphQL-Subscriptions unter Last setzen?&lt;/strong&gt;
Meist nicht. graphql.org weist darauf hin, dass Subscriptions langlebig sind und oft über WebSockets oder Server-Sent Events laufen, sie brauchen also ein eigenes Szenario in einem Tool, das dieses Transportprotokoll unterstützt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sollte eine Teilantwort als fehlgeschlagene Anfrage zählen?&lt;/strong&gt;
In den meisten Tests ja, denn der Client hat für einen Teil seiner Anfrage einen Fehler bekommen. Sind manche Fehler erwartet, etwa nicht gefundene Ergebnisse für gelöschte Datensätze, prüfen Sie gezielt auf diese Fehlercodes und lassen Sie den Rest scheitern.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Lasttest durchführen: eine Schritt-für-Schritt-Anleitung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-testing-in-github-actions/&quot;&gt;Lasttests in GitHub Actions: ein praktischer Leitfaden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/websocket-load-testing-tools/&quot;&gt;WebSocket-Lasttest-Tools: sechs Optionen im Vergleich&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/grpc-load-testing/&quot;&gt;gRPC-Lasttest: Tools, Einrichtung und Kennzahlen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>HTTP-Benchmark-Tools: wrk, hey, oha, ab und weitere</title><link>https://loadtest.app/de/http-benchmarking-tools/</link><guid isPermaLink="true">https://loadtest.app/de/http-benchmarking-tools/</guid><description>wrk, wrk2, hey, oha, ab, bombardier, autocannon und h2load im Vergleich: Ratensteuerung, HTTP/2, Latenzausgabe, Lizenz und die letzten Releases.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Die HTTP-Benchmark-Tools für die Kommandozeile, zu denen die meisten Teams greifen, sind wrk, wrk2, hey, oha, ab (Apache Bench), bombardier, autocannon und h2load. Nehmen Sie wrk2, wenn Sie eine konstante Anfragerate und ehrliche Tail-Latenzen brauchen, hey oder oha für einen schnellen Check, der auch HTTP/2 spricht, h2load, wenn HTTP/2 oder HTTP/3 selbst auf dem Prüfstand steht, und autocannon, wenn Ihr Team mit Node.js arbeitet.&lt;/p&gt;
&lt;p&gt;Wir haben die Tools nicht gegeneinander antreten lassen, deshalb finden Sie hier weder Geschwindigkeitswerte noch ein Urteil über das „schnellste“ Tool. Die Fakten stammen aus dem Repository, dem Handbuch oder der Release-Seite des jeweiligen Projekts (geprüft am 9. Oktober 2026); die Empfehlungen, wann welches Tool passt, sind unsere Einschätzung.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Geschrieben in&lt;/th&gt;
&lt;th&gt;Lizenz&lt;/th&gt;
&lt;th&gt;Ratensteuerung&lt;/th&gt;
&lt;th&gt;HTTP/2&lt;/th&gt;
&lt;th&gt;Letztes Release&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, LuaJIT-Skripte&lt;/td&gt;
&lt;td&gt;Modified Apache 2.0&lt;/td&gt;
&lt;td&gt;Keine&lt;/td&gt;
&lt;td&gt;Nicht dokumentiert&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/wg/wrk/tags&quot;&gt;Tag 4.2.0, Feb. 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;Konstant (&lt;code&gt;-R&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Nicht dokumentiert&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/giltene/wrk2/commits/master&quot;&gt;Keines, letzter Commit Sep. 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;Limit pro Worker (&lt;code&gt;-q&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Ja&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rakyll/hey/releases&quot;&gt;v0.1.5, Jan. 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;Gesamtlimit (&lt;code&gt;-q&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Ja, dazu HTTP/3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/hatoo/oha/releases&quot;&gt;v1.16.0, Aug. 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;Keine&lt;/td&gt;
&lt;td&gt;Nein&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://httpd.apache.org/download.cgi&quot;&gt;httpd 2.4.69, Okt. 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;Limit (&lt;code&gt;-r&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Ja&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/codesenberg/bombardier/releases&quot;&gt;v2.0.2, März 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;Limit (&lt;code&gt;-R&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Nein&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mcollina/autocannon/releases&quot;&gt;v8.0.0, Okt. 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;Pro Client (&lt;code&gt;--rps&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Ja, dazu HTTP/3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/nghttp2/nghttp2/releases&quot;&gt;nghttp2 v1.70.0, Juli 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;Konstant (&lt;code&gt;-rate&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Ja&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tsenart/vegeta/releases&quot;&gt;v12.13.0, Okt. 2025&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Warum ist es wichtig, ob ein Tool die Rate festhält?&lt;/h2&gt;
&lt;p&gt;Ein Tool mit einer festen Zahl von Verbindungen sendet weniger, sobald der Server langsamer wird, und seine Latenzwerte lassen dann die Zeit weg, die Anfragen mit Warten verbracht haben. Ein Tool mit fester Rate sendet nach Plan weiter, und die Verlangsamung zeigt sich in den Perzentilen.&lt;/p&gt;
&lt;p&gt;Die meisten Tools hier arbeiten mit einer festen Zahl von Verbindungen oder Workern (&lt;code&gt;-c&lt;/code&gt;), die jeweils auf eine Antwort warten, bevor sie weitersenden. Die &lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;README von wrk2&lt;/a&gt; nennt diesen blinden Fleck Coordinated Omission und misst jede Anfrage ab dem Zeitpunkt, zu dem sie hätte gesendet werden sollen. Auch &lt;a href=&quot;https://github.com/tsenart/vegeta&quot;&gt;Vegeta&lt;/a&gt; hält eine konstante Rate; mehr dazu in unserem Überblick über &lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools&lt;/a&gt;. oha und autocannon können ihre Latenzwerte um denselben Effekt korrigieren, wenn eine Rate gesetzt ist, während hey und bombardier ihre Ratenoptionen nur als Obergrenzen dokumentieren.&lt;/p&gt;
&lt;h2&gt;Lohnt sich wrk noch?&lt;/h2&gt;
&lt;p&gt;Ja, für einen schnellen Blick darauf, wie viel Last ein einzelner Rechner auf einen Endpunkt bringen kann, gelesen mit dem Vorbehalt von oben. Der neueste Tag stammt vom Februar 2021.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/wg/wrk&quot;&gt;wrk&lt;/a&gt; ist in C geschrieben und hält über mehrere Threads eine feste Zahl von Verbindungen offen. Optionale LuaJIT-Skripte können Anfragen bauen, Antworten verarbeiten und eigene Berichte schreiben, und &lt;code&gt;make&lt;/code&gt; baut das Tool zusammen mit dem mitgelieferten LuaJIT und OpenSSL. Ausgegeben werden Mittelwert, Standardabweichung und Maximum der Latenz; &lt;code&gt;--latency&lt;/code&gt; ergänzt das 50., 75., 90. und 99. Perzentil.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen wrk2, wenn Sie eine feste Anfragerate brauchen oder Tail-Latenzen, denen Sie auch bei einer Verlangsamung trauen können.&lt;/p&gt;
&lt;h2&gt;Wann brauchen Sie wrk2 statt wrk?&lt;/h2&gt;
&lt;p&gt;Wenn die Frage lautet, wie sich die Latenz bei einer bestimmten Anfragerate verhält. wrk2 hält diese Rate konstant und erfasst jede Latenz in einem HdrHistogram.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;wrk2&lt;/a&gt; ergänzt wrk um ein Durchsatz-Argument (&lt;code&gt;-R&lt;/code&gt;, Anfragen pro Sekunde). &lt;code&gt;--latency&lt;/code&gt; gibt das vollständige Perzentilspektrum aus, &lt;code&gt;--u_latency&lt;/code&gt; ergänzt zum Vergleich die unkorrigierten Werte. Die README warnt, dass Läufe unter 10 bis 20 Sekunden wegen einer 10-sekündigen Kalibrierungsphase wenig aussagen können, und bezeichnet das Projekt als experimentell. Releases gibt es keine, und das Makefile baut ein Binary, das ebenfalls &lt;code&gt;wrk&lt;/code&gt; heißt; halten Sie die beiden also auseinander.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen oha oder autocannon, wenn Sie eine Ratenoption mit Latenzkorrektur aus einem Projekt wollen, das noch gepflegt wird.&lt;/p&gt;
&lt;h2&gt;Sind hey und oha austauschbar?&lt;/h2&gt;
&lt;p&gt;Für schnelle Checks weitgehend: Beide lassen einen Pool von Workern für eine Anzahl Anfragen oder eine feste Dauer laufen, und beide sprechen HTTP/2. Sie unterscheiden sich bei der Ratenbegrenzung und darin, was Sie während eines Laufs sehen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rakyll/hey&quot;&gt;hey&lt;/a&gt; ist ein kleines Go-Programm mit fertigen Binaries für Linux, macOS und Windows und einer Homebrew-Formel. &lt;code&gt;-q&lt;/code&gt; begrenzt die Anfragen pro Sekunde für jeden Worker, &lt;code&gt;-h2&lt;/code&gt; schaltet HTTP/2 ein, und die Zusammenfassung enthält ein Antwortzeit-Histogramm und eine Latenzverteilung, mit &lt;code&gt;-o csv&lt;/code&gt; auch als CSV.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hatoo/oha&quot;&gt;oha&lt;/a&gt; ist in Rust geschrieben, von hey inspiriert und zeigt eine Live-Oberfläche im Terminal. Sein &lt;code&gt;-q&lt;/code&gt; setzt eine Gesamtrate, &lt;code&gt;--latency-correction&lt;/code&gt; korrigiert um Coordinated Omission, und &lt;code&gt;--http-version&lt;/code&gt; akzeptiert 1.1, 2 und in einem experimentellen Build auch 3. Installiert wird es über cargo, Homebrew, winget oder pacman, und es kann JSON oder CSV schreiben.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen hey, wenn ein Limit pro Worker zu Ihrer Vorstellung von Last passt; wählen Sie oha für HTTP/3, JSON oder Latenzkorrektur.&lt;/p&gt;
&lt;h2&gt;Sollten Sie ab noch verwenden?&lt;/h2&gt;
&lt;p&gt;Für einen schnellen Check auf einem Rechner, auf dem es schon installiert ist, ja. ab wird mit dem Apache HTTP Server ausgeliefert, und sein eigenes Handbuch nennt bekannte Grenzen.&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; nimmt eine Anzahl Anfragen (&lt;code&gt;-n&lt;/code&gt;) und eine Nebenläufigkeit (&lt;code&gt;-c&lt;/code&gt;) entgegen, hat keine Option für eine Rate oder für HTTP/2 und nutzt KeepAlive nur mit &lt;code&gt;-k&lt;/code&gt;. Die Ausgabe endet mit dem Anteil der Anfragen, die innerhalb einer bestimmten Zeit beantwortet wurden; diese Anteile schreibt ab auf Wunsch als CSV (&lt;code&gt;-e&lt;/code&gt;), jede einzelne Messung als gnuplot-Datei (&lt;code&gt;-g&lt;/code&gt;). Der Abschnitt „Bugs“ im Handbuch sagt, dass ab HTTP/1.x nicht vollständig implementiert, und warnt, dass Sie wegen des aufwendigen String-Parsings womöglich die Leistung von ab selbst messen.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen hey oder oha, wenn Sie HTTP/2, ein Ratenlimit oder standardmäßig Keep-Alive brauchen.&lt;/p&gt;
&lt;h2&gt;Wofür eignen sich bombardier und autocannon?&lt;/h2&gt;
&lt;p&gt;bombardier ist ein Go-Tool mit optionalem HTTP/2 und Ratenlimit. autocannon passt zu Node.js-Teams, weil es auch als Bibliothek in einem Node-Skript läuft.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/codesenberg/bombardier&quot;&gt;bombardier&lt;/a&gt; nutzt standardmäßig den fasthttp-Client und wechselt mit &lt;code&gt;--http1&lt;/code&gt; oder &lt;code&gt;--http2&lt;/code&gt; zum net/http-Client von Go. &lt;code&gt;-r&lt;/code&gt; setzt ein Ratenlimit, &lt;code&gt;-l&lt;/code&gt; gibt das 50., 75., 90. und 99. Perzentil aus, und &lt;code&gt;-o json&lt;/code&gt; macht das Ergebnis maschinenlesbar.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mcollina/autocannon&quot;&gt;autocannon&lt;/a&gt; beschreibt sich als HTTP/1.1-Tool mit Pipelining und HTTPS und wird mit &lt;code&gt;npm i autocannon -g&lt;/code&gt; installiert. &lt;code&gt;-R&lt;/code&gt; begrenzt die Gesamtrate, &lt;code&gt;-r&lt;/code&gt; die Rate pro Verbindung, und sobald eine davon gesetzt ist, wird die Latenz um Coordinated Omission korrigiert. Die Tabelle zeigt das 2,5., 50., 97,5. und 99. Perzentil, &lt;code&gt;-l&lt;/code&gt; gibt alle aus und &lt;code&gt;-j&lt;/code&gt; schreibt JSON.&lt;/p&gt;
&lt;p&gt;Wählen Sie autocannon statt bombardier, wenn Ihre Benchmarks in einer Node.js-Testsuite leben, und bombardier, wenn Sie HTTP/2 brauchen.&lt;/p&gt;
&lt;h2&gt;Welches Tool ist für HTTP/2 und HTTP/3 gebaut?&lt;/h2&gt;
&lt;p&gt;h2load. Es stammt aus dem nghttp2-Projekt, bevorzugt HTTP/2 und kann HTTP/1.1 erzwingen oder, wenn mit Unterstützung gebaut, 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; wird zusammen mit nghttp2 kompiliert, wenn Sie &lt;code&gt;./configure&lt;/code&gt; die Option &lt;code&gt;--enable-app&lt;/code&gt; mitgeben. Neben der Zahl der Clients (&lt;code&gt;-c&lt;/code&gt;) legt es die gleichzeitigen Streams pro Client fest (&lt;code&gt;-m&lt;/code&gt;), um Multiplexing unter Last zu prüfen, und &lt;code&gt;--rps&lt;/code&gt; setzt die Anfragen pro Sekunde für jeden Client. Das &lt;a href=&quot;https://nghttp2.org/documentation/h2load.1.html&quot;&gt;Handbuch&lt;/a&gt; nennt Minimum, Maximum, Mittelwert, Median, p95 und p99 für Anfragezeit, Verbindungsaufbau und Zeit bis zum ersten Byte. Die HTTP/3-Unterstützung ist als experimentell gekennzeichnet.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen oha, wenn Sie HTTP/2 mit weniger Optionen und einer Live-Ansicht wollen.&lt;/p&gt;
&lt;h2&gt;Wann sollten Sie vom Benchmark zu einem echten Lasttest wechseln?&lt;/h2&gt;
&lt;p&gt;Wenn es um Nutzerabläufe geht, um mehr Last, als ein Rechner erzeugen kann, oder um Traffic von dort, wo Ihre Nutzer sind.&lt;/p&gt;
&lt;p&gt;Jedes Tool hier schickt einfache Anfragen von einem einzigen Rechner, und die h2load-Anleitung weist darauf hin, dass der Client selbst zum Engpass werden kann. Wechseln Sie zu einem Lasttest-Tool, wenn Sie Logins, mehrstufige Abläufe oder Think Time brauchen, wenn der Traffic aus mehreren Regionen kommen muss oder wenn ein Test in der CI bestehen oder scheitern soll. Unsere Anleitung &lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Lasttest durchführen&lt;/a&gt; geht das Schritt für Schritt durch, und &lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; vergleicht zwei skriptbare Tools.&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=http-benchmarking-tools&quot;&gt;führt Lasttests&lt;/a&gt; für Websites und APIs aus 25 Cloud-Regionen aus, mit JMeter, k6 oder No-Code-Tests. Wenn Ihr Benchmark eine Anfrage ist, die Sie ohnehin mit curl senden, macht der kostenlose &lt;a href=&quot;https://loadfocus.com/de-de/curl-to-k6?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=http-benchmarking-tools&quot;&gt;cURL-zu-k6-Konverter&lt;/a&gt; daraus direkt im Browser ein k6-Skript.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Was ist der Unterschied zwischen wrk und wrk2?&lt;/strong&gt;
wrk2 ist ein Fork von wrk, der Anfragen mit einer konstanten, per &lt;code&gt;-R&lt;/code&gt; gesetzten Rate sendet und jede Anfrage ab dem Zeitpunkt misst, zu dem sie hätte gesendet werden sollen. wrk hält eine feste Zahl von Verbindungen beschäftigt und hat keine Ratenoption.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welche HTTP-Benchmark-Tools unterstützen HTTP/2?&lt;/strong&gt;
Laut ihrer Dokumentation hey, oha, bombardier, h2load und Vegeta. wrk und wrk2 dokumentieren es nicht, autocannon beschreibt sich als HTTP/1.1-Tool, und ab hat keine HTTP/2-Option.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools: sechs Optionen im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission: was es ist und wie man es vermeidet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/websocket-load-testing-tools/&quot;&gt;WebSocket-Lasttest-Tools: sechs Optionen im Vergleich&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tail-latency/&quot;&gt;Tail-Latenz: was sie ist und wie man sie misst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/redis-benchmark/&quot;&gt;redis-benchmark: richtig nutzen und die Zahlen lesen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Little&apos;s Law im Lasttest: Tests dimensionieren und prüfen</title><link>https://loadtest.app/de/littles-law-load-testing/</link><guid isPermaLink="true">https://loadtest.app/de/littles-law-load-testing/</guid><description>Little&apos;s Law im Lasttest erklärt: wie Benutzer, Anfragerate und Antwortzeit zusammenhängen, wie Sie Tests planen und wo die Formel nicht mehr greift.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Little&amp;#39;s Law im Lasttest besagt, dass die durchschnittliche Zahl der Benutzer oder Anfragen in einem System gleich der Rate ist, mit der sie es durchlaufen, mal der durchschnittlichen Zeit, die jede dort verbringt: L = λW. Bei einer festen Zahl virtueller Benutzer heißt das Benutzer = Durchläufe pro Sekunde × (Antwortzeit + Think Time), und damit sehen Sie vor einem Lauf, ob ein Plan seine Zielrate erreichen kann, und danach, ob die Ergebnisse zusammenpassen. Die Formel arbeitet mit Durchschnitten über eine stabile Phase des Tests und sagt deshalb nichts über Perzentile.&lt;/p&gt;
&lt;p&gt;Die Rechenbeispiele unten sind reine Arithmetik ohne Testlauf dahinter. Die Fakten zu Tools stammen aus der Dokumentation der jeweiligen Projekte, geprüft am 9. Oktober 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Größe&lt;/th&gt;
&lt;th&gt;Littles Definition&lt;/th&gt;
&lt;th&gt;Feste virtuelle Benutzer (geschlossenes Modell)&lt;/th&gt;
&lt;th&gt;Ankunftsrate (offenes Modell)&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;Durchschnittliche Zahl der Einheiten im System&lt;/td&gt;
&lt;td&gt;Virtuelle Benutzer, wartend oder pausierend&lt;/td&gt;
&lt;td&gt;Laufende Iterationen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;λ&lt;/td&gt;
&lt;td&gt;Durchschnittliche Ankunftsrate&lt;/td&gt;
&lt;td&gt;Abgeschlossene Durchläufe pro Sekunde&lt;/td&gt;
&lt;td&gt;Die eingestellte Rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;W&lt;/td&gt;
&lt;td&gt;Durchschnittliche Verweilzeit&lt;/td&gt;
&lt;td&gt;Antwortzeit + Think Time pro Durchlauf&lt;/td&gt;
&lt;td&gt;Dauer einer Iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was besagt Little&amp;#39;s Law?&lt;/h2&gt;
&lt;p&gt;Die langfristige durchschnittliche Zahl der Einheiten in einem Warteschlangensystem ist gleich ihrer durchschnittlichen Ankunftsrate mal der durchschnittlichen Zeit, die jede darin verbringt. Kennen Sie zwei der drei Größen, können Sie die dritte ausrechnen.&lt;/p&gt;
&lt;p&gt;John D. C. Little veröffentlichte den Beweis 1961 in Operations Research unter dem Titel &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;. In seinem &lt;a href=&quot;https://doi.org/10.1287/opre.1110.0940&quot;&gt;Rückblick zum 50. Jubiläum&lt;/a&gt; von 2011 schreibt er, dass das Gesetz unter bemerkenswert allgemeinen Bedingungen gilt: für eine einzelne Warteschlange wie für ein ganzes Netz, für eine Teilklasse der Einheiten wie für alle, und unabhängig von der Bedienreihenfolge. Derselbe Text überträgt die Größen auf einen Server: Anfragen in Bearbeitung, Anfragen pro Sekunde und durchschnittliche Antwortzeit.&lt;/p&gt;
&lt;h2&gt;Was bedeuten L, λ und W in einem Lasttest?&lt;/h2&gt;
&lt;p&gt;Das hängt davon ab, wo Sie die Systemgrenze ziehen. Um den Server herum ist L die Zahl der laufenden Anfragen und W die Antwortzeit; um den ganzen Durchlauf eines virtuellen Benutzers herum ist L die Zahl aller virtuellen Benutzer und W die Antwortzeit plus Think Time.&lt;/p&gt;
&lt;p&gt;In einem geschlossenen Test ist jeder Benutzer immer irgendwo in seinem Durchlauf: Er wartet auf eine Antwort oder pausiert zwischen zwei Schritten. Mit der Grenze um den Durchlauf zählen alle als „im System“, λ ist die Rate, mit der Durchläufe enden, und W die durchschnittliche Dauer eines Durchlaufs, einschließlich der &lt;a href=&quot;https://loadtest.app/de/think-time-in-load-testing/&quot;&gt;Think Time&lt;/a&gt;, die das Skript einfügt:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Benutzer = Durchläufe pro Sekunde × (Antwortzeit + Think Time)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Um den Server herum liefert dasselbe Gesetz die gleichzeitig laufenden Anfragen: Anfragen pro Sekunde × durchschnittliche Antwortzeit, also die Zahl, die Ihre Connection-Pools und Worker-Threads aufnehmen müssen. Halten Sie alle drei Werte auf derselben Grenze und im selben Zeitabschnitt; gemischte Werte ergeben plausible, aber falsche Ergebnisse.&lt;/p&gt;
&lt;h2&gt;Wie dimensionieren Sie einen geschlossenen Test mit Little&amp;#39;s Law?&lt;/h2&gt;
&lt;p&gt;Rechnen Sie die Zielrate der Anfragen in Durchläufe pro Sekunde um und multiplizieren Sie mit der erwarteten Dauer eines Durchlaufs: Das Ergebnis ist die Zahl der virtuellen Benutzer, die der Plan braucht. Nehmen Sie die Antwortzeit, die Sie unter der Ziellast erwarten; sie liegt meist höher als bei wenigen Benutzern.&lt;/p&gt;
&lt;p&gt;Ein Rechenbeispiel, nur Arithmetik. Ziel sind 100 Anfragen pro Sekunde, jeder Durchlauf schickt 4 Anfragen mit erwarteten 0,5 Sekunden pro Anfrage, und das Skript pausiert 3-mal im Schnitt 2 Sekunden:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Durchläufe pro Sekunde = 100 Anfragen/s ÷ 4 Anfragen = 25
Dauer pro Durchlauf    = 4 × 0,5 s + 3 × 2 s         = 8 s
virtuelle Benutzer     = 25 Durchläufe/s × 8 s       = 200
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Betrachten Sie 200 als Untergrenze. Dauern die Antworten unter dieser Last 1 Sekunde, wird ein Durchlauf 10 Sekunden lang, und dasselbe Ziel braucht 250 Benutzer.&lt;/p&gt;
&lt;h2&gt;Warum schicken dieselben Benutzer weniger Anfragen, wenn das System langsamer wird?&lt;/h2&gt;
&lt;p&gt;Die Zahl der Benutzer ist fest, also müssen die Durchläufe pro Sekunde sinken, wenn ein Durchlauf länger dauert. Die Last fällt genau dann, wenn das System zu kämpfen beginnt.&lt;/p&gt;
&lt;p&gt;Bleiben Sie bei den 200 Benutzern und lassen Sie jede Anfrage 2 Sekunden dauern. Ein Durchlauf dauert dann 4 × 2 + 6 = 14 Sekunden, und 200 ÷ 14 ergibt etwa 14,3 Durchläufe oder etwa 57 Anfragen pro Sekunde. Der Test zeigt weiter 200 Benutzer an, läuft aber nur mit gut der Hälfte der geplanten Rate. Der Artikel zum &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenen vs geschlossenen Lastmodell&lt;/a&gt; erklärt, warum das eine Sättigung verbirgt; Little&amp;#39;s Law sagt die Größe des Einbruchs voraus.&lt;/p&gt;
&lt;p&gt;Es zeigt auch, wie eine Kapazitätsgrenze aussieht. Kann die Anfragerate nicht weiter steigen, bringt jeder zusätzliche Benutzer nur Wartezeit: Bei einer Obergrenze von 25 Durchläufen pro Sekunde bedeuten 300 Benutzer 12 Sekunden pro Durchlauf und 400 Benutzer 16. Das LoadFocus-Diagramm &lt;a href=&quot;https://loadfocus.com/docs/de-de/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;Antwortzeit vs. virtuelle Benutzer&lt;/a&gt; trägt die durchschnittliche und maximale Antwortzeit gegen die Zahl aktiver virtueller Benutzer auf, ein Punkt pro erreichter Benutzerstufe; dort zeigt sich dieser gleichmäßige Anstieg.&lt;/p&gt;
&lt;h2&gt;Wie prüfen Sie einen abgeschlossenen Test mit Little&amp;#39;s Law?&lt;/h2&gt;
&lt;p&gt;Nehmen Sie die durchschnittliche Anfragerate und Antwortzeit aus einem Abschnitt mit konstanter Benutzerzahl, rechnen Sie daraus die Zahl der Benutzer zurück und vergleichen Sie sie mit Ihrer Konfiguration. Eine große Lücke heißt, dass Zeit an einer Stelle verloren geht, die Ihre Zahlen nicht zeigen.&lt;/p&gt;
&lt;p&gt;Noch ein Rechenbeispiel. Ein Lauf hält 200 Benutzer und meldet 80 Anfragen pro Sekunde bei durchschnittlich 0,6 Sekunden, mit denselben 4 Anfragen und 6 Sekunden Pausen pro Durchlauf. Das sind 20 Durchläufe pro Sekunde zu je 4 × 0,6 + 6 = 8,4 Sekunden, genug für 168 Benutzer. Die übrigen 32 bedeuten, dass jeder Durchlauf in Wahrheit 10 Sekunden dauerte, also bleiben etwa 1,6 Sekunden pro Durchlauf unerklärt. Wo Sie suchen sollten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verbindungsaufbau. In k6 enthält &lt;code&gt;http_req_duration&lt;/code&gt; weder DNS-Auflösung noch Verbindungsaufbau (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;Metrik-Referenz&lt;/a&gt;, geprüft am 9. Oktober 2026).&lt;/li&gt;
&lt;li&gt;Der Lastgenerator. Ein ausgelasteter Generator verzögert das Skript zwischen den Anfragen.&lt;/li&gt;
&lt;li&gt;Think Time. Zufällige Pausen können im Schnitt länger ausfallen als im Plan.&lt;/li&gt;
&lt;li&gt;Das Zeitfenster. Überschneidet es sich mit einer Rampe, waren im Schnitt weniger Benutzer aktiv.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;k6 misst den Durchlauf auch direkt: &lt;code&gt;vus&lt;/code&gt; zählt die aktiven virtuellen Benutzer und &lt;code&gt;iteration_duration&lt;/code&gt; die Dauer einer vollständigen Iteration, also sollten die aktiven Benutzer nahe bei Iterationen pro Sekunde × durchschnittlicher Iterationsdauer liegen.&lt;/p&gt;
&lt;h2&gt;Was gilt für Tests mit Ankunftsrate?&lt;/h2&gt;
&lt;p&gt;Das Gesetz gilt mit der Grenze um jede Iteration: Die laufenden Iterationen sind gleich der Ankunftsrate mal der Iterationsdauer. So viele virtuelle Benutzer muss das Tool bereithalten.&lt;/p&gt;
&lt;p&gt;Die k6-Anleitung zur &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/arrival-rate-vu-allocation/&quot;&gt;VU-Zuteilung für Arrival-Rate-Executors&lt;/a&gt; schätzt sie als mediane Iterationsdauer × Rate plus eine Konstante für die Streuung (geprüft am 9. Oktober 2026). Das ist Little&amp;#39;s Law mit dem Median an Stelle des Mittelwerts; einige langsame Iterationen ziehen den Mittelwert über den Median, deshalb zählt der Puffer.&lt;/p&gt;
&lt;p&gt;LoadFocus führt &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=littles-law-load-testing&quot;&gt;k6-Skripte&lt;/a&gt; in seiner Cloud aus, und dort laufen Arrival-Rate-Szenarien mit einer festen Zahl von Benutzern; der Skript-Validator weist beim Hinzufügen eines solchen Skripts darauf hin. Dimensionieren Sie diese Tests mit der Rechnung für das geschlossene Modell und rechnen Sie damit, dass die Rate fällt, wenn die Antworten langsamer werden.&lt;/p&gt;
&lt;h2&gt;Wo hört Little&amp;#39;s Law auf zu funktionieren?&lt;/h2&gt;
&lt;p&gt;Das Gesetz verknüpft Durchschnitte über einen Abschnitt, in dem das System im Gleichgewicht ist. Perzentile, kurze Zeitfenster und Rampen liegen außerhalb davon.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nur Durchschnitte. Ein Lauf kann das Gesetz erfüllen, während jede zwanzigste Anfrage zehnmal so lange wartet wie der Mittelwert; bewerten Sie Ergebnisse also auch nach Perzentilen.&lt;/li&gt;
&lt;li&gt;Eine stabile Phase. Der Beweis von 1961 setzt einen stationären Prozess voraus, und der Rückblick von 2011 zeigt, dass die Formel auch über ein endliches Zeitfenster exakt gilt, das leer beginnt und leer endet. Ein Testplateau ist beides nicht, also wählen Sie ein langes, in dem so viele Benutzer Durchläufe beenden, wie neue beginnen.&lt;/li&gt;
&lt;li&gt;Rampen. Während Benutzer hinzukommen, ist die konfigurierte Spitze nicht L: Nehmen Sie die zeitlich gemittelte Benutzerzahl des Fensters oder lassen Sie die Rampe weg.&lt;/li&gt;
&lt;li&gt;Fehler. Schnelle Fehlschläge zählen als abgeschlossene Anfragen mit kurzer Dauer, sodass auch ein versagendes System die Gleichung erfüllt. Prüfen Sie zuerst die Fehlerrate.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Braucht Little&amp;#39;s Law Poisson-Ankünfte oder eine bestimmte Warteschlange?&lt;/strong&gt;
Nein. Die Beweise in Littles Rückblick setzen nichts über das Ankunftsmuster oder die Bedienzeiten voraus, und das Ergebnis gilt unabhängig von der Bedienreihenfolge. Nötig sind nur Durchschnitte, die über den gemessenen Zeitraum existieren.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann Little&amp;#39;s Law p95-Antwortzeiten vorhersagen?&lt;/strong&gt;
Nein. Es verknüpft drei Durchschnitte und kann daher eine mittlere Antwortzeit prüfen, sagt aber nichts über die Form der Verteilung oder die langsamsten paar Prozent.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/think-time-in-load-testing/&quot;&gt;Think Time im Lasttest: was sie ist und wie man sie wählt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Lasttest durchführen: eine Schritt-für-Schritt-Anleitung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/redis-benchmark/&quot;&gt;redis-benchmark: richtig nutzen und die Zahlen lesen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/amdahls-law/&quot;&gt;Amdahlsches Gesetz: Formel, Beispiele und Grenzen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/queueing-theory/&quot;&gt;Warteschlangentheorie: was sie ist und warum Latenz steigt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Pass/Fail-Kriterien für Lasttests: so legen Sie sie fest</title><link>https://loadtest.app/de/load-test-pass-fail-criteria/</link><guid isPermaLink="true">https://loadtest.app/de/load-test-pass-fail-criteria/</guid><description>So legen Sie Pass/Fail-Kriterien für Lasttests fest: vom SLO ausgehen, Grenzen für Latenz, Fehler und Rate wählen, Warnungen trennen und je Tool umsetzen.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Pass/Fail-Kriterien für Lasttests sind die wenigen Grenzwerte, die ein Lauf einhalten muss, um als bestanden zu gelten: ein Latenz-Perzentil für die Anfragen, auf die Nutzer warten, eine Fehlerrate und eine Mindestrate an Anfragen, jeweils bei einer festgelegten Last. Leiten Sie die Grenzwerte aus einem Service Level Objective (SLO) ab, legen Sie Regressionsgrenzen aus früheren Läufen innerhalb davon fest und lassen Sie den Exit-Code des Tools den Lauf nur an diesen harten Grenzwerten scheitern. Alles andere ist eine Warnung, die ein Mensch liest.&lt;/p&gt;
&lt;p&gt;Die Angaben zu den Tools wurden am 9. Oktober 2026 in der Dokumentation des jeweiligen Projekts geprüft, und jeder gezeigte Grenzwert ist ein Beispiel.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kriterium&lt;/th&gt;
&lt;th&gt;Beispielgrenze&lt;/th&gt;
&lt;th&gt;Woher die Zahl kommt&lt;/th&gt;
&lt;th&gt;Bei Verfehlen&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;p95-Latenz, Checkout&lt;/td&gt;
&lt;td&gt;Unter 400 ms&lt;/td&gt;
&lt;td&gt;Latenz-SLO minus Reserve&lt;/td&gt;
&lt;td&gt;Fehlschlag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p99-Latenz, Checkout&lt;/td&gt;
&lt;td&gt;Unter 1.200 ms&lt;/td&gt;
&lt;td&gt;Frühere Läufe dieses Tests&lt;/td&gt;
&lt;td&gt;Warnung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fehlerrate&lt;/td&gt;
&lt;td&gt;Unter 0,5 %&lt;/td&gt;
&lt;td&gt;Verfügbarkeits-SLO&lt;/td&gt;
&lt;td&gt;Fehlschlag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anfragen pro Sekunde&lt;/td&gt;
&lt;td&gt;Mindestens 95 % des Plans&lt;/td&gt;
&lt;td&gt;Die geplante Last&lt;/td&gt;
&lt;td&gt;Fehlschlag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU des Lastgenerators&lt;/td&gt;
&lt;td&gt;Unter 80 %&lt;/td&gt;
&lt;td&gt;Tool oder Plattform&lt;/td&gt;
&lt;td&gt;Lauf ungültig&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Wann besteht ein Lasttest, und wann scheitert er?&lt;/h2&gt;
&lt;p&gt;Ein Lauf besteht, wenn jeder harte Grenzwert bei der geplanten Last hält, und scheitert, sobald einer verfehlt wird. Ungültig ist er, wenn der Test selbst seine Aufgabe nicht erfüllt hat, ganz gleich, was die Zahlen sagen.&lt;/p&gt;
&lt;p&gt;Ein ausgelasteter Lastgenerator, eine Last, die ihr Ziel nie erreicht hat, oder ein fehlerhaftes Skript liefern Zahlen über den Testaufbau. LoadFocus zeigt zum Beispiel eine Warnung zur &lt;a href=&quot;https://loadfocus.com/docs/de-de/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;Sättigung des Lastgenerators&lt;/a&gt;, wenn eine Engine in der Spitze 80 % CPU oder mehr erreicht hat. Die &lt;a href=&quot;https://github.com/grafana/k6/blob/master/errext/exitcodes/codes.go&quot;&gt;Exit-Codes von k6&lt;/a&gt; trennen die Fälle für die CI: 99 steht für verfehlte Schwellenwerte, 107 für eine Exception im Skript (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie wird aus einem SLO ein Kriterium für den Lasttest?&lt;/h2&gt;
&lt;p&gt;Formulieren Sie jedes SLO, das unter Last brechen kann, meist Latenz und Verfügbarkeit, als Grenzwert für das, was der Test misst, und machen Sie ihn strenger als das SLO, damit ein Bestehen Luft lässt.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sre.google/sre-book/service-level-objectives/&quot;&gt;Googles SRE-Buch&lt;/a&gt; definiert ein SLO als Zielwert oder Wertebereich für ein Service-Level, gemessen durch einen Indikator (SLI), mit Beispielen wie: 99 % der &lt;code&gt;Get&lt;/code&gt;-Aufrufe sind in unter 100 ms fertig. Es verlangt, dass ein SLO angibt, wie es gemessen wird und wann es gilt, und empfiehlt eine Sicherheitsreserve: ein internes Ziel, das strenger ist als das, was Nutzer zugesagt bekommen.&lt;/p&gt;
&lt;p&gt;Bei einem Lasttest bedeutet „wann es gilt“ die Last und den Anfragemix. Aus „95 % der Checkout-Aufrufe unter 500 ms“ könnte zum Beispiel „p95 des Checkouts unter 400 ms bei 300 Anfragen pro Sekunde über 15 Minuten“ werden. Gibt es noch kein SLO, vereinbaren Sie ein vorläufiges mit dem Product Owner.&lt;/p&gt;
&lt;h2&gt;Welche Metriken sollten die Kriterien abdecken?&lt;/h2&gt;
&lt;p&gt;Latenz für die Anfragen, auf die Nutzer warten, eine Fehlerrate, die erreichte Anfragerate und, meist als Warnung, die Ressourcen der Server.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Latenz pro Anfragetyp.&lt;/strong&gt; Ein globales Perzentil mischt einen schnellen Health Check mit einer langsamen Suche. In k6 &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;erzeugen getaggte Anfragen Sub-Metriken&lt;/a&gt; mit eigenen Grenzwerten; in Gatling zielt &lt;code&gt;details()&lt;/code&gt; auf eine einzelne Anfrage oder Gruppe. Ein Test, der seine eigene Last gebremst hat, meldet geschönte Perzentile (&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fehler, weit gefasst.&lt;/strong&gt; Eine schnelle 200 mit Fehlerseite bleibt ein Fehler, prüfen Sie also den Inhalt. Eine fehlgeschlagene JMeter-&lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Response_Assertion&quot;&gt;Response Assertion&lt;/a&gt; markiert ihr Sample als nicht erfolgreich; k6-Checks wirken nur über einen Schwellenwert auf den Exit-Code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eine Untergrenze für die Anfragerate.&lt;/strong&gt; Im geschlossenen Lastmodell erhält ein langsames System weniger Anfragen, sodass ein Lauf seine Latenzgrenzen bei einem Bruchteil der geplanten Last einhalten kann (&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;offenes vs geschlossenes Lastmodell&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ressourcen der Server.&lt;/strong&gt; CPU, Speicher und Pool-Auslastung kommen aus Ihrem Monitoring. Behandeln Sie sie als Warnungen, solange kein Kapazitätsplan eine harte Obergrenze setzt.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wie wählt man die Zahlen?&lt;/h2&gt;
&lt;p&gt;Die Obergrenze kommt aus dem SLO, die Regressionsgrenze aus früheren Läufen desselben Tests. Das SLO sagt, was Nutzer hinnehmen; frühere Läufe zeigen, was dieser Build normalerweise leistet.&lt;/p&gt;
&lt;p&gt;Das SRE-Buch warnt davor, ein SLO aus der aktuellen Performance abzuleiten. Eine Regressionsgrenze soll Veränderungen bemerken, also ist die aktuelle Performance genau ihr Ausgangspunkt. Lassen Sie den unveränderten Build mehrmals mit derselben Umgebung und Last laufen, notieren Sie, wie weit jede Metrik schwankt, und setzen Sie die Grenze mit etwas Reserve über den schlechtesten Lauf, aber unter die aus dem SLO abgeleitete Obergrenze, wo es eine gibt.&lt;/p&gt;
&lt;p&gt;Schwanken Läufe desselben Builds stärker als die Regression, die Sie erkennen wollen, ist der Test zu verrauscht, um Builds zu blockieren: Verlängern Sie zuerst die stabile Phase oder isolieren Sie die Umgebung. Erfassen Sie nach jeder bewussten Änderung neue Referenzläufe.&lt;/p&gt;
&lt;h2&gt;Welche Kriterien sollten den Build scheitern lassen, und welche nur warnen?&lt;/h2&gt;
&lt;p&gt;Lassen Sie den Build an Grenzwerten scheitern, die aus einem SLO stammen oder Korrektheit prüfen. Warnen Sie bei Tail-Perzentilen, Ressourcenverbrauch und langsamen Drifts, die eine Einschätzung brauchen; ein Gate, das an Rauschen scheitert, wird bald abgeschaltet.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;&lt;code&gt;ensure&lt;/code&gt;-Plugin&lt;/a&gt; von Artillery hat eine Warnstufe: Eine Bedingung mit &lt;code&gt;strict: false&lt;/code&gt; ist optional, ein Verfehlen lässt den Exit-Code also unberührt (geprüft am 9. Oktober 2026). In k6 lässt ein Check ohne Schwellenwert den Lauf nie scheitern. In anderen Tools gehören Warnungen nicht in die 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;Wann sollte ein Lasttest vorzeitig abbrechen?&lt;/h2&gt;
&lt;p&gt;Wenn Weitermachen nur schaden oder nichts mehr beweisen kann: Fehler weit über der Grenze, ein System, das schon ausgefallen ist, oder ein Generator, der nicht mehr mithält. Geben Sie der Regel eine Schonfrist, damit Rauschen beim Start sie nicht auslöst.&lt;/p&gt;
&lt;p&gt;Setzen Sie Abbruchregeln lockerer an als die Grenzen fürs Bestehen: Sie schützen eine gemeinsam genutzte Umgebung. &lt;code&gt;abortOnFail&lt;/code&gt; stoppt einen k6-Test, sobald ein Schwellenwert verfehlt ist, nach einem optionalen &lt;code&gt;delayAbortEval&lt;/code&gt;. Die &lt;a href=&quot;https://docs.locust.io/en/stable/extending-locust.html&quot;&gt;Doku von Locust zu Erweiterungen&lt;/a&gt; zeigt ein Greenlet im Hintergrund, das den Lauf beendet, sobald die Fehlerquote eine Schwelle überschreitet. &lt;a href=&quot;https://docs.gatling.io/concepts/scenario/&quot;&gt;&lt;code&gt;crashLoadGeneratorIf&lt;/code&gt;&lt;/a&gt; stoppt in Gatling den Generator mit einem Fehlercode, wenn eine Bedingung in der Session eines virtuellen Benutzers zutrifft. Eine JMeter-&lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; kann den Test bei einem Sampler-Fehler stoppen, was zu einer Korrektheitsprüfung passt (alles geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie setzt jedes Tool die Kriterien um?&lt;/h2&gt;
&lt;p&gt;k6 und Artillery machen aus einem verfehlten harten Grenzwert einen Exit-Code ungleich null, Locust tut das bei jeder fehlgeschlagenen Anfrage oder bei selbst programmierten Grenzwerten, und die Assertions von Gatling lassen den Build scheitern. JMeter überlässt das Urteil einem Schritt nach dem Lauf.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6&lt;/strong&gt;: Die &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;Schwellenwerte&lt;/a&gt; stehen in den Optionen des Skripts. Dieses Beispiel scheitert am p95 der mit &lt;code&gt;name: checkout&lt;/code&gt; getaggten Anfragen oder an 0,5 % Fehlern und bricht nach einer Minute ab, wenn die Fehler 5 % übersteigen:&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;: Die &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;Assertions&lt;/a&gt; verbinden einen Geltungsbereich (&lt;code&gt;global&lt;/code&gt;, &lt;code&gt;forAll&lt;/code&gt;, &lt;code&gt;details&lt;/code&gt;), eine Statistik wie ein Perzentil oder &lt;code&gt;requestsPerSec&lt;/code&gt; und eine Bedingung. Sie werden nach dem Lauf ausgewertet, und eine fehlgeschlagene Assertion lässt die Simulation scheitern.&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;beendet sich mit Exit-Code 1, wenn mindestens eine Anfrage fehlgeschlagen ist&lt;/a&gt;, und &lt;code&gt;--exit-code-on-error&lt;/code&gt; ändert diesen Code. Für eine Quote oder ein Perzentil setzen Sie &lt;code&gt;environment.process_exit_code&lt;/code&gt; in einem &lt;code&gt;quitting&lt;/code&gt;-Listener; laut &lt;a href=&quot;https://github.com/locustio/locust/blob/master/locust/main.py&quot;&gt;Quellcode von Locust&lt;/a&gt; hat dieser Wert Vorrang.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt; bewertet mit Assertions einzelne Samples, und seine &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;Kommandozeilenoptionen&lt;/a&gt; kennen keinen Grenzwert für den ganzen Lauf. Die CI entscheidet: mit einem kurzen Skript über die Ergebnisdatei, wie in unserem &lt;a href=&quot;https://loadtest.app/de/load-testing-in-github-actions/&quot;&gt;Leitfaden zu GitHub Actions&lt;/a&gt;, oder mit dem &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; eines Drittanbieters, dessen &lt;code&gt;results&lt;/code&gt;-Goal den Build bei jedem fehlgeschlagenen Sample scheitern lässt, sofern &lt;code&gt;errorRateThresholdInPercent&lt;/code&gt; keine Rate vorgibt (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus&lt;/strong&gt; bewertet Läufe anhand von &lt;a href=&quot;https://loadfocus.com/docs/de-de/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;Pass/Fail-Schwellenwerten&lt;/a&gt;, die am Test gespeichert sind: maximale p95- und p99-Antwortzeit, maximale Fehlerrate und minimale Anfragerate, jeweils optional. Jeder Lauf erhält ein PASS- oder FAIL-Badge mit Ist- und Zielwerten, und eine API gibt das Urteil an eine Pipeline weiter. LoadFocus führt k6-Szenarien mit Ankunftsrate mit einer festen Zahl von Benutzern aus; dort prüft eine Untergrenze für die Rate also, was diese Benutzer erreicht haben.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sollte die durchschnittliche Antwortzeit ein Pass/Fail-Kriterium sein?&lt;/strong&gt;
Selten. Das SRE-Buch bevorzugt Perzentile: Ein Durchschnitt verdeckt die langsamen Ausreißer am Ende der Verteilung und kann flach bleiben, während die langsamsten Anfragen deutlich langsamer werden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wie viele Pass/Fail-Kriterien sollte ein Lasttest haben?&lt;/strong&gt;
Eine Handvoll harter Grenzwerte, dazu Warnungen. Das SRE-Buch rät zu so wenigen SLOs wie möglich und sagt: Wenn man mit einem SLO nie eine Diskussion über Prioritäten gewinnen kann, lohnt es sich wahrscheinlich nicht. Legen Sie an jeden Grenzwert eines Lasttests denselben Maßstab an.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann ein Lasttest mit einigen fehlgeschlagenen Anfragen bestehen?&lt;/strong&gt;
Ja, wenn die Fehlerrate unter ihrer Grenze bleibt. Prüfen Sie die Voreinstellung Ihres Tools: Locust lässt den Lauf bei jeder fehlgeschlagenen Anfrage scheitern.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-testing-in-github-actions/&quot;&gt;Lasttests in GitHub Actions: ein praktischer Leitfaden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission: was es ist und wie man es vermeidet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Lasttest durchführen: eine Schritt-für-Schritt-Anleitung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/apdex-score/&quot;&gt;Apdex-Score: was er bedeutet und wie man ihn berechnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/slo-vs-sla/&quot;&gt;SLO vs. SLA: der Unterschied, SLIs und Fehlerbudgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Lasttests in GitHub Actions: ein praktischer Leitfaden</title><link>https://loadtest.app/de/load-testing-in-github-actions/</link><guid isPermaLink="true">https://loadtest.app/de/load-testing-in-github-actions/</guid><description>So richten Sie Lasttests in GitHub Actions mit k6, Artillery, Locust oder JMeter ein: Schwellenwerte, die den Job stoppen, Artefakte und Runner-Grenzen.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Für Lasttests in GitHub Actions genügt eine Workflow-Datei: Tool installieren, einen kurzen Test gegen eine Staging-URL starten und den Job über den Exit-Code des Tools scheitern lassen, wenn ein Schwellenwert verfehlt wird. Laden Sie die Ergebnisse als Artefakt hoch, damit jeder Lauf eine Spur hinterlässt. Halten Sie den Test klein, denn ein Standard-Runner von GitHub ist eine einzelne virtuelle Maschine mit wenigen CPU-Kernen.&lt;/p&gt;
&lt;p&gt;Die Angaben zu den Tools und zu GitHub stammen aus der Dokumentation der jeweiligen Anbieter, geprüft am 9. Oktober 2026, und die Workflows folgen dieser dokumentierten Verwendung.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Installiert über&lt;/th&gt;
&lt;th&gt;Was den Job scheitern lässt&lt;/th&gt;
&lt;th&gt;Ergebnisse zum Aufbewahren&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;Grafanas &lt;code&gt;setup-k6-action&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ein verfehlter Schwellenwert&lt;/td&gt;
&lt;td&gt;JSON-Ausgabe&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;Eine fehlgeschlagene &lt;code&gt;ensure&lt;/code&gt;-Prüfung&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;Jede fehlgeschlagene Anfrage oder eine eigene Regel&lt;/td&gt;
&lt;td&gt;CSV- und HTML-Dateien&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Das Release-Archiv&lt;/td&gt;
&lt;td&gt;Nichts eingebaut: einen Prüfschritt ergänzen&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.jtl&lt;/code&gt;-Datei und HTML-Bericht&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was braucht ein Lasttest-Workflow?&lt;/h2&gt;
&lt;p&gt;Einen Trigger, einen Runner, einen Schritt, der das Tool installiert, einen Schritt, der den Test mit Schwellenwerten ausführt, und einen Schritt, der die Ergebnisse hochlädt. Alles andere ist optional.&lt;/p&gt;
&lt;p&gt;Legen Sie das Testskript ins Repository, etwa unter &lt;code&gt;tests/load/&lt;/code&gt;. Lesen Sie die Staging-URL aus einer Repository-Variablen über den &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/contexts&quot;&gt;&lt;code&gt;vars&lt;/code&gt;-Kontext&lt;/a&gt; und setzen Sie &lt;code&gt;timeout-minutes&lt;/code&gt; für den Job: &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax&quot;&gt;Der Standardwert liegt bei 360 Minuten&lt;/a&gt; (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welche Ereignisse sollten einen Lasttest starten?&lt;/h2&gt;
&lt;p&gt;Lassen Sie bei Pull Requests einen kurzen Test laufen und einen längeren nach Zeitplan oder von Hand.&lt;/p&gt;
&lt;p&gt;Nutzen Sie &lt;code&gt;pull_request&lt;/code&gt;, um eine Regression vor dem Merge zu erkennen, &lt;code&gt;workflow_dispatch&lt;/code&gt; für manuelle Läufe und &lt;code&gt;schedule&lt;/code&gt; für Cron-Läufe (in UTC, sofern Sie keine Zeitzone angeben). GitHubs &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows&quot;&gt;Referenz der Ereignisse&lt;/a&gt; nennt einige Grenzen (geprüft am 9. Oktober 2026): Zeitpläne laufen nur auf dem Standard-Branch, höchstens alle fünf Minuten, und können sich zur vollen Stunde verzögern. Pull Requests aus Forks erhalten außer &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; keine Secrets.&lt;/p&gt;
&lt;h2&gt;Wie führt man k6 in GitHub Actions aus?&lt;/h2&gt;
&lt;p&gt;Nutzen Sie die zwei offiziellen Actions von Grafana, eine zum Installieren von k6 und eine zum Ausführen des Skripts. Der Schritt schlägt fehl, sobald k6 mit einem Exit-Code ungleich null endet, und genau das löst ein verfehlter Schwellenwert aus.&lt;/p&gt;
&lt;p&gt;Sowohl &lt;a href=&quot;https://github.com/grafana/setup-k6-action&quot;&gt;setup-k6-action&lt;/a&gt; als auch &lt;a href=&quot;https://github.com/grafana/run-k6-action&quot;&gt;run-k6-action&lt;/a&gt; stehen auf &lt;code&gt;v1&lt;/code&gt; (geprüft am 9. Oktober 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;Die Schwellenwerte stehen im Skript, das &lt;code&gt;BASE_URL&lt;/code&gt; aus der Umgebung liest:&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;Laut k6-Dokumentation &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;beeinflussen Checks den Exit-Status nicht&lt;/a&gt;, daher muss die Entscheidung über Bestehen oder Scheitern von den Schwellenwerten kommen.&lt;/p&gt;
&lt;h2&gt;Wie führt man stattdessen Artillery, Locust oder JMeter aus?&lt;/h2&gt;
&lt;p&gt;Tauschen Sie die Installations- und Ausführungsschritte aus, behalten Sie den Rest des Workflows und nutzen Sie den Mechanismus des jeweiligen Tools, um bei einem verfehlten Ziel zu scheitern.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery&lt;/strong&gt; hat eine &lt;a href=&quot;https://www.artillery.io/docs/cicd/github-actions&quot;&gt;offizielle GitHub Action&lt;/a&gt;, deren &lt;a href=&quot;https://github.com/artilleryio/action-cli&quot;&gt;README&lt;/a&gt; festhält, dass &lt;code&gt;@v2&lt;/code&gt; dem neuesten 2.x-Release folgt (geprüft am 9. Oktober 2026). Der Schritt lautet &lt;code&gt;uses: artilleryio/action-cli@v2&lt;/code&gt; mit &lt;code&gt;command: run --target ${{ vars.STAGING_URL }} tests/load/api.yml --output report.json&lt;/code&gt;, und das &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;ensure-Plugin&lt;/a&gt; beendet Artillery mit einem Exit-Code ungleich null, wenn ein Ziel verfehlt wird. Der Abschnitt &lt;code&gt;config&lt;/code&gt; des Skripts:&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;endet mit Exit-Code 1, sobald eine Anfrage fehlgeschlagen ist&lt;/a&gt;, und für Latenzregeln setzen Sie &lt;code&gt;environment.process_exit_code&lt;/code&gt; in einem Listener für das &lt;code&gt;quitting&lt;/code&gt;-Ereignis, wie dieselbe Seite zeigt (geprüft am 9. Oktober 2026). Nach &lt;code&gt;actions/setup-python@v7&lt;/code&gt; mit &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; läuft mit &lt;code&gt;-n&lt;/code&gt; ohne Oberfläche, und die &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;Kommandozeilenoptionen im Benutzerhandbuch&lt;/a&gt; enthalten keinen Pass/Fail-Schwellenwert (geprüft am 9. Oktober 2026). Ein kurzer Schritt kann die Ergebnisdatei lesen, standardmäßig CSV mit einer Spalte &lt;code&gt;success&lt;/code&gt;, und den Job selbst scheitern lassen:&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;Wie lässt man den Job scheitern, wenn der Test ein Ziel verfehlt?&lt;/h2&gt;
&lt;p&gt;Schreiben Sie die Ziele als Schwellenwerte in den Test und überlassen Sie den Rest dem Exit-Code. GitHub markiert einen Schritt als fehlgeschlagen, wenn sein Befehl mit einem Exit-Code ungleich null endet, und der Job scheitert mit ihm.&lt;/p&gt;
&lt;p&gt;Beginnen Sie mit einer strengen Fehlerquote und einem großzügigen Latenz-Perzentil, und verschärfen Sie das Latenzlimit, sobald Sie wissen, wie stark Ihre Zahlen von Lauf zu Lauf schwanken. Wie Sie diese Ziele festlegen, zeigt die &lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Schritt-für-Schritt-Anleitung zum Lasttest&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Wohin gehören die Ergebnisse jedes Laufs?&lt;/h2&gt;
&lt;p&gt;Laden Sie sie als Workflow-Artefakt hoch, mit &lt;code&gt;if: always()&lt;/code&gt;, damit auch ein fehlgeschlagener Test seinen Bericht behält. Artefakte werden standardmäßig 90 Tage aufbewahrt, und &lt;code&gt;retention-days&lt;/code&gt; verkürzt das.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/actions/upload-artifact&quot;&gt;README von upload-artifact&lt;/a&gt; dokumentiert die 90 Tage als Standard (geprüft am 9. Oktober 2026). Setzen Sie &lt;code&gt;if-no-files-found: error&lt;/code&gt;, damit der Schritt bei einem fehlenden Bericht sichtbar fehlschlägt.&lt;/p&gt;
&lt;h2&gt;Wie viel Last kann ein von GitHub gehosteter Runner erzeugen?&lt;/h2&gt;
&lt;p&gt;Genug für einen Smoke-Test oder eine kleine Regressionsprüfung. Ein Standard-Linux-Runner hat in öffentlichen Repositories 4 CPUs und 16 GB RAM, in privaten 2 CPUs und 8 GB, und ein Job endet nach 6 Stunden.&lt;/p&gt;
&lt;p&gt;Diese Zahlen stammen aus GitHubs &lt;a href=&quot;https://docs.github.com/en/actions/reference/runners/github-hosted-runners&quot;&gt;Runner-Referenz&lt;/a&gt; und den &lt;a href=&quot;https://docs.github.com/en/actions/reference/limits&quot;&gt;Actions-Limits&lt;/a&gt; (geprüft am 9. Oktober 2026), die keine Angabe zur Netzwerkbandbreite machen.&lt;/p&gt;
&lt;p&gt;Ein Job läuft auf einer Maschine und ist damit ein einziger Lastgenerator: Ist seine CPU ausgelastet, enthalten die Antwortzeiten auch die Wartezeit auf dem Runner. Jede Anfrage verlässt zudem dieselbe Maschine, sodass Rate Limiter, die pro Client-Adresse zählen, einen einzigen sehr aktiven Client sehen. GitHub rät davon ab, die Azure-IP-Bereiche seiner Ubuntu-Runner in Allowlists aufzunehmen; größere Runner in den Plänen Team und Enterprise Cloud bieten mehr CPU, mehr Speicher und statische IP-Adressen.&lt;/p&gt;
&lt;h2&gt;Wann sollte die Last von woanders kommen?&lt;/h2&gt;
&lt;p&gt;Wenn Sie mehr Last brauchen, als eine Maschine erzeugt, Traffic aus mehreren Regionen oder Läufe, die länger dauern als das Job-Limit.&lt;/p&gt;
&lt;p&gt;Bei k6 führt &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; den Test in Grafana Cloud k6 aus, wenn Sie &lt;code&gt;cloud-run-locally: false&lt;/code&gt; setzen und &lt;code&gt;K6_CLOUD_TOKEN&lt;/code&gt;, &lt;code&gt;K6_CLOUD_PROJECT_ID&lt;/code&gt; sowie mit k6 v2 &lt;code&gt;K6_CLOUD_STACK_ID&lt;/code&gt; übergeben. Ein &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/environment-variables/&quot;&gt;Cloud-Lauf&lt;/a&gt; ignoriert standardmäßig die Umgebung des Runners, ergänzen Sie &lt;code&gt;flags&lt;/code&gt; also um &lt;code&gt;-e BASE_URL=${{ vars.STAGING_URL }}&lt;/code&gt; (geprüft am 10. Oktober 2026). &lt;a href=&quot;https://www.artillery.io/docs/cicd/github-actions&quot;&gt;Die Action von Artillery&lt;/a&gt; kann &lt;code&gt;run-fargate&lt;/code&gt; oder &lt;code&gt;run-lambda&lt;/code&gt; aufrufen und die Last aus Ihrem eigenen AWS-Konto erzeugen (beides geprüft am 9. Oktober 2026). Der &lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;Vergleich k6 vs Artillery&lt;/a&gt; behandelt beide.&lt;/p&gt;
&lt;p&gt;Für JMeter dokumentiert LoadFocus eine &lt;a href=&quot;https://loadfocus.com/docs/de-de/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;Integration mit GitHub Actions&lt;/a&gt; auf Basis seines npm-Clients. Sie speichern den Test in Ihrem LoadFocus-Konto, hinterlegen API-Schlüssel und Team-ID als Secrets und rufen &lt;code&gt;run-test&lt;/code&gt; auf. Die Flags unten folgen dem Hilfetext des Clients:&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;Der Client wartet standardmäßig bis zu 1.800 Sekunden (&lt;code&gt;--wait-timeout&lt;/code&gt; ändert das), setzen Sie &lt;code&gt;timeout-minutes&lt;/code&gt; für den Job also auf mehr als 30, etwa 40. Er endet mit Exit-Code 1, wenn ein Schwellenwert verfehlt wird, und mit 0, wenn API-Schlüssel oder Team-ID fehlen, deshalb lassen die &lt;code&gt;test -n&lt;/code&gt;-Zeilen den Schritt vorher scheitern, sobald ein Secret leer ist. Die Last kommt von LoadFocus, das &lt;a href=&quot;https://loadfocus.com/de-de/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-testing-in-github-actions&quot;&gt;JMeter-Skripte aus 25 Cloud-Regionen ausführt&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Wie lange sollte ein Lasttest in einem Pull Request laufen?&lt;/strong&gt;
Ein paar Minuten: lang genug, um den Ramp-up hinter sich zu lassen und ein stabiles Perzentil zu erhalten, und kurz genug, dass niemand darauf warten muss.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Darf man Lasttests von GitHub-gehosteten Runnern aus fahren?&lt;/strong&gt;
GitHubs &lt;a href=&quot;https://docs.github.com/en/site-policy/github-terms/github-terms-for-additional-products-and-features&quot;&gt;Bedingungen für Actions&lt;/a&gt; verbieten, damit Dienste zu stören, und beschränken gehostete Runner auf Arbeit am eigenen Projekt des Repositorys (geprüft am 9. Oktober 2026). Ein Lasttest gegen die eigene Staging-Umgebung dieses Projekts, der GitHubs Server nicht übermäßig belastet, ist die Art von Test, die diese Bedingungen beschreiben.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann ich stattdessen einen selbst gehosteten Runner nutzen?&lt;/strong&gt;
Ja. Er läuft auf Ihrer eigenen Hardware und in Ihrem Netzwerk, und laut GitHubs Limits-Seite darf ein Job dort bis zu 5 Tage laufen. Er bleibt ein einziger Lastgenerator.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests: so legen Sie sie fest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Lasttest durchführen: eine Schritt-für-Schritt-Anleitung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery: welches Lasttest-Tool passt zu Ihrem Team?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Locust-Lasttests: das Python-Tool im Überblick</title><link>https://loadtest.app/de/locust-load-testing/</link><guid isPermaLink="true">https://loadtest.app/de/locust-load-testing/</guid><description>Lasttests mit Locust im Überblick: Python-Locustfiles, Web-UI und Headless-Läufe, verteilter Modus, CI, Grenzen, andere Python-Tools und wann k6 passt.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Locust ist ein kostenloses Python-Lasttest-Tool unter MIT-Lizenz, in dem jeder Test ein Python-Programm ist, ausgeführt von leichtgewichtigen Benutzern über eine Web-UI oder die Kommandozeile. Ein Locust-Lasttest passt zu Teams, die Python schreiben und vor allem HTTP-Dienste testen. Wer viele Protokolle ab Werk oder einen grafischen Test-Builder braucht, ist mit JMeter besser bedient, und wer JavaScript schreibt, mit k6.&lt;/p&gt;
&lt;p&gt;Wir haben Locust für dieses Review nicht selbst ausgeführt. Die Fakten stammen aus der Dokumentation, dem Repository und der PyPI-Seite von Locust, geprüft am 9. Oktober 2026; die Einschätzungen sind unsere eigenen.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thema&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;Lizenz&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laufzeit&lt;/td&gt;
&lt;td&gt;Python 3.11 oder neuer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aktuelle Version&lt;/td&gt;
&lt;td&gt;2.46.7 (4. Oktober 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests als&lt;/td&gt;
&lt;td&gt;Python-Klassen in einem Locustfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ausführung&lt;/td&gt;
&lt;td&gt;Web-UI auf Port 8089 oder headless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eingebaute Protokolle&lt;/td&gt;
&lt;td&gt;HTTP und HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skalierung&lt;/td&gt;
&lt;td&gt;Ein Master und beliebig viele Worker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ergebnisse&lt;/td&gt;
&lt;td&gt;Live-Diagramme, CSV, HTML, JSON, OpenTelemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI&lt;/td&gt;
&lt;td&gt;Exit-Code 1, wenn mindestens eine Anfrage fehlgeschlagen ist&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Wer entwickelt Locust, und wird es noch gepflegt?&lt;/h2&gt;
&lt;p&gt;Lars Holmberg pflegt Locust, und Microsoft sponsert die Arbeit. Neue Versionen erscheinen häufig: 17 sind es bisher im Jahr 2026.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;README von Locust&lt;/a&gt; nennt beide. &lt;a href=&quot;https://pypi.org/project/locust/&quot;&gt;PyPI&lt;/a&gt; führt 2.46.7 vom 4. Oktober 2026 als neueste Version und setzt Python 3.11 oder neuer voraus (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wie funktioniert ein Locustfile?&lt;/h2&gt;
&lt;p&gt;Ein Locustfile ist ein gewöhnliches Python-Modul mit mindestens einer User-Klasse. Jeder simulierte Benutzer arbeitet seine Tasks nacheinander ab und pausiert dazwischen für seine &lt;code&gt;wait_time&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Laut der &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;Anleitung zum Locustfile&lt;/a&gt; gibt &lt;code&gt;HttpUser&lt;/code&gt; jedem Benutzer einen &lt;code&gt;client&lt;/code&gt;, der python-requests kapselt, Cookies behält und jede Anfrage erfasst. Mit &lt;code&gt;@task&lt;/code&gt; markierte Methoden werden zufällig gewählt, gewichtet mit der Zahl im Decorator, und &lt;code&gt;on_start&lt;/code&gt; läuft einmal pro Benutzer. Dieser Benutzer meldet sich an, stöbert viermal so oft, wie er bestellt, und startet höchstens alle 10 Sekunden einen Task:&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;Mit &lt;code&gt;catch_response&lt;/code&gt; lassen Sie eine Anfrage auch an ihrem Inhalt scheitern, und &lt;code&gt;name&lt;/code&gt; fasst wechselnde URLs in einer Zeile der Statistik zusammen. Die übrigen Wartefunktionen sind &lt;code&gt;constant&lt;/code&gt;, &lt;code&gt;between&lt;/code&gt;, &lt;code&gt;constant_throughput&lt;/code&gt; und seit &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;; unser Beitrag zur &lt;a href=&quot;https://loadtest.app/de/think-time-in-load-testing/&quot;&gt;Think Time im Lasttest&lt;/a&gt; erklärt, wie Pausen die Last formen. Die Dokumentation ergänzt, dass die Wartezeit den Durchsatz nur begrenzen und keine Benutzer starten kann, um eine Zielrate zu erreichen. Ein Locust-Test ist also ein fester Pool von Benutzern, ein &lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;geschlossenes Lastmodell&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Web-UI oder headless: was sollten Sie nutzen?&lt;/h2&gt;
&lt;p&gt;Die Web-UI, solange Sie erkunden, und den Headless-Modus für wiederholbare Läufe.&lt;/p&gt;
&lt;p&gt;Der Befehl &lt;code&gt;locust&lt;/code&gt; startet eine &lt;a href=&quot;https://docs.locust.io/en/stable/quickstart.html&quot;&gt;Weboberfläche&lt;/a&gt; auf Port 8089. Dort legen Sie Host, Benutzerzahl und Ramp-up fest, verfolgen Live-Diagramme und ändern die Last während des Tests. Der &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;Headless-Modus&lt;/a&gt; nimmt dieselben Einstellungen als Flags entgegen:&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; setzt die Zahl der Benutzer, &lt;code&gt;-r&lt;/code&gt; die Benutzer, die pro Sekunde starten, und &lt;code&gt;-t&lt;/code&gt; die Laufzeit einschließlich Ramp-up. Dieselben Einstellungen lassen sich auch in &lt;code&gt;locust.conf&lt;/code&gt; oder &lt;code&gt;pyproject.toml&lt;/code&gt; festlegen.&lt;/p&gt;
&lt;h2&gt;Wie funktioniert der verteilte Modus?&lt;/h2&gt;
&lt;p&gt;Ein Master-Prozess betreibt die Web-UI und koordiniert, Worker-Prozesse führen die Benutzer aus und melden ihre Ergebnisse zurück. Sie brauchen einen Worker pro CPU-Kern, weil ein Python-Prozess nicht mehr als einen Kern voll nutzen kann.&lt;/p&gt;
&lt;p&gt;Laut der &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;Dokumentation zur verteilten Last&lt;/a&gt; schafft ein Prozess bei einem einfachen Testplan über tausend Anfragen pro Sekunde; größere Tests verteilen Sie deshalb:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# auf dem Master-Rechner
locust -f locustfile.py --master
# auf jedem Worker-Rechner, ein Worker pro Kern
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; holt das Locustfile vom Master. &lt;code&gt;--processes&lt;/code&gt; setzt auf &lt;code&gt;fork()&lt;/code&gt; und funktioniert deshalb nicht unter Windows, und nach jeder Änderung am Locustfile müssen alle Prozesse neu starten. Die Dokumentation beschreibt außerdem einen &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;Kubernetes-Operator&lt;/a&gt; und &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;Azure Load Testing&lt;/a&gt; (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, führt keine Locust-Tests aus. LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-load-testing&quot;&gt;führt JMeter-Testpläne und k6-Skripte aus&lt;/a&gt;, und zwar aus 25 Cloud-Regionen. Für Locust bleiben also die oben genannten Wege zur Skalierung.&lt;/p&gt;
&lt;h2&gt;Kann Locust auch andere Protokolle als HTTP testen?&lt;/h2&gt;
&lt;p&gt;Ja, wenn Sie einen Python-Client für das Protokoll mitbringen. Eingebaut sind nur HTTP und HTTPS.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;Seite zu weiteren Protokollen&lt;/a&gt; zeigt, wie Sie einen Client so kapseln, dass jeder Aufruf erfasst wird, mit Beispielen für XML-RPC und gRPC und experimentellen User-Klassen für MQTT, Socket.IO und OpenAI. Das separate Projekt &lt;a href=&quot;https://github.com/SvenskaSpel/locust-plugins&quot;&gt;locust-plugins&lt;/a&gt; ergänzt User-Klassen für Kafka, FTP, Selenium und Playwright (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Für HTTP gibt es zusätzlich &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;, das geventhttpclient nutzt und deutlich weniger CPU braucht. Im besten Fall schafft ein Prozess laut Dokumentation etwa 16.000 Anfragen pro Sekunde, mit &lt;code&gt;HttpUser&lt;/code&gt; 4.000. Einzelne Anfragen werden dadurch nicht schneller, und TLS-Zertifikate prüft &lt;code&gt;FastHttpUser&lt;/code&gt; standardmäßig nicht.&lt;/p&gt;
&lt;h2&gt;Welche Berichte liefert Locust, und wie passt es in die CI?&lt;/h2&gt;
&lt;p&gt;Sie bekommen Live-Diagramme in der Web-UI und auf Wunsch Ergebnisdateien. In der CI beendet sich Locust mit Exit-Code 1, wenn mindestens eine Anfrage fehlgeschlagen ist.&lt;/p&gt;
&lt;p&gt;Laut der &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;Konfigurationsreferenz&lt;/a&gt; schreibt &lt;code&gt;--csv&lt;/code&gt; Dateien für Statistik, Verlauf und Fehler, &lt;code&gt;--html&lt;/code&gt; speichert einen Bericht, und &lt;code&gt;--json&lt;/code&gt; gibt die Endstatistik aus. &lt;code&gt;--otel&lt;/code&gt; exportiert an ein &lt;a href=&quot;https://docs.locust.io/en/stable/telemetry.html&quot;&gt;OpenTelemetry&lt;/a&gt;-Backend. Die Headless-Dokumentation zeigt einen Listener, der den Lauf anhand der Fehlerquote, der durchschnittlichen Antwortzeit oder des 95. Perzentils scheitern lässt, und unser Leitfaden zu &lt;a href=&quot;https://loadtest.app/de/load-testing-in-github-actions/&quot;&gt;Lasttests in GitHub Actions&lt;/a&gt; baut ihn in einen Workflow ein.&lt;/p&gt;
&lt;h2&gt;Was kann Locust gut, und wo liegen seine Grenzen?&lt;/h2&gt;
&lt;p&gt;Stark ist Locust bei Testlogik und bei vielen gleichzeitigen Benutzern, die meist warten. Schwächer ist es bei der Anfragerate pro Prozess und bei Protokollen, die Sie selbst anbinden müssen.&lt;/p&gt;
&lt;p&gt;Weil Tests reines Python sind, funktionieren Schleifen, Verzweigungen, generierte Daten und Ihr eigener API-Client, und die Tests liegen in der Versionsverwaltung. Die Seite &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; schreibt, dass die geringen Kosten pro Benutzer gut zu stark parallelen Lasten passen, räumt aber ein, dass andere Tools auf derselben Hardware mehr Anfragen pro Sekunde schaffen können.&lt;/p&gt;
&lt;p&gt;Grenzen, die die Dokumentation selbst nennt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ein Python-Prozess nutzt nur einen CPU-Kern.&lt;/li&gt;
&lt;li&gt;Bibliotheken mit I/O in C blockieren den Prozess, sofern gevent sie nicht patchen kann.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HttpUser&lt;/code&gt; parst kein HTML und lädt keine Seitenressourcen.&lt;/li&gt;
&lt;li&gt;Die Wartezeit kann keine Benutzer hinzufügen, um eine Anfragerate zu halten.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Welche anderen Python-Tools für Lasttests gibt es?&lt;/h2&gt;
&lt;p&gt;Locust ist die aktiv entwickelte Python-Engine. Molotov, die wichtigste Alternative, hat seit 2022 keine neue Version auf PyPI veröffentlicht, und Taurus führt Locust über einen seiner Executors aus.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tarekziade/molotov&quot;&gt;Molotov&lt;/a&gt; ist ein Tool für Python 3.8+ auf Basis von asyncio und aiohttp; die &lt;a href=&quot;https://pypi.org/project/molotov/&quot;&gt;neueste Version auf PyPI&lt;/a&gt; ist 2.6 vom 21. Oktober 2022, und der letzte Commit auf seinem Hauptzweig stammt vom November 2023 (geprüft am 21. Oktober 2026). &lt;a href=&quot;https://gettaurus.org/docs/Locust/&quot;&gt;Taurus&lt;/a&gt; führt ein Locustfile oder einfache, in YAML geschriebene GET- und POST-Anfragen über seinen Executor &lt;code&gt;locust&lt;/code&gt; aus. Locust installieren Sie selbst, im verteilten Modus startet Taurus nur den Master, und die Einstellung &lt;code&gt;throughput&lt;/code&gt; wirkt bei diesem Executor nicht (geprüft am 21. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Wann sollten Sie stattdessen k6, JMeter oder Gatling wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie ein anderes Tool, wenn dessen Sprache, Protokolle oder Lastmodell besser zu Ihrem Team passen.&lt;/p&gt;
&lt;p&gt;Unser Überblick über &lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools&lt;/a&gt; stellt Locust neben fünf weitere.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;k6&lt;/strong&gt;, wenn Ihr Team JavaScript schreibt, Bestanden-Kriterien als &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;Thresholds&lt;/a&gt; im Skript festlegen will oder ein offenes Lastmodell braucht, das die &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;Arrival-Rate-Executors&lt;/a&gt; von k6 liefern (geprüft am 9. Oktober 2026). LoadFocus &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-load-testing&quot;&gt;führt k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen aus, startet Arrival-Rate-Szenarien dort aber mit einer festen Zahl von Benutzern. Für eine gehaltene Anfragerate führen Sie sie mit k6 selbst aus.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;JMeter&lt;/strong&gt;, wenn Sie JDBC, JMS, LDAP oder FTP ab Werk brauchen, wie es das &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt; aufführt, oder wenn Ihre Tester Tests in einer GUI bauen. &lt;a href=&quot;https://loadtest.app/de/locust-vs-jmeter/&quot;&gt;Locust vs JMeter&lt;/a&gt; vergleicht die beiden ausführlich.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen &lt;strong&gt;Gatling&lt;/strong&gt;, wenn Ihr Team auf der JVM arbeitet und offene wie geschlossene &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;Injektionsprofile&lt;/a&gt; in einer API haben möchte (geprüft am 9. Oktober 2026). &lt;a href=&quot;https://loadtest.app/de/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter&lt;/a&gt; geht darauf näher ein.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Darf man Locust kostenlos kommerziell nutzen?&lt;/strong&gt;
Ja. Locust steht unter der MIT-Lizenz, die kommerzielle Nutzung, Änderung und Weitergabe erlaubt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welche Python-Version braucht Locust?&lt;/strong&gt;
Python 3.11 oder neuer, laut den PyPI-Metadaten. Installiert wird es mit &lt;code&gt;pip install locust&lt;/code&gt;, oder Sie starten es mit &lt;code&gt;uvx locust&lt;/code&gt; in einer temporären Umgebung.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus Locust-Tests ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter-Testpläne und k6-Skripte aus. Um einen Locust-Test zu skalieren, nutzen Sie den Master-Worker-Modus, den Kubernetes-Operator oder Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: Python-Skripte oder JMeter-Testpläne?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools: sechs Optionen im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/k6-vs-locust/&quot;&gt;k6 vs Locust: JavaScript-Skripte oder Python-Nutzer?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-locust/&quot;&gt;Gatling vs Locust: JVM-Simulationen oder Python-Locustfiles?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Locust vs JMeter: Python-Skripte oder JMeter-Testpläne?</title><link>https://loadtest.app/de/locust-vs-jmeter/</link><guid isPermaLink="true">https://loadtest.app/de/locust-vs-jmeter/</guid><description>Locust und JMeter im Vergleich: Lizenz, Skripte, Protokolle, verteilte Läufe, CI und Berichte, mit klaren Hinweisen, wann welches Tool besser passt.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Locust und Apache JMeter sind beide kostenlose Open-Source-Lasttest-Tools, und welches besser passt, hängt vor allem davon ab, wie Ihr Team Tests bauen möchte. Nehmen Sie Locust, wenn Ihr Team Python schreibt und Testlogik als gewöhnlichen Code haben will, ausgeführt von leichtgewichtigen, ereignisbasierten Benutzern. Nehmen Sie JMeter, wenn Sie Protokolle jenseits von HTTP wie JDBC, JMS oder LDAP brauchen, Tests lieber in einer GUI bauen oder bereits eine Sammlung von &lt;code&gt;.jmx&lt;/code&gt;-Testplänen haben.&lt;/p&gt;
&lt;p&gt;Die Fakten in diesem Vergleich Locust vs JMeter stammen aus der Dokumentation und den Repositories der beiden Projekte, geprüft am 9. Oktober 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;Lizenz&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Apache 2.0 (&lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laufzeit&lt;/td&gt;
&lt;td&gt;Python 3.11 oder neuer&lt;/td&gt;
&lt;td&gt;Java 8 oder neuer (Version 5.6.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests als&lt;/td&gt;
&lt;td&gt;Python-Code in einem Locustfile&lt;/td&gt;
&lt;td&gt;Testpläne aus einer GUI, gespeichert als XML-Dateien (&lt;code&gt;.jmx&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GUI&lt;/td&gt;
&lt;td&gt;Web-UI zum Starten, Anpassen und Beobachten eines laufenden Tests&lt;/td&gt;
&lt;td&gt;Desktop-IDE zum Aufzeichnen, Bauen und Debuggen von Testplänen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eingebaute Protokolle&lt;/td&gt;
&lt;td&gt;HTTP und HTTPS; andere über einen Python-Client&lt;/td&gt;
&lt;td&gt;HTTP(S), SOAP/REST, FTP, JDBC, LDAP, JMS, Mail, TCP, Shell-Befehle, Java-Objekte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtuelle Benutzer&lt;/td&gt;
&lt;td&gt;Ein Greenlet pro Benutzer auf gevent (ereignisbasiert)&lt;/td&gt;
&lt;td&gt;Ein Java-Thread pro Benutzer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verteilter Modus&lt;/td&gt;
&lt;td&gt;Ein Master und beliebig viele Worker&lt;/td&gt;
&lt;td&gt;Ein Client steuert entfernte JMeter-Server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI und Headless-Läufe&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--headless&lt;/code&gt;, Exit-Code 1 bei fehlgeschlagenen Anfragen&lt;/td&gt;
&lt;td&gt;CLI-Modus (&lt;code&gt;jmeter -n&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Berichte&lt;/td&gt;
&lt;td&gt;Live-Diagramme in der Web-UI, CSV-Dateien, HTML-Bericht&lt;/td&gt;
&lt;td&gt;HTML-Dashboard, Live-Ergebnisse über einen Backend Listener&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was ist der Unterschied zwischen Locust und JMeter?&lt;/h2&gt;
&lt;p&gt;In Locust ist ein Test ein Python-Programm. In JMeter ist ein Test ein Plan, den Sie in einer Desktop-GUI zusammenstellen und als Datei speichern, und daraus folgen die meisten anderen Unterschiede.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;README&lt;/a&gt; von Locust beschreibt Tests, die mit ganz normalen Python-Schleifen, Bedingungen und Bibliotheken geschrieben werden. Installiert wird Locust mit &lt;code&gt;pip install locust&lt;/code&gt; auf Python 3.11 oder neuer, so die &lt;a href=&quot;https://github.com/locustio/locust/blob/master/pyproject.toml&quot;&gt;Paket-Metadaten&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ein JMeter-Test ist ein Baum aus Elementen: eine Thread Group für die Benutzer, Sampler für die Anfragen sowie Assertions und Listener für die Ergebnisse. JMeter 5.6.3, die aktuelle Version auf der &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;Download-Seite&lt;/a&gt;, braucht Java 8 oder neuer. Das README im &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/README.md&quot;&gt;Entwicklungszweig&lt;/a&gt; von JMeter verlangt bereits Java 17 (geprüft am 10. Oktober 2026). Wenn ein Schritt echte Logik braucht, führt ein JSR223-Sampler ein Groovy-Skript innerhalb des Plans aus.&lt;/p&gt;
&lt;h2&gt;Wie schreibt man in beiden Tools einen Test?&lt;/h2&gt;
&lt;p&gt;In Locust schreiben Sie für jede Art von Benutzer eine Python-Klasse, deren Methoden als Tasks markiert sind. In JMeter fügen Sie in der GUI eine Thread Group und Sampler hinzu, speichern den Plan und starten ihn von der Kommandozeile.&lt;/p&gt;
&lt;p&gt;Ein Locust-Benutzer, der zwischen den Tasks ein bis drei Sekunden wartet und die Benutzerliste dreimal so oft abruft wie einen einzelnen Benutzer:&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;Headless gestartet mit 50 Benutzern, fünf neuen pro Sekunde, für fünf Minuten:&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;In JMeter ist derselbe Test eine Thread Group mit 50 Threads und einer Ramp-up-Zeit, die zwei HTTP-Request-Sampler enthält. Die &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;Einstiegsanleitung&lt;/a&gt; startet einen gespeicherten Plan im CLI-Modus, und &lt;code&gt;-e -o&lt;/code&gt; erzeugt am Ende den HTML-Bericht:&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;Die &lt;code&gt;.jmx&lt;/code&gt;-Datei ist XML, wie die &lt;a href=&quot;https://raw.githubusercontent.com/apache/jmeter/master/bin/examples/CSVSample.jmx&quot;&gt;mit JMeter ausgelieferten Beispiele&lt;/a&gt; zeigen, und lässt sich in einem Pull Request schwerer prüfen als Python. JMeter kann einen Plan außerdem im Browser aufzeichnen; das Gegenstück bei Locust ist &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;har2locust&lt;/a&gt;, ein Konverter von HAR-Aufzeichnungen zu Locustfiles im Beta-Stadium (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Welche Protokolle kann jedes Tool testen?&lt;/h2&gt;
&lt;p&gt;JMeter deckt von Haus aus deutlich mehr Protokolle ab. Locust bringt HTTP und HTTPS mit und erwartet für alles andere einen Python-Client, den Sie selbst mitbringen.&lt;/p&gt;
&lt;p&gt;Das &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt; von JMeter nennt HTTP und HTTPS, SOAP und REST, FTP, Datenbanken über JDBC, LDAP, JMS-Messaging, Mail über SMTP, POP3 und IMAP, TCP, native Befehle und Java-Objekte. Für JDBC und JMS brauchen Sie die Treiber-JARs Ihres Datenbank- oder JMS-Anbieters.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;Seite zu weiteren Protokollen&lt;/a&gt; in der Locust-Dokumentation zeigt, wie Sie eine Protokollbibliothek kapseln, mit Beispielen für gRPC, XML-RPC und MQTT, und verweist für Kafka, Selenium und Playwright auf locust-plugins (geprüft am 9. Oktober 2026). Die Bibliothek muss mit gevent zusammenarbeiten, denn I/O in kompiliertem C-Code blockiert den ganzen Prozess; die Dokumentation nennt als Beispiel den PostgreSQL-Treiber psycopg2, der ein Zusatzpaket braucht. Für Lasttests gegen Datenbanken ist der JDBC-Sampler von JMeter der kürzere Weg.&lt;/p&gt;
&lt;h2&gt;Wie funktionieren virtuelle Benutzer in Locust und JMeter?&lt;/h2&gt;
&lt;p&gt;JMeter führt jeden virtuellen Benutzer als Java-Thread aus. Locust führt jeden Benutzer als Greenlet in der Event-Loop von gevent aus, was die Kosten pro Benutzer niedrig hält.&lt;/p&gt;
&lt;p&gt;Jeder Thread in einer JMeter-&lt;a href=&quot;https://jmeter.apache.org/usermanual/test_plan.html&quot;&gt;Thread Group&lt;/a&gt; arbeitet den ganzen Plan unabhängig ab. JMeter startet standardmäßig mit 1 GB Heap, was laut Anleitung für größere Pläne und viele Threads nicht reichen kann.&lt;/p&gt;
&lt;p&gt;Laut README kann ein einzelner Locust-Prozess viele Tausend gleichzeitige Benutzer bedienen. Die &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;Dokumentation zur verteilten Last&lt;/a&gt; ergänzt, dass ein Python-Prozess nicht mehr als einen CPU-Kern voll ausnutzen kann. Sie starten deshalb einen Worker pro Kern, was &lt;code&gt;--processes&lt;/code&gt; auf einem einzelnen Rechner für Sie erledigt.&lt;/p&gt;
&lt;h2&gt;Wie verteilt man einen Test auf mehrere Rechner?&lt;/h2&gt;
&lt;p&gt;Beide haben einen verteilten Modus eingebaut. Bei Locust steuert ein Master die Worker, die die Benutzer ausführen, und bei JMeter startet der Client den vollständigen Testplan auf jedem entfernten Server.&lt;/p&gt;
&lt;p&gt;In Locust führt ein mit &lt;code&gt;--master&lt;/code&gt; gestarteter Prozess die Web-UI aus und sagt den &lt;code&gt;--worker&lt;/code&gt;-Prozessen, wann sie Benutzer starten und stoppen. Die Locust-Dokumentation beschreibt außerdem einen &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;Kubernetes-Operator&lt;/a&gt; und &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;Azure Load Testing&lt;/a&gt;, einen Microsoft-Dienst, der Locust-Tests in der Cloud ausführt (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Im &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;Remote-Testmodus&lt;/a&gt; von JMeter steuert ein Client beliebig viele Server über RMI. Jeder Server führt den ganzen Plan aus, aus 1.000 Threads auf sechs Servern werden also 6.000 Threads. Alle Knoten sollten dieselbe JMeter- und Java-Version verwenden, RMI braucht einen Keystore, sofern SSL nicht deaktiviert ist, und Datendateien müssen Sie auf jeden Server kopieren.&lt;/p&gt;
&lt;p&gt;Für JMeter-Testpläne gibt es einen dritten Weg. LoadFocus, der Herausgeber dieser Website, &lt;a href=&quot;https://loadfocus.com/de-de/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-vs-jmeter&quot;&gt;führt vorhandene JMeter-Testpläne&lt;/a&gt; unverändert aus 25 Cloud-Regionen aus, ganz ohne Remote-Server, die Sie einrichten müssten. Locust-Tests führt LoadFocus nicht aus, für Locust bleiben also die oben genannten Wege zur Skalierung.&lt;/p&gt;
&lt;h2&gt;Wie passen beide in die CI, und welche Berichte bekommen Sie?&lt;/h2&gt;
&lt;p&gt;Beide laufen headless von der Kommandozeile. Locust beendet sich zusätzlich mit Exit-Code 1, wenn Anfragen fehlschlagen, und JMeter liefert den umfangreicheren HTML-Bericht.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;Headless-Dokumentation&lt;/a&gt; von Locust zeigt einen kurzen Event-Listener, der den Exit-Code anhand der Fehlerquote, der durchschnittlichen Antwortzeit oder des 95. Perzentils setzt, dazu ein Beispiel für GitHub Actions. Mit den Optionen &lt;code&gt;--csv&lt;/code&gt; und &lt;code&gt;--html&lt;/code&gt; speichert Locust nach dem Lauf Ergebnisse und einen Bericht.&lt;/p&gt;
&lt;p&gt;Die JMeter-Dokumentation ist eindeutig: Lasttests laufen im CLI-Modus, die GUI ist zum Bauen und Debuggen da. Das README verweist für Maven, Gradle und Jenkins auf Bibliotheken von Drittanbietern. Das &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;JMeter-Dashboard&lt;/a&gt; enthält eine APDEX-Tabelle, eine Statistiktabelle mit drei konfigurierbaren Perzentilen, Fehlerübersichten und Diagramme der Antwortzeit.&lt;/p&gt;
&lt;h2&gt;Welches Tool sollten Sie wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie Locust, wenn Ihr Team Python schreibt und Lasttests wie den übrigen Code im Review prüfen will. Wählen Sie stattdessen JMeter, wenn Sie Protokolle jenseits von HTTP brauchen, wenn Ihre Tester lieber mit einer GUI arbeiten oder wenn Sie bereits &lt;code&gt;.jmx&lt;/code&gt;-Pläne haben.&lt;/p&gt;
&lt;p&gt;Locust passt zu Szenarien mit Schleifen, Verzweigungen und generierten Daten, zu Tests, die einen internen Python-Client für Ihre API wiederverwenden, und zu hoher Parallelität mit Benutzern, die die meiste Zeit warten.&lt;/p&gt;
&lt;p&gt;JMeter ist die bessere Wahl für Tests mit JDBC, JMS, LDAP, FTP oder Mail, für die Locust einen selbst gepflegten Client bräuchte, und für Tester, die einen Ablauf im Browser aufzeichnen und visuell verfeinern. Ein Unternehmen, das JMeter bereits nutzt, behält außerdem seine Pläne und sein Know-how.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist Locust schneller als JMeter?&lt;/strong&gt;
Das haben wir nicht selbst gemessen, deshalb nennen wir keinen Sieger. Fair vergleichen lässt sich das nur mit demselben Szenario in beiden Tools auf Ihrer eigenen Hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann Locust JMeter-Dateien im .jmx-Format ausführen?&lt;/strong&gt;
Laut seiner Dokumentation nicht, denn sie beschreibt Tests ausschließlich als Python-Locustfiles. Wer einen JMeter-Testplan nach Locust überträgt, schreibt ihn in Python neu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus Locust-Tests ausführen?&lt;/strong&gt;
Nein. LoadFocus führt JMeter- und k6-Skripte aus. Um einen Locust-Test über einen Rechner hinaus zu skalieren, nutzen Sie den Master-Worker-Modus von Locust, seinen Kubernetes-Operator oder Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-load-testing/&quot;&gt;Locust-Lasttests: das Python-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: Tests als Code oder GUI-Testplan?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery: welches Lasttest-Tool passt zu Ihrem Team?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/k6-vs-locust/&quot;&gt;k6 vs Locust: JavaScript-Skripte oder Python-Nutzer?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-locust/&quot;&gt;Gatling vs Locust: JVM-Simulationen oder Python-Locustfiles?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/jmeter-vs-postman/&quot;&gt;JMeter vs Postman: welches Tool für Lasttests?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Offenes vs geschlossenes Lastmodell: welches passt wann?</title><link>https://loadtest.app/de/open-vs-closed-workload-model/</link><guid isPermaLink="true">https://loadtest.app/de/open-vs-closed-workload-model/</guid><description>Offenes vs geschlossenes Lastmodell erklärt: warum geschlossene Tests Engpässe verbergen und wie k6, Gatling, Locust und JMeter beide Modelle abbilden.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Bei der Frage offenes vs geschlossenes Lastmodell zählt vor allem, wie Nutzer Ihr System erreichen. Ein offenes Modell startet neue Iterationen mit einer festen Ankunftsrate und passt zu öffentlichen Websites und APIs, deren Nutzer weiterhin kommen, egal wie langsam das System antwortet; ein geschlossenes Modell, also eine feste Zahl virtueller Benutzer, die jeweils auf das Ende ihrer letzten Iteration warten, passt nur dort, wo das System selbst die Parallelität begrenzt. Am stärksten wirkt die Wahl unter Sättigung: Dann bremst ein geschlossener Test seine eigene Last und lässt das System gesünder aussehen, als es ist.&lt;/p&gt;
&lt;p&gt;Die Fakten zu den Tools stammen aus der Dokumentation der jeweiligen Projekte, geprüft am 9. Oktober 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Offenes Modell&lt;/th&gt;
&lt;th&gt;Geschlossenes Modell&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Sie legen fest&lt;/td&gt;
&lt;td&gt;Neue Iterationen oder Nutzer pro Sekunde&lt;/td&gt;
&lt;td&gt;Gleichzeitige virtuelle Benutzer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wenn Antworten langsamer werden&lt;/td&gt;
&lt;td&gt;Arbeit kommt weiter an, Warteschlangen wachsen&lt;/td&gt;
&lt;td&gt;Nutzer warten, es wird weniger Last erzeugt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reale Systeme dieser Art&lt;/td&gt;
&lt;td&gt;Die meisten öffentlichen Websites und APIs&lt;/td&gt;
&lt;td&gt;Callcenter, Ticket-Warteschlangen, Worker-Pools&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;Angenähert mit &lt;code&gt;constant_throughput&lt;/code&gt; oder &lt;code&gt;poisson&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nutzer mit einer &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, Arrivals-Plugin&lt;/td&gt;
&lt;td&gt;Thread Group&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was ist der Unterschied zwischen einem offenen und einem geschlossenen Lastmodell?&lt;/h2&gt;
&lt;p&gt;Im offenen Modell bestimmt der Lastgenerator, wann Arbeit ankommt, im geschlossenen Modell die Antwortzeit des Systems.&lt;/p&gt;
&lt;p&gt;Die k6-Dokumentation sagt es deutlich: Im &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;geschlossenen Modell&lt;/a&gt; startet die nächste Iteration eines virtuellen Benutzers erst, wenn die letzte beendet ist, während im offenen Modell neue Iterationen unabhängig davon ankommen, ob die vorherigen fertig sind (geprüft am 9. Oktober 2026). Ein geschlossener Test mit 50 &lt;a href=&quot;https://loadfocus.com/docs/de-de/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;virtuellen Benutzern&lt;/a&gt; hat nie mehr als 50 Iterationen gleichzeitig in Arbeit. Ein offener Test mit 50 Iterationen pro Sekunde startet jede Sekunde weitere 50, und wenn jede länger dauert, überlappen sich mehr davon.&lt;/p&gt;
&lt;h2&gt;Warum verbirgt ein geschlossenes Modell Latenz, wenn das System gesättigt ist?&lt;/h2&gt;
&lt;p&gt;Weil der Test zusammen mit dem System langsamer wird. Wenn Antworten länger dauern, sendet jeder Nutzer im geschlossenen Modell weniger Anfragen, und die Last sinkt genau dann, wenn Sie sie steigen sehen wollten.&lt;/p&gt;
&lt;p&gt;Die k6-Dokumentation beschreibt den Effekt: Langsamere Antworten bedeuten längere Iterationen und eine niedrigere Ankunftsrate neuer Iterationen. Gatlings &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;Seite zu Lastmodellen&lt;/a&gt; geht weiter und nennt ein geschlossenes Modell gegen ein eigentlich offenes System einen kaputten Test, der ein imaginäres Verhalten prüft (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Ein geschlossener Test zeigt deshalb Antwortzeiten, die sich einpendeln, weil nie mehr Anfragen unterwegs sein können, als es Nutzer gibt. Ein offener Test zeigt die wachsende Warteschlange, mit Antwortzeiten, die steigen, solange mehr ankommt, als das System abarbeitet. Das zweite Bild ist das, was Ihre Nutzer erleben würden, und die &lt;a href=&quot;https://loadfocus.com/docs/de-de/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;p95- und p99-Antwortzeiten&lt;/a&gt;, die Sie am Ende ablesen, sind nur so ehrlich wie das Lastmodell dahinter.&lt;/p&gt;
&lt;p&gt;Die k6-Dokumentation merkt an, dass ein Teil der Fachliteratur dieses Problem &lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission&lt;/a&gt; nennt. Ein USENIX-Paper von 2006, auf das die Gatling-Dokumentation verweist, &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;, kam zu dem Ergebnis, dass beide Modelle selbst bei gleicher Last und gleichen Bedienanforderungen deutlich unterschiedliche Ergebnisse liefern.&lt;/p&gt;
&lt;h2&gt;Welches Modell passt zu Ihrem echten Traffic?&lt;/h2&gt;
&lt;p&gt;Wählen Sie ein offenes Modell für alles, was öffentlich erreichbar ist, und ein geschlossenes nur dort, wo das System selbst begrenzt, wie viele Nutzer gleichzeitig aktiv sind.&lt;/p&gt;
&lt;p&gt;Die Gatling-Dokumentation nennt Callcenter, in denen alle Mitarbeitenden beschäftigt sind, und Ticketing-Websites, die Nutzer bei voller Auslastung in eine Warteschlange stellen, als geschlossene Systeme und sagt, dass sich die meisten Websites offen verhalten. Ein Batch-Job mit fester Zahl an Workern oder ein Queue-Consumer mit festgelegter Parallelität ist ebenfalls geschlossen. Öffentliche APIs, Webseiten und Webhooks sind offen: Nichts hält die nächste Anfrage zurück, nur weil die letzte langsam war.&lt;/p&gt;
&lt;p&gt;Viele Systeme liegen dazwischen: Eine Käuferin kommt nach ihrem eigenen Zeitplan, wartet dann aber innerhalb des Besuchs auf jede Seite. Das Paper oben nennt das ein teilweise offenes Modell. In k6 oder Gatling legen Sie dafür die Ankunftsrate der Sitzungen fest und machen jede Iteration zu einer vollständigen Nutzerreise mit eigenen Pausen.&lt;/p&gt;
&lt;h2&gt;Wie stellt man in k6 jedes Modell ein?&lt;/h2&gt;
&lt;p&gt;Über den Executor. &lt;code&gt;constant-vus&lt;/code&gt; und &lt;code&gt;ramping-vus&lt;/code&gt; ergeben ein geschlossenes Modell, &lt;code&gt;constant-arrival-rate&lt;/code&gt; und &lt;code&gt;ramping-arrival-rate&lt;/code&gt; ein offenes.&lt;/p&gt;
&lt;p&gt;Ein geschlossenes Szenario setzt &lt;code&gt;executor: &amp;quot;constant-vus&amp;quot;&lt;/code&gt; mit einer Zahl &lt;code&gt;vus&lt;/code&gt; und einer &lt;code&gt;duration&lt;/code&gt;. Ein offenes Szenario legt stattdessen eine Rate fest, und Sie reservieren vorab genug virtuelle Benutzer, um sie zu halten:&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;startet eine Iteration nur, solange ein virtueller Benutzer frei ist&lt;/a&gt;, und die Dokumentation rät davon ab, sich auf &lt;code&gt;maxVUs&lt;/code&gt; zu verlassen, weil zusätzliche Nutzer mitten im Test den Lastgenerator überlasten können. Ist kein Nutzer frei, verbucht k6 eine &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;verworfene Iteration&lt;/a&gt;, was spät im Test oft heißt, dass das System langsamer wird; der Schwellenwert oben lässt den Lauf bei zehn davon scheitern. Setzen Sie kein &lt;code&gt;sleep()&lt;/code&gt; ans Ende einer Arrival-Rate-Iteration, denn der Executor taktet die Starts bereits (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Wenn Sie k6-Skripte auf LoadFocus ausführen, nimmt sein &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-vs-closed-workload-model&quot;&gt;k6-Cloud-Runner&lt;/a&gt; die Last aus den Einstellungen des Tests, und sein Skript-Validator warnt, dass Arrival-Rate-Szenarien dort mit einer festen Nutzerzahl laufen, die Anfragerate also nicht gehalten wird. Für einen echten Test im offenen Modell führen Sie die Arrival-Rate-Executors mit k6 selbst aus oder bei einem Dienst, der sie so ausführt, wie sie geschrieben sind.&lt;/p&gt;
&lt;h2&gt;Wie bilden Gatling, Locust und JMeter die beiden Modelle ab?&lt;/h2&gt;
&lt;p&gt;Gatling trennt die beiden Modelle in seiner API, JMeter bietet beide über unterschiedliche Thread Groups, und Locust ist um eine feste Zahl von Nutzern herum gebaut.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; Ein Szenario nutzt entweder &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt; oder &lt;code&gt;injectClosed&lt;/code&gt;&lt;/a&gt;. Offene Schritte wie &lt;code&gt;constantUsersPerSec&lt;/code&gt; und &lt;code&gt;rampUsersPerSec&lt;/code&gt; legen Ankunftsraten fest, geschlossene wie &lt;code&gt;constantConcurrentUsers&lt;/code&gt; und &lt;code&gt;rampConcurrentUsers&lt;/code&gt; die Parallelität. &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;Ein Injektionsprofil kann die beiden nicht mischen&lt;/a&gt; (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust.&lt;/strong&gt; Sie legen eine Zahl von Nutzern fest, und die &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; jedes Nutzers steuert die Pause zwischen Tasks. &lt;code&gt;constant_throughput&lt;/code&gt; und &lt;code&gt;constant_pacing&lt;/code&gt; passen diese Pause so an, dass jeder Nutzer höchstens eine bestimmte Zahl von Tasks pro Sekunde ausführt, doch laut Dokumentation kann die Wartezeit den Durchsatz nur begrenzen und keine neuen Nutzer starten, um ein Ziel zu erreichen. &lt;code&gt;poisson()&lt;/code&gt; wählt die Pausen zufällig, was laut Dokumentation echten Ankünften näherkommt. Das Beispiel der Dokumentation für 500 Task-Iterationen pro Sekunde ist &lt;code&gt;constant_throughput(0.1)&lt;/code&gt; mit 5.000 Nutzern, ein geschlossener Pool mit viel Reserve (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Die klassische &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; ist ein geschlossener Pool von Threads. Der Constant Throughput Timer und der Precise Throughput Timer takten diesen Pool auf eine Rate hin, und die Referenz warnt, dass der Durchsatz sinkt, wenn der Server nicht mithält oder es zu wenige Threads gibt. Für Ankünfte hat JMeter 5.5 die &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; eingeführt, weiterhin als experimentell markiert, mit Zeitplänen wie &lt;code&gt;rate(10/sec) random_arrivals(1 min)&lt;/code&gt;. Das Community-Plugin &lt;a href=&quot;https://jmeter-plugins.org/wiki/ArrivalsThreadGroup/&quot;&gt;Arrivals Thread Group&lt;/a&gt; startet neue Threads, wenn alle vorhandenen beschäftigt sind, mit einem Concurrency-Limit als Sicherheitsventil (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;h2&gt;Worauf sollten Sie bei einem Test im offenen Modell achten?&lt;/h2&gt;
&lt;p&gt;Beobachten Sie den Lastgenerator so genau wie das System unter Test. Im offenen Modell bedeutet ein langsames System mehr gleichzeitige Nutzer auf Ihrer Seite, und die kosten Speicher und CPU.&lt;/p&gt;
&lt;p&gt;Setzen Sie eine Obergrenze, etwa &lt;code&gt;maxVUs&lt;/code&gt; in k6 oder das Concurrency-Limit des JMeter-Plugins, und werten Sie das Erreichen dieser Grenze als Ergebnis: Das System konnte die verlangte Rate nicht aufnehmen.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist ein geschlossenes Lastmodell jemals die richtige Wahl?&lt;/strong&gt;
Ja. Nutzen Sie es, wenn das reale System die Parallelität begrenzt, etwa bei einem festen Pool von Workern, einem Queue-Consumer oder einem Callcenter, oder wenn Sie wissen wollen, wie viele gleichzeitige Sitzungen eine Komponente verkraftet. Für öffentlichen Web-Traffic passt ein offenes Modell besser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Macht Think Time aus einem geschlossenen Modell ein offenes?&lt;/strong&gt;
Nein. Think Time senkt, wie oft jeder Nutzer Anfragen sendet, aber jeder Nutzer wartet weiterhin auf die vorherige Antwort, also bremst ein langsames System den Test trotzdem. Nur eine Ankunftsrate, die unabhängig von den Antwortzeiten festgelegt ist, ergibt ein offenes Modell.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wie viele virtuelle Benutzer braucht ein Arrival-Rate-Test?&lt;/strong&gt;
Genug, um jede gleichzeitig laufende Iteration abzudecken. Die k6-Dokumentation schlägt den Median der Iterationsdauer mal Zielrate vor, plus eine Reserve für Schwankungen, ermittelt in kurzen Probeläufen vor dem eigentlichen Test.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/coordinated-omission/&quot;&gt;Coordinated Omission: was es ist und wie man es vermeidet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law im Lasttest: Tests dimensionieren und prüfen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/think-time-in-load-testing/&quot;&gt;Think Time im Lasttest: was sie ist und wie man sie wählt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/throughput-vs-latency/&quot;&gt;Durchsatz vs. Latenz: wie sie unter Last zusammenhängen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/amdahls-law/&quot;&gt;Amdahlsches Gesetz: Formel, Beispiele und Grenzen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/queueing-theory/&quot;&gt;Warteschlangentheorie: was sie ist und warum Latenz steigt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Think Time im Lasttest: was sie ist und wie man sie wählt</title><link>https://loadtest.app/de/think-time-in-load-testing/</link><guid isPermaLink="true">https://loadtest.app/de/think-time-in-load-testing/</guid><description>Think Time im Lasttest erklärt: warum Pausen die Last Ihrer Nutzer verändern, Think Time vs. Pacing und wie Sie sie in k6, JMeter und Locust einstellen.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Think Time im Lasttest ist die Pause, die ein virtueller Benutzer zwischen zwei Aktionen einlegt, stellvertretend für die Sekunden, in denen ein echter Mensch eine Seite liest oder ein Formular ausfüllt. Sie bestimmt, wie viel Last jeder virtuelle Benutzer erzeugt: Je länger die Pause, desto weniger Anfragen pro Sekunde schickt dieselbe Zahl von Benutzern. Messen Sie sie an echten Nutzerdaten, streuen Sie sie zufällig um diesen Wert und schreiben Sie sie mit dem Pausenbefehl Ihres Tools ins Skript.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Think Time pro Durchlauf&lt;/th&gt;
&lt;th&gt;Ein Durchlauf dauert&lt;/th&gt;
&lt;th&gt;Anfragen pro Sekunde bei 100 Benutzern&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;etwa 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;etwa 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;etwa 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;etwa 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Das ist reine Rechnung ohne Testlauf dahinter: eine Anfrage pro Durchlauf, 0,5 Sekunden Antwortzeit, und Benutzer geteilt durch (Antwortzeit + Think Time).&lt;/p&gt;
&lt;h2&gt;Was ist Think Time im Lasttest?&lt;/h2&gt;
&lt;p&gt;Think Time ist die bewusste Wartezeit, die ein Testskript zwischen die Schritte einer Nutzerreise setzt. Sie bildet den menschlichen Teil einer Sitzung ab: lesen, vergleichen, tippen.&lt;/p&gt;
&lt;p&gt;In einem Shop-Skript liegt sie zwischen „Produktseite öffnen“ und „in den Warenkorb legen“, außerhalb jeder Anfrage. Der &lt;a href=&quot;https://loadfocus.com/docs/de-de/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;Leitfaden von LoadFocus zu Verzögerungen im Lasttest&lt;/a&gt; trennt sie von der Ramp-up-Verzögerung, die Benutzer schrittweise hinzufügt, und der Startverzögerung zwischen dem Start einzelner Benutzer, und merkt an, dass viele Tools mit dem bloßen Wort „Delay“ die Ramp-up-Variante meinen. Wenn ein Tool ein Feld „Delay“ anbietet, prüfen Sie, welche der drei gemeint ist.&lt;/p&gt;
&lt;h2&gt;Warum ändert Think Time die Last bei gleicher Benutzerzahl?&lt;/h2&gt;
&lt;p&gt;Bei einer festen Zahl virtueller Benutzer wartet jeder auf eine Antwort, pausiert und schickt erst dann die nächste Anfrage. Sein Durchlauf dauert Antwortzeit plus Think Time, also senkt jede zusätzliche Sekunde Think Time die Anfragen, die jeder Benutzer pro Sekunde schickt.&lt;/p&gt;
&lt;p&gt;Hundert Benutzer ohne Pause schicken bei 0,5 Sekunden Antwortzeit 200 Anfragen pro Sekunde; mit 5 Sekunden Pause sind es etwa 18, zwei Läufe „mit 100 Benutzern“ können also sehr verschiedene Tests sein. Die k6-Dokumentation beschreibt denselben Effekt für ihr &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;geschlossenes Modell&lt;/a&gt;: Die nächste Iteration beginnt erst, wenn die vorige fertig ist, also senken langsamere Antworten die Rate zusätzlich (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Think Time zu kürzen, um mit weniger Benutzern mehr Last zu erzeugen, hat seinen Preis: Zwanzig Benutzer ohne Pausen erreichen womöglich die Anfragerate von mehreren hundert Benutzern mit Pausen, halten dabei aber weit weniger Sitzungen und Verbindungen offen als die Produktion.&lt;/p&gt;
&lt;h2&gt;Was ist der Unterschied zwischen Think Time und Pacing?&lt;/h2&gt;
&lt;p&gt;Think Time ist eine Pause nach einem Schritt, ein Durchlauf wird also länger, sobald Antworten langsamer werden. Pacing legt den Abstand vom Start eines Durchlaufs bis zum Start des nächsten fest und verkürzt die Wartezeit, wenn die Arbeit länger gedauert hat.&lt;/p&gt;
&lt;p&gt;Mit 30 Sekunden Pacing startet ein Benutzer alle 30 Sekunden einen Durchlauf, egal ob seine Anfragen 2 oder 20 Sekunden gebraucht haben. Das passt zu Tests, die aus Geschäftsvolumen abgeleitet sind, etwa „500 Bestellungen pro Stunde“. Die Dokumentation zu Locusts &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; nennt den Grenzfall: Läuft die Aufgabe länger als das Intervall, fällt die Wartezeit auf null (geprüft am 9. Oktober 2026). Viele Skripte nutzen beides, Think Time zwischen den Schritten und Pacing für den ganzen Durchlauf.&lt;/p&gt;
&lt;h2&gt;Sollte Think Time fest oder zufällig sein?&lt;/h2&gt;
&lt;p&gt;Zufällig, um einen gemessenen Mittelwert herum. Eine feste Pause hält Benutzer, die gemeinsam gestartet sind, im Gleichschritt, sodass sie Durchlauf für Durchlauf im selben Moment dieselbe Seite aufrufen.&lt;/p&gt;
&lt;p&gt;Diese synchronen Wellen können Spitzen erzeugen, die es in der Produktion nie gibt, und eine zufällige Pause verteilt die Benutzer. Halten Sie den Mittelwert dort, wo Ihre Daten ihn verorten: Eine gleichverteilte Pause zwischen 2 und 8 Sekunden ergibt im Mittel 5, also dieselbe mittlere Last wie eine feste Pause von 5 Sekunden. Gleichverteilung ist der einfache Standard; eine Normalverteilung (Gauß) bündelt Pausen um einen typischen Wert, eine Exponentialverteilung liefert viele kurze und wenige lange Wartezeiten.&lt;/p&gt;
&lt;h2&gt;Wie wählt man Werte für die Think Time?&lt;/h2&gt;
&lt;p&gt;Leiten Sie sie aus dem ab, was echte Nutzer bei jedem Schritt tun, mit Web-Analytics, Zugriffslogs oder Real-User-Monitoring. Nehmen Sie pro Schritt einen eigenen Wert, denn eine Produktseite zu lesen dauert länger, als einen Knopf zu drücken.&lt;/p&gt;
&lt;p&gt;Die Verweildauer auf einer Seite in Analytics oder der Abstand zwischen aufeinanderfolgenden Anfragen einer Sitzung in den Zugriffslogs kommt der Think Time für diesen Schritt nahe. Nehmen Sie den Median als mittlere Pause und die Streuung für den Zufallsbereich, und lassen Sie Leerlauf wie einen über Mittag offenen Tab weg.&lt;/p&gt;
&lt;p&gt;Eine API, die von anderen Programmen aufgerufen wird, hat keinen Menschen in der Schleife, also modellieren Sie direkt ihre Anfragerate. Ohne Daten schreiben Sie die angenommenen Werte in den Testplan, damit ein späterer Lauf sie ersetzen kann; die &lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Schritt-für-Schritt-Anleitung zum Lasttest&lt;/a&gt; zeigt, wo sie hingehören.&lt;/p&gt;
&lt;h2&gt;Wie fügt man Think Time in k6, JMeter, Gatling, Locust und Artillery ein?&lt;/h2&gt;
&lt;p&gt;Jedes Tool hat einen eigenen Pausenbefehl, und die meisten bieten zusätzlich Pacing oder eine Ratensteuerung.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Feste Pause&lt;/th&gt;
&lt;th&gt;Zufällige Pause&lt;/th&gt;
&lt;th&gt;Pacing oder Rate&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;Arrival-Rate-Executors&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 oder 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; (in &lt;code&gt;config.http.defaults&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Ankunftsrate pro Phase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Die Tabelle oben und die Hinweise unten stammen aus der Dokumentation der Projekte, geprüft am 9. Oktober 2026; alle fünf Tools kommen in unserem Überblick über &lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools&lt;/a&gt; vor.&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; pausiert den virtuellen Benutzer für &lt;code&gt;t&lt;/code&gt; Sekunden; die Dokumentation baut zufällige Pausen mit &lt;code&gt;Math.random()&lt;/code&gt; oder mit &lt;code&gt;randomIntBetween()&lt;/code&gt; aus 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 bis 8 Sekunden
  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; Unter den &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#timers&quot;&gt;Timern&lt;/a&gt; nimmt der Constant Timer eine Verzögerung in Millisekunden, Uniform und Gaussian Random Timer addieren einen Zufallsanteil zu einem festen Offset, und der Constant Throughput Timer variiert seine Pausen, um ein Ziel an Samples pro Minute zu halten. Ein Timer läuft vor jedem Sampler in seinem Gültigkeitsbereich, ein einzelner Timer auf Ebene der Thread Group pausiert also vor jeder Anfrage.&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; wartet eine gleichverteilte Zufallszeit, und &lt;code&gt;pace(30)&lt;/code&gt; in einer Schleife lässt sie höchstens einmal alle 30 Sekunden laufen. Auf &lt;a href=&quot;https://docs.gatling.io/concepts/simulation/&quot;&gt;Simulationsebene&lt;/a&gt; können Sie alle Pausen auf eine Normal- oder Exponentialverteilung umstellen oder sie mit &lt;code&gt;disablePauses()&lt;/code&gt; abschalten.&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; greift nach jeder Aufgabe, eine Aufgabe mit zwei Anfragen unter &lt;code&gt;constant_throughput(2)&lt;/code&gt; schickt also vier Anfragen pro Sekunde und Benutzer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery.&lt;/strong&gt; Ein &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/http&quot;&gt;&lt;code&gt;think&lt;/code&gt;-Schritt&lt;/a&gt; pausiert für eine Anzahl Sekunden, und eine &lt;code&gt;think.jitter&lt;/code&gt;-Einstellung unter &lt;code&gt;config.http.defaults&lt;/code&gt; streut jeden think-Schritt zufällig. Zwei dieser Tools im direkten Vergleich: &lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Spielt Think Time in einem Arrival-Rate-Test eine Rolle?&lt;/h2&gt;
&lt;p&gt;Für die Anfragerate eine kleinere als bei fester Benutzerzahl. Wenn das Tool neue Iterationen mit fester Rate startet, bestimmen Pausen, wie lange jeder Benutzer bleibt und damit, wie viele gleichzeitig aktiv sind.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;Arrival-Rate-Executors&lt;/a&gt; von k6 takten Iterationen über ihre Rate, und die Dokumentation rät von einem &lt;code&gt;sleep&lt;/code&gt; am Ende der Iteration ab; die &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;Lastphasen&lt;/a&gt; von Artillery erzeugen ebenso eine feste Zahl neuer virtueller Benutzer pro Sekunde (beides geprüft am 9. Oktober 2026). Think Time zwischen den Schritten prägt trotzdem jede Sitzung.&lt;/p&gt;
&lt;h2&gt;Wie setzen die Skript-Werkzeuge von LoadFocus Think Time?&lt;/h2&gt;
&lt;p&gt;Sie schreiben sie als Startwert in das k6- oder JMeter-Skript, den Sie anschließend anpassen.&lt;/p&gt;
&lt;p&gt;Der &lt;a href=&quot;https://loadfocus.com/docs/de-de/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 aus cURL, HAR, Postman oder OpenAPI&lt;/a&gt; macht aus einer aufgezeichneten Anfrage ein k6-Skript, das jede Iteration mit &lt;code&gt;sleep(1)&lt;/code&gt; beendet; behandeln Sie diese Sekunde als Platzhalter für Ihre gemessenen Werte. Der KI-Testgenerator von LoadFocus hat die Anweisung, jedem Schritt eine Think Time zu geben, schreibt sie als &lt;code&gt;sleep()&lt;/code&gt; für k6 oder als Constant Timer für JMeter und warnt, wenn ein Szenario mit mehreren Schritten keine hat.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Kann man einen Lasttest ohne Think Time fahren?&lt;/strong&gt;
Ja, um den maximalen Durchsatz eines Endpunkts zu finden oder für einen Stresstest, sofern Sie das Ergebnis als Anfragen pro Sekunde angeben. Über die Zahl echter Nutzer, die das System bedienen kann, sagt es wenig.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zählt Think Time zur Antwortzeit?&lt;/strong&gt;
Nicht bei den Zeiten einzelner Anfragen. In k6 umfasst &lt;code&gt;http_req_duration&lt;/code&gt; Senden, Warten und Empfangen, während &lt;code&gt;iteration_duration&lt;/code&gt; den ganzen Durchlauf abdeckt (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;Metrik-Referenz&lt;/a&gt;, geprüft am 9. Oktober 2026). Ein Transaction Controller in JMeter lässt Timer aus seiner Zeit heraus, außer Sie aktivieren die Option, die sie einschließt.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-vs-closed-workload-model/&quot;&gt;Offenes vs geschlossenes Lastmodell: welches passt wann?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/littles-law-load-testing/&quot;&gt;Little&amp;#39;s Law im Lasttest: Tests dimensionieren und prüfen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Lasttest durchführen: eine Schritt-für-Schritt-Anleitung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/queueing-theory/&quot;&gt;Warteschlangentheorie: was sie ist und warum Latenz steigt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>WebSocket-Lasttest-Tools: sechs Optionen im Vergleich</title><link>https://loadtest.app/de/websocket-load-testing-tools/</link><guid isPermaLink="true">https://loadtest.app/de/websocket-load-testing-tools/</guid><description>WebSocket-Lasttest-Tools im Vergleich: k6, Artillery, Gatling, JMeter, Locust und Tsung, was jedes von Haus aus kann und wann ein anderes besser passt.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;WebSocket-Lasttest-Tools mit eingebauter Unterstützung sind k6, Artillery, Gatling und Tsung, während JMeter das Plugin WebSocket Samplers braucht und Locust eigenen Client-Code oder seinen experimentellen Socket.IO-User. Wählen Sie nach der Sprache, in der Ihr Team schreibt, und danach, wie genau Sie die Nachrichten prüfen müssen, die der Server zurückschickt.&lt;/p&gt;
&lt;p&gt;Für diesen Artikel haben wir die Tools nicht gegen einen WebSocket-Server laufen lassen. Die Fakten stammen aus der Dokumentation und den Repositories der Projekte, geprüft am 9. Oktober 2026, und die Hinweise „Wählen Sie stattdessen“ sind unsere Einschätzung.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;WebSocket-Unterstützung&lt;/th&gt;
&lt;th&gt;Tests geschrieben in&lt;/th&gt;
&lt;th&gt;Prüfen, was der Server sendet&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;Eingebaut: &lt;code&gt;k6/websockets&lt;/code&gt;, älter &lt;code&gt;k6/ws&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Event-Handler in Ihrem Skript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;Eingebaute Engines &lt;code&gt;ws&lt;/code&gt; und &lt;code&gt;socketio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;YAML, dazu JavaScript-Funktionen&lt;/td&gt;
&lt;td&gt;Socket.IO-Antworten und Acknowledgements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Teil des HTTP-SDK&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript&lt;/td&gt;
&lt;td&gt;Checks, die auf eine erwartete Nachricht warten&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;In der GUI gebaute Testpläne&lt;/td&gt;
&lt;td&gt;Request-Response- und Lese-Sampler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Eigener Client oder der experimentelle &lt;code&gt;SocketIOUser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Was Ihr Code meldet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tsung&lt;/td&gt;
&lt;td&gt;Eingebauter Sitzungstyp &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; wartet auf eine Serverantwort&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was unterscheidet WebSocket-Last von HTTP-Last?&lt;/h2&gt;
&lt;p&gt;Ein WebSocket-Benutzer öffnet eine Verbindung und hält sie die ganze Sitzung über, und der Server kann jederzeit Nachrichten senden. Ein Test hat deshalb zwei Stellschrauben, offene Verbindungen und Nachrichten pro Sekunde, und jede belastet den Server auf eigene Weise.&lt;/p&gt;
&lt;p&gt;Der &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/websockets/&quot;&gt;WebSocket-Leitfaden von k6&lt;/a&gt; beschreibt Vollduplex-Verkehr über eine einzige TCP-Verbindung und erklärt, dass ein virtueller Benutzer dabei eine Event-Loop ausführt, solange der Socket offen ist, und die Hauptfunktion nicht mehr in Schleife durchläuft. Die &lt;a href=&quot;https://docs.gatling.io/reference/script/websocket/&quot;&gt;WebSocket-Referenz von Gatling&lt;/a&gt; ergänzt, dass der Verkehr in beide Richtungen fließt, sodass das HTTP-Modell aus Anfrage und Antwort nicht mehr passt.&lt;/p&gt;
&lt;p&gt;Planen Sie drei Arten von Tests. Viele untätige Verbindungen zeigen, wie viele Sockets Ihre Server halten können. Eine kleinere Gruppe gesprächiger Clients prüft die Nachrichtenverarbeitung. Ein Broadcast, bei dem eine Nachricht an alle Abonnenten geht, prüft den Push-Pfad.&lt;/p&gt;
&lt;h2&gt;Was sollten Sie in einem WebSocket-Lasttest messen?&lt;/h2&gt;
&lt;p&gt;Messen Sie Verbindungsaufbauzeit, Nachrichtenlatenz und abgebrochene Verbindungen, dazu, wie viele Verbindungen offen bleiben. Diese Werte zeigen, was Nutzer einer Echtzeit-App spüren.&lt;/p&gt;
&lt;p&gt;Zu den &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;eingebauten Metriken von k6&lt;/a&gt; gehören &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; und Nachrichtenzähler. Keine davon misst eine Anwendungsnachricht, für die Zeit zwischen der Nachricht eines Clients und der Antwort des Servers brauchen Sie also eine eigene Trend-Metrik. Die &lt;code&gt;ws&lt;/code&gt;-Engine von Artillery meldet Nachrichtenzähler und -raten, und ihre Socket.IO-Engine ergänzt &lt;code&gt;socketio.response_time&lt;/code&gt;, die Zeit vom Senden einer Nachricht bis zur Antwort.&lt;/p&gt;
&lt;p&gt;Für abgebrochene Verbindungen zählen Sie Close- und Error-Events, die Ihr Skript nicht selbst ausgelöst hat, und vergleichen die gestarteten Sitzungen mit denen, die am Ende jeder Stufe noch offen sind.&lt;/p&gt;
&lt;h2&gt;Wann ist k6 das richtige WebSocket-Tool?&lt;/h2&gt;
&lt;p&gt;Wenn Ihr Team JavaScript schreibt und jeder virtuelle Benutzer mehrere Sockets gleichzeitig halten soll. k6 bringt WebSocket-Unterstützung von Haus aus mit, ohne Erweiterung.&lt;/p&gt;
&lt;p&gt;Das Modul &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; folgt der WebSocket-API des Browsers und nutzt eine globale Event-Loop, mit der ein virtueller Benutzer mehrere Verbindungen offen halten kann. Das ältere Modul &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; ist weiter dokumentiert, k6 empfiehlt für neue Tests aber &lt;code&gt;k6/websockets&lt;/code&gt;, und &lt;code&gt;k6/experimental/websockets&lt;/code&gt; ist veraltet.&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;&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;Thresholds&lt;/a&gt; funktionieren auch mit eigenen Metriken, ein verfehltes Latenzziel liefert der CI also einen Exit-Code ungleich null. Wählen Sie stattdessen Artillery, wenn Ihr Server Socket.IO spricht und Sie Emits und Acknowledgements ohne eigenen Client-Code prüfen wollen. Die weiteren Unterschiede behandelt unser Vergleich &lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Wann passt Artillery?&lt;/h2&gt;
&lt;p&gt;Wenn Sie kurze YAML-Szenarien wollen oder Ihr Server Socket.IO nutzt. Beide Engines sind in Artillery selbst enthalten.&lt;/p&gt;
&lt;p&gt;Ein Szenario auf der &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/websocket&quot;&gt;WebSocket-Engine&lt;/a&gt; besteht aus fünf Aktionen: &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; und &lt;code&gt;function&lt;/code&gt;. Die &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/socketio&quot;&gt;Socket.IO-Engine&lt;/a&gt; geht weiter: Ein &lt;code&gt;emit&lt;/code&gt; kann die erwartete Antwort angeben, ein Acknowledgement per JSONPath-Abgleich prüfen und sich ein Szenario mit HTTP-Anfragen teilen, was zu Apps passt, die sich per HTTP anmelden, bevor sie einen Socket öffnen.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen k6 oder Gatling, wenn ein Test prüfen muss, was ein reiner WebSocket-Server zurückschickt, denn die Dokumentation der &lt;code&gt;ws&lt;/code&gt;-Engine beschreibt keinen Schritt, der auf eine Antwort wartet oder sie abgleicht.&lt;/p&gt;
&lt;h2&gt;Für wen ist Gatling bei WebSockets gedacht?&lt;/h2&gt;
&lt;p&gt;Für Teams auf der JVM oder mit dem JavaScript-SDK von Gatling, die Prüfungen von Nachrichten direkt ins Szenario schreiben wollen. WebSocket-Unterstützung ist Teil des HTTP-SDK von Gatling, HTTP- und WebSocket-Schritte teilen sich also eine Simulation.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://docs.gatling.io/reference/script/websocket/&quot;&gt;Referenz&lt;/a&gt; behandelt &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;sendText&lt;/code&gt;, &lt;code&gt;sendBytes&lt;/code&gt; und &lt;code&gt;close&lt;/code&gt; sowie Checks, die blockieren, bis die erwartete Nachricht eintrifft oder ein Timeout abläuft. Über Protokolleinstellungen lassen sich vom Server geschlossene Sockets neu verbinden, ausgewählte Textnachrichten wie ein Ping automatisch beantworten und Nachrichten puffern, auf die kein Check gepasst hat. Laut &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;Repository&lt;/a&gt; gehört WebSocket ohne Einschränkungen zur Community-Edition unter Apache 2.0.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen k6, wenn Sie auf gepushte Nachrichten lieber in Event-Handlern reagieren als mit blockierenden Checks.&lt;/p&gt;
&lt;h2&gt;Kann JMeter WebSockets lasttesten?&lt;/h2&gt;
&lt;p&gt;Ja, mit einem Plugin. JMeter selbst hat keinen WebSocket-Sampler, die übliche Erweiterung ist WebSocket Samplers von Peter Doornbosch.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html&quot;&gt;Komponentenreferenz&lt;/a&gt; von JMeter erwähnt WebSocket überhaupt nicht. Das &lt;a href=&quot;https://bitbucket.org/pjtr/jmeter-websocket-samplers/src/master/&quot;&gt;Repository des Plugins&lt;/a&gt; beschreibt sechs Sampler: Verbindung öffnen, Request-Response, Ping-Pong, einzelnes Lesen, einzelnes Schreiben und Schließen. Sie laufen im Thread der Thread-Gruppe, unterstützen &lt;code&gt;wss&lt;/code&gt; und Binärframes und können Frames herausfiltern, die für einen Test keine Rolle spielen. Installiert wird es über den Plugins Manager oder als JAR in &lt;code&gt;lib/ext&lt;/code&gt;; Version 1.3.2 wurde im Januar 2026 getaggt (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Wählen Sie ein anderes Tool, wenn Sie kein Drittanbieter-Plugin auf jedem Lastgenerator pflegen möchten.&lt;/p&gt;
&lt;h2&gt;Was ist mit Locust und Tsung?&lt;/h2&gt;
&lt;p&gt;Locust erreicht reine WebSockets nur über Client-Code, den Sie selbst ergänzen, und Tsung unterstützt sie in seiner XML-Konfiguration, veröffentlicht aber selten neue Versionen. Beides funktioniert, mit mehr Aufwand.&lt;/p&gt;
&lt;p&gt;Laut der &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;Dokumentation von Locust&lt;/a&gt; unterstützt das Tool von Haus aus nur HTTP und HTTPS; andere Protokolle kommen hinzu, indem Sie eine Client-Bibliothek kapseln und nach jedem Aufruf das Event &lt;code&gt;request&lt;/code&gt; auslösen. Die Bibliothek muss sich von gevent patchen lassen, sonst blockiert sie den ganzen Prozess. Für Socket.IO gibt es einen experimentellen &lt;code&gt;SocketIOUser&lt;/code&gt;. Wählen Sie Locust, wenn Ihr Team Python schreibt und diesen Client-Code gern selbst pflegt.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/processone/tsung&quot;&gt;Tsung&lt;/a&gt; ist ein Erlang-Projekt, das sich als verteiltes Lasttest-Tool für mehrere Protokolle beschreibt. Seine &lt;a href=&quot;https://github.com/processone/tsung/blob/develop/docs/conf-sessions.rst&quot;&gt;Sitzungsdokumentation&lt;/a&gt; definiert für WebSocket die Anfragen &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;message&lt;/code&gt; und &lt;code&gt;close&lt;/code&gt;, mit einem Attribut &lt;code&gt;ack&lt;/code&gt;, um auf eine Antwort zu warten. Die &lt;a href=&quot;https://github.com/processone/tsung/tags&quot;&gt;letzte getaggte Version&lt;/a&gt;, 1.8.0, stammt vom März 2023.&lt;/p&gt;
&lt;h2&gt;Wo passt ein gehosteter Runner wie LoadFocus hinein?&lt;/h2&gt;
&lt;p&gt;Viele offene Sockets von eigenen Rechnern zu halten, macht Arbeit, und ein gehosteter Runner übernimmt die Lasterzeugung. Am besten passt das, wenn Ihre Tests schon k6-Skripte sind.&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=websocket-load-testing-tools&quot;&gt;führt k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen aus, und seine k6-Seite nennt WebSocket-Verbindungen unter den unterstützten k6-Funktionen. Außerdem gibt es eine &lt;a href=&quot;https://loadfocus.com/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;Vorlage für WebSocket-Tests mit Ramp-up und Ramp-down&lt;/a&gt; (auf Englisch). Ob LoadFocus JMeter-Plugins wie WebSocket Samplers ausführt, haben wir nicht geprüft, dazu machen wir also keine Aussage.&lt;/p&gt;
&lt;h2&gt;Wie wählt man zwischen ihnen?&lt;/h2&gt;
&lt;p&gt;Gehen Sie von der Sprache Ihres Teams aus und fragen Sie dann, ob Sie reine WebSockets oder Socket.IO testen und wie streng Sie gepushte Nachrichten prüfen müssen. Danach bleiben meist ein oder zwei Kandidaten.&lt;/p&gt;
&lt;p&gt;Schreiben Sie in beiden denselben kurzen Test mit Verbinden, Senden und Empfangen, und vergleichen Sie Verbindungsaufbauzeit und Nachrichtenlatenz bei geringer Last. Unsere Anleitung &lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Lasttest durchführen&lt;/a&gt; führt durch die Schritte, und der Überblick &lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools&lt;/a&gt; vergleicht diese Projekte über WebSockets hinaus.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Mit welchem WebSocket-Lasttest-Tool sollte ich anfangen?&lt;/strong&gt;
Wenn Ihr Team JavaScript schreibt, beginnen Sie mit k6, das WebSocket-Unterstützung eingebaut hat. Für Socket.IO-Apps braucht die Engine von Artillery am wenigsten Code, und JVM-Teams fühlen sich in Gatling zu Hause.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann JMeter WebSockets ohne Plugin testen?&lt;/strong&gt;
Die Komponentenreferenz nennt keinen WebSocket-Sampler, der praktische Weg ist also das Plugin WebSocket Samplers, installiert über den Plugins Manager oder als JAR in &lt;code&gt;lib/ext&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sollte ich k6/ws oder k6/websockets verwenden?&lt;/strong&gt;
Nehmen Sie für neue Tests &lt;code&gt;k6/websockets&lt;/code&gt;, wie die Dokumentation von k6 empfiehlt. Das ältere Modul &lt;code&gt;k6/ws&lt;/code&gt; ist für bestehende Skripte weiter dokumentiert.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools: sechs Optionen im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/how-to-load-test-a-graphql-api/&quot;&gt;GraphQL-API-Lasttest: ein praktischer Leitfaden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/http-benchmarking-tools/&quot;&gt;HTTP-Benchmark-Tools: wrk, hey, oha, ab und weitere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/grpc-load-testing/&quot;&gt;gRPC-Lasttest: Tools, Einrichtung und Kennzahlen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/artillery-load-testing/&quot;&gt;Artillery-Lasttests: das Node.js-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tsung-load-testing/&quot;&gt;Tsung-Lasttests: das Erlang-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Lasttest durchführen: eine Schritt-für-Schritt-Anleitung</title><link>https://loadtest.app/de/how-to-run-a-load-test/</link><guid isPermaLink="true">https://loadtest.app/de/how-to-run-a-load-test/</guid><description>So führen Sie einen Lasttest durch: Ziel festlegen, eine Nutzerreise skripten, mit einem Nutzer prüfen, Last steigern und die wichtigen Ergebnisse lesen.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, einem in diesem Artikel erwähnten Lasttest-Dienst.&lt;/p&gt;&lt;p&gt;Für einen Lasttest legen Sie fest, wie ein gutes Ergebnis aussieht, skripten eine realistische Nutzerreise, prüfen das Skript mit einem einzelnen Nutzer und steigern dann die Last in Stufen, während Sie Antwortzeiten und Fehler beobachten. Vergleichen Sie das Gemessene mit dem Ziel vom Anfang und ändern Sie vor dem nächsten Lauf immer nur eine Sache.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Schritt&lt;/th&gt;
&lt;th&gt;Was Sie tun&lt;/th&gt;
&lt;th&gt;Fertig, wenn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1. Ziel festlegen&lt;/td&gt;
&lt;td&gt;Die zu testende Last und die Zahlen für ein Bestanden wählen&lt;/td&gt;
&lt;td&gt;Sie die Kriterien in einem Satz aufschreiben können&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Nutzerreise skripten&lt;/td&gt;
&lt;td&gt;Einen echten Nutzerpfad in ein Skript übertragen&lt;/td&gt;
&lt;td&gt;Das Skript ohne Fehler läuft&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Smoke-Test&lt;/td&gt;
&lt;td&gt;Mit einem virtuellen Benutzer ausführen&lt;/td&gt;
&lt;td&gt;Jede Prüfung besteht&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Last steigern&lt;/td&gt;
&lt;td&gt;Last in Stufen erhöhen und am Ziel halten&lt;/td&gt;
&lt;td&gt;Das Ziel oder eine Abbruchbedingung erreicht ist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Ergebnisse lesen&lt;/td&gt;
&lt;td&gt;Perzentile und Fehler mit dem Ziel vergleichen&lt;/td&gt;
&lt;td&gt;Sie wissen, ob er bestanden hat und was sich ändern muss&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was sollten Sie vor einem Lasttest festlegen?&lt;/h2&gt;
&lt;p&gt;Legen Sie fest, für welche Last Sie testen und welches Ergebnis als bestanden gilt. Ohne beides liefert ein Lasttest Zahlen, aber keine Antwort.&lt;/p&gt;
&lt;p&gt;Gehen Sie von echtem Traffic aus, wenn Sie welchen haben. Analytics oder Zugriffslogs zeigen die stärkste Stunde, wie viele Anfragen pro Sekunde ankommen und welche Seiten oder Endpunkte den Großteil davon abbekommen. Setzen Sie das Ziel über diese Spitze, denn es geht darum zu wissen, dass Sie Reserve haben. Schreiben Sie dann die Kriterien als Zahlen auf, zum Beispiel: Das 95. Perzentil der Antwortzeit bleibt unter 500 ms und weniger als 1 % der Anfragen schlagen fehl, bei 200 virtuellen Benutzern.&lt;/p&gt;
&lt;p&gt;Zwei praktische Entscheidungen gehören ebenfalls hierher. Wählen Sie eine Umgebung, die der Produktion in Größe und Konfiguration ähnelt, denn ein Staging-Server mit einem Viertel der Kapazität sagt wenig über die Produktion. Und stellen Sie sicher, dass Sie sie testen dürfen: Ein Lasttest gegen ein System, das Ihnen nicht gehört oder das Sie mit anderen Teams teilen, sieht ohne Vorwarnung genau wie ein Angriff aus.&lt;/p&gt;
&lt;h2&gt;Wie skriptet man eine realistische Nutzerreise?&lt;/h2&gt;
&lt;p&gt;Skripten Sie den Pfad, der für das Geschäft am wichtigsten ist, Schritt für Schritt und mit Pausen dort, wo ein echter Mensch lesen oder tippen würde. Ein Skript, das eine einzige URL so schnell wie möglich aufruft, misst zwar etwas, aber selten das, worauf es ankommt.&lt;/p&gt;
&lt;p&gt;Bei einem Shop könnte das so aussehen: Startseite öffnen, suchen, ein Produkt öffnen, in den Warenkorb legen. Bei einer API: anmelden, Einträge auflisten, einen Eintrag abrufen. Bauen Sie zwischen den Schritten eine kurze Pause ein (Think Time), verwenden Sie wechselnde Testdaten, damit sich Caches wie im echten Betrieb verhalten, und prüfen Sie jede Antwort, damit eine Fehlerseite nicht als schnelle Antwort durchgeht.&lt;/p&gt;
&lt;p&gt;Hier ist das Skript, das wir für den Beispiellauf in dieser Anleitung verwendet haben, geschrieben für k6. Es fährt auf 10 virtuelle Benutzer hoch, hält die Last und fährt wieder herunter, mit zwei eingebauten Kriterien:&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;Eine echte Nutzerreise hat mehrere Anfragen und echte URLs. Diese bleibt bewusst winzig, damit die Schritte leicht nachzuvollziehen sind.&lt;/p&gt;
&lt;h2&gt;Warum zuerst ein Smoke-Test mit einem Nutzer?&lt;/h2&gt;
&lt;p&gt;Ein Smoke-Test mit einem virtuellen Benutzer beweist, dass das Skript funktioniert, bevor Sie irgendetwas unter echte Last setzen. Er ist der billigste Weg, eine falsche URL, ein fehlendes Login-Token oder eine Prüfung zu finden, die immer fehlschlägt.&lt;/p&gt;
&lt;p&gt;In k6 können Sie &lt;a href=&quot;https://grafana.com/docs/k6/latest/get-started/running-k6/&quot;&gt;die Last über die Kommandozeile überschreiben&lt;/a&gt;, sodass dasselbe Skript einmal mit einem einzigen Benutzer läuft:&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;Bei unserem Lauf bestand die eine Prüfung, das Skript war also bereit für Last. Wenn hier eine Prüfung fehlschlägt, reparieren Sie zuerst das Skript: Fehler bei einem Nutzer werden bei hundert zu Rauschen.&lt;/p&gt;
&lt;h2&gt;Wie sollte man die Last steigern?&lt;/h2&gt;
&lt;p&gt;Erhöhen Sie die Last in Stufen und halten Sie jede Stufe lange genug, damit sie sich einpendelt, statt direkt auf das Ziel zu springen. Eine stufenweise Rampe zeigt Ihnen, ab welcher Last es schlechter wird.&lt;/p&gt;
&lt;p&gt;Eine übliche Form: auf eine erste Stufe hochfahren, einige Minuten halten, auf die nächste Stufe hochfahren, wieder halten und so weiter bis zum Ziel, dann herunterfahren. Wenn Sie jede Haltephase einzeln betrachten, sehen Sie, ob die Antwortzeiten gleichmäßig mit der Last steigen oder erst flach bleiben und dann springen. Dieser Sprung, der Punkt, an dem jeder zusätzliche Nutzer jede Anfrage langsamer macht, ist das Nützlichste, was ein Lasttest finden kann. Unser Beispiel fährt nur auf 10 Benutzer hoch und hält 20 Sekunden, genug, um die Stufen zu zeigen, aber viel zu kurz für einen echten Test.&lt;/p&gt;
&lt;h2&gt;Was sollten Sie während des Tests beobachten?&lt;/h2&gt;
&lt;p&gt;Beobachten Sie die Perzentile der Antwortzeit, die Fehlerrate und den Durchsatz auf Seiten des Lastgenerators sowie CPU, Speicher und Datenbanklast auf dem getesteten System. Die ersten drei sagen Ihnen, wie es sich für Nutzer anfühlen würde, die letzten drei, warum.&lt;/p&gt;
&lt;p&gt;Vereinbaren Sie vor dem Start Abbruchbedingungen, zum Beispiel: abbrechen, wenn die Fehlerrate 5 % übersteigt oder die Antwortzeiten mehrere Sekunden erreichen. Ein System weiter zu belasten, das bereits umgefallen ist, bringt keine Erkenntnis, und in einer geteilten Umgebung stört es die Arbeit anderer.&lt;/p&gt;
&lt;p&gt;Beobachten Sie auch den Lastgenerator. Wenn er bei voller CPU-Auslastung läuft, können die langsamen Antworten von Ihrem eigenen Laptop kommen statt vom Server.&lt;/p&gt;
&lt;h2&gt;Wie liest man die Ergebnisse eines Lasttests?&lt;/h2&gt;
&lt;p&gt;Lesen Sie die Perzentile und die Fehlerrate gegen die Kriterien, die Sie zu Beginn aufgeschrieben haben. Die durchschnittliche Antwortzeit ist die am wenigsten nützliche Zahl im Bericht.&lt;/p&gt;
&lt;p&gt;Das hat unser Beispiellauf gemeldet (35 Sekunden, bis zu 10 virtuelle Benutzer, eine kleine statische Seite auf einem Laptop, ausgeführt am 8. Oktober 2026):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metrik&lt;/th&gt;
&lt;th&gt;Wert&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Anfragen&lt;/td&gt;
&lt;td&gt;282 (8 pro Sekunde)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fehlgeschlagene Anfragen&lt;/td&gt;
&lt;td&gt;0 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Durchschnittliche Antwortzeit&lt;/td&gt;
&lt;td&gt;0,69 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90. Perzentil&lt;/td&gt;
&lt;td&gt;0,66 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95. Perzentil&lt;/td&gt;
&lt;td&gt;0,71 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99. Perzentil&lt;/td&gt;
&lt;td&gt;2,68 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Langsamste Anfrage&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;Beide bestanden&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Die Zahlen sind winzig, weil das Ziel eine statische Datei auf demselben Rechner war, sie taugen also nicht als Benchmark. Die Lehre steckt in der Form: Der Durchschnitt lag über dem 90. Perzentil, weil eine Handvoll langsamer Anfragen ihn nach oben gezogen hat. Perzentile beschreiben, was die meisten Anfragen erlebt haben, und das 99. Perzentil und die langsamste Anfrage zeigen den Ausläufer, den einige wenige Nutzer treffen. Bewerten Sie den Lauf am Perzentil aus Ihren Kriterien und nutzen Sie den Ausläufer, um zu entscheiden, ob etwas genauer angeschaut werden muss.&lt;/p&gt;
&lt;p&gt;Wenn ein Lauf sein Ziel verfehlt, ändern Sie eine Sache (eine Abfrage, eine Cache-Einstellung, eine Instanzgröße) und führen Sie denselben Test erneut aus, damit Sie wissen, was den Unterschied gemacht hat.&lt;/p&gt;
&lt;h2&gt;Wann sollte der Test aus der Cloud laufen?&lt;/h2&gt;
&lt;p&gt;Verlegen Sie den Lastgenerator in die Cloud, wenn ein Rechner die nötige Last nicht erzeugen kann oder wenn es darauf ankommt, wo Ihre Nutzer sind. Ein Laptop im Büro-WLAN misst Ihre Büroverbindung genauso wie Ihren Server.&lt;/p&gt;
&lt;p&gt;Dasselbe k6-Skript kann auf Infrastruktur laufen, die Sie selbst betreiben, auf dem gehosteten Dienst von Grafana oder bei &lt;a href=&quot;https://loadfocus.com/de-de/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, das k6-Skripte aus 25 Cloud-Regionen ausführt&lt;/a&gt;. Die Berichte dort schlüsseln Ergebnisse nach Standort auf und zeigen die Antwortzeit im Verhältnis zur Zahl der virtuellen Benutzer, und genau dort wird der oben beschriebene Sprung sichtbar (&lt;a href=&quot;https://loadfocus.com/docs/de-de/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;Ergebnisse in LoadFocus lesen&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Wie lange sollte ein Lasttest laufen?&lt;/strong&gt;
Lange genug, um die Ziellast nach dem Hochfahren mehrere Minuten zu halten, damit kurze Spitzen nicht über das Ergebnis entscheiden. Mindestens 10 Minuten Haltezeit sind ein vernünftiger Start, deutlich länger, wenn Sie nach Speicherlecks oder schleichender Verschlechterung suchen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wie viele virtuelle Benutzer brauche ich?&lt;/strong&gt;
Leiten Sie es aus echtem Traffic ab. Nehmen Sie die Anfragen pro Sekunde der stärksten Stunde, schätzen Sie, wie viele Anfragen eine Nutzerreise macht und wie lange sie dauert, und bemessen Sie die virtuellen Benutzer so, dass der Test diese Rate plus etwas Reserve erzeugt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ist es sicher, die Produktion zu testen?&lt;/strong&gt;
Das kann es sein, mit Vorsicht: zu einer ruhigen Zeit testen, die Verantwortlichen informieren, Abbruchbedingungen festlegen und deutlich unter der erwarteten Spitze beginnen. Viele Teams bevorzugen eine Staging-Umgebung in Produktionsgröße, damit ein fehlgeschlagener Test keine Kunden treffen kann.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-test-pass-fail-criteria/&quot;&gt;Pass/Fail-Kriterien für Lasttests: so legen Sie sie fest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-testing-in-github-actions/&quot;&gt;Lasttests in GitHub Actions: ein praktischer Leitfaden&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>k6 vs Artillery: welches Lasttest-Tool passt zu Ihrem Team?</title><link>https://loadtest.app/de/k6-vs-artillery/</link><guid isPermaLink="true">https://loadtest.app/de/k6-vs-artillery/</guid><description>k6 und Artillery im Vergleich: Skripte, Protokolle, Pass/Fail-Prüfungen, Skalierung und Lizenzen, mit klaren Hinweisen, wann welches Tool besser passt.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;k6 und Artillery sind beide quelloffene Lasttest-Tools, bei denen Tests als Code entstehen, und beide testen eine HTTP-API zuverlässig unter Last. Nehmen Sie k6, wenn Sie ein einzelnes Binary, Testlogik in JavaScript und eingebaute Pass/Fail-Schwellenwerte wollen. Nehmen Sie Artillery, wenn Ihr Team ohnehin mit Node.js arbeitet, kurze YAML-Szenarien bevorzugt oder Playwright-Browsertests und verteilte Läufe auf AWS oder Azure direkt von der Kommandozeile braucht.&lt;/p&gt;
&lt;p&gt;Die folgenden Fakten stammen aus der Dokumentation und den Repositories der beiden Projekte, geprüft am 8. Oktober 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;Lizenz&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MPL-2.0, einige Azure-Module unter BSL (&lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;Repository&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laufzeit&lt;/td&gt;
&lt;td&gt;Ein Go-Binary mit eingebetteter JavaScript-Engine&lt;/td&gt;
&lt;td&gt;Node.js, aktuelle LTS-Version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testskripte&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;YAML, TypeScript oder JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kernprotokolle&lt;/td&gt;
&lt;td&gt;HTTP, WebSockets, gRPC&lt;/td&gt;
&lt;td&gt;HTTP, WebSocket, Socket.IO (gRPC und Kinesis als Zusatz-Engines)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browsertests&lt;/td&gt;
&lt;td&gt;Eingebautes Browser-Modul&lt;/td&gt;
&lt;td&gt;Playwright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pass/Fail-Prüfungen&lt;/td&gt;
&lt;td&gt;Thresholds&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ensure&lt;/code&gt;-Plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skalierung&lt;/td&gt;
&lt;td&gt;k6-operator auf Kubernetes oder Grafana Cloud k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run-lambda&lt;/code&gt; oder &lt;code&gt;run-fargate&lt;/code&gt; auf AWS, &lt;code&gt;run-aci&lt;/code&gt; auf Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Was ist der Unterschied zwischen k6 und Artillery?&lt;/h2&gt;
&lt;p&gt;Sie unterscheiden sich vor allem in der Laufzeitumgebung und darin, wie Sie Last beschreiben. k6 ist ein kompiliertes Go-Tool, das JavaScript-Testcode ausführt, Artillery ist ein Node.js-Tool, das YAML- oder JavaScript-Szenarien liest.&lt;/p&gt;
&lt;p&gt;Das merken Sie schon am ersten Tag. Für k6 installieren Sie ein Paket oder &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;ein eigenständiges Binary&lt;/a&gt;, ohne eine Laufzeitumgebung pflegen zu müssen. Artillery &lt;a href=&quot;https://www.artillery.io/docs/get-started/get-artillery&quot;&gt;braucht Node.js&lt;/a&gt; und wird über npm installiert. In einem JavaScript-Projekt fühlt sich das natürlich an, überall sonst ist es eine weitere Laufzeitumgebung, die aktuell bleiben muss.&lt;/p&gt;
&lt;p&gt;Bei den Protokollen deckt die Schnittmenge den Großteil der Webarbeit ab: Beide sprechen von Haus aus HTTP und WebSockets. k6 bringt außerdem gRPC mit, Artillery Socket.IO. gRPC und Kinesis bekommt Artillery über &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;Zusatz-Engines&lt;/a&gt;, die Sie separat installieren (geprüft am 9. Oktober 2026), und k6 reicht über sein Ökosystem an Erweiterungen weiter.&lt;/p&gt;
&lt;h2&gt;Wie schreibt man in beiden Tools einen Test?&lt;/h2&gt;
&lt;p&gt;In k6 schreiben Sie ein JavaScript-Modul mit den Optionen oben und einer Default-Funktion, die jeder virtuelle Benutzer ausführt. In Artillery schreiben Sie meist eine YAML-Datei mit einem &lt;code&gt;config&lt;/code&gt;-Block für die Last und einem &lt;code&gt;scenarios&lt;/code&gt;-Block für das, was jeder virtuelle Benutzer tut.&lt;/p&gt;
&lt;p&gt;Ein k6-Test, der auf 20 virtuelle Benutzer hochfährt und fehlschlägt, wenn das 95. Perzentil der Antwortzeit über 500 ms steigt:&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;Dieselbe Idee im &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;YAML-Format von Artillery&lt;/a&gt;, mit zehn neuen virtuellen Benutzern pro Sekunde über eine 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;Die beiden Beispiele modellieren Last auf unterschiedliche Weise. Das k6-Skript legt eine Anzahl gleichzeitiger virtueller Benutzer fest, die Artillery-Datei legt fest, wie viele neue virtuelle Benutzer pro Sekunde ankommen. k6 kann Ankunftsraten auch über seine &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;Scenario-Executors&lt;/a&gt; steuern, und Artillery kann die Parallelität mit &lt;code&gt;maxVusers&lt;/code&gt; begrenzen. Wählen Sie also das Modell, das dazu passt, wie echter Traffic Ihr System erreicht, und nicht das, das ein Tool zuerst zeigt.&lt;/p&gt;
&lt;h2&gt;Wie entscheiden k6 und Artillery, ob ein Test bestanden ist?&lt;/h2&gt;
&lt;p&gt;Beide übersetzen ein Performance-Ziel in einen Exit-Code, und genau den braucht eine CI-Pipeline. Ein verfehltes Ziel beendet den Lauf in beiden Tools mit einem Exit-Code ungleich null.&lt;/p&gt;
&lt;p&gt;In k6 heißen die Ziele &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;Thresholds&lt;/a&gt; und stehen wie im Beispiel oben in den Optionen des Skripts. In Artillery stehen sie im &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;&lt;code&gt;ensure&lt;/code&gt;-Plugin&lt;/a&gt;, das einfache Schwellenwerte und Bedingungen über mehrere Metriken hinweg unterstützt.&lt;/p&gt;
&lt;p&gt;Der praktische Unterschied liegt darin, wo die Ziele stehen. k6-Thresholds liegen in derselben Datei wie die Testlogik. Die Prüfungen von Artillery liegen im &lt;code&gt;config&lt;/code&gt;-Block, wo sie auch jemand anpassen kann, der die Szenarien nie anfasst.&lt;/p&gt;
&lt;h2&gt;Wie fährt man einen Test, der größer ist, als ein Rechner erzeugen kann?&lt;/h2&gt;
&lt;p&gt;Beide Tools können einen Test auf viele Rechner verteilen, aber auf ganz unterschiedlichen Wegen. k6 setzt auf Kubernetes oder den gehosteten Dienst von Grafana, Artillery auf Ihr eigenes AWS- oder Azure-Konto.&lt;/p&gt;
&lt;p&gt;Für k6 verteilt der &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; einen Test auf Pods in einem Kubernetes-Cluster, und Grafana Cloud k6 führt dieselben Skripte als gehosteter Dienst aus. Für Artillery &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-lambda&quot;&gt;starten die Befehle &lt;code&gt;run-lambda&lt;/code&gt; und &lt;code&gt;run-fargate&lt;/code&gt; Worker in Ihrem AWS-Konto&lt;/a&gt;, nach einer einmaligen IAM-Einrichtung über einen CloudFormation-Stack. Auf Azure macht &lt;code&gt;run-aci&lt;/code&gt; dasselbe mit &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/azure-aci&quot;&gt;Azure Container Instances&lt;/a&gt;, braucht über eine Evaluierung hinaus aber ein kostenpflichtiges Artillery-Abo (geprüft am 9. Oktober 2026). Wenn Sie bereits Kubernetes betreiben, wirkt der Weg über den Operator vertraut. Wenn Sie lieber gar nichts betreiben möchten, hat der serverlose Weg von Artillery weniger bewegliche Teile, solange der Test in AWS oder Azure laufen darf.&lt;/p&gt;
&lt;p&gt;Für k6-Skripte gibt es einen dritten Weg. &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=k6-vs-artillery&quot;&gt;LoadFocus führt k6-Skripte&lt;/a&gt; auf seiner eigenen Cloud-Infrastruktur aus 25 Regionen aus, sodass aus dem Skript auf Ihrem Laptop ein verteilter Test wird, ganz ohne Cluster oder AWS-Konto. LoadFocus führt keine Artillery-Skripte aus, für Artillery bleiben also seine eigenen AWS- und Azure-Befehle der Weg zur Skalierung.&lt;/p&gt;
&lt;h2&gt;Wohin gehen die Ergebnisse?&lt;/h2&gt;
&lt;p&gt;Beide Tools geben am Ende eines Laufs eine Zusammenfassung aus und können Metriken für Dashboards und Alarme an andere Systeme senden.&lt;/p&gt;
&lt;p&gt;k6 bietet laut seinem &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;Repository&lt;/a&gt; Zusammenfassungen oder detaillierte Metriken, die an den Dienst Ihrer Wahl exportiert werden. Artillery nennt in seinem &lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;Repository&lt;/a&gt; mehr als 20 Integrationen für Monitoring, Observability und CI/CD. Beide Tools können also die Dashboards füttern, die Sie schon haben. Prüfen Sie vorher, ob genau die Ausgabe, die Sie brauchen, auf der Liste steht, denn beide Listen ändern sich von Version zu Version.&lt;/p&gt;
&lt;h2&gt;Welches Tool sollten Sie wählen?&lt;/h2&gt;
&lt;p&gt;Wählen Sie k6, wenn Sie ein einzelnes Binary in der CI, JavaScript-Testlogik mit echtem Kontrollfluss und Thresholds in derselben Datei wie den Test wollen. Es passt auch zu Teams, die bereits Grafana nutzen, weil das Open-Source-Tool und der gehostete Dienst dieselbe Skript-API teilen.&lt;/p&gt;
&lt;p&gt;Wählen Sie stattdessen Artillery, wenn Ihr Team täglich Node.js schreibt, wenn eine kurze YAML-Datei für den Rest des Teams leichter zu prüfen ist als ein Skript oder wenn Sie Playwright-Browsertests und Socket.IO im selben Tool brauchen. Seine serverlose Skalierung ist auch der kürzere Weg, wenn Ihre Infrastruktur ohnehin in AWS liegt und Kubernetes keine Rolle spielt.&lt;/p&gt;
&lt;p&gt;Wenn Sie noch unentschlossen sind, schreiben Sie denselben Smoke-Test in beiden Tools. Zwanzig Zeilen reichen, um zu sehen, welches Ihr Team im Code-Review leichter liest.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ist k6 kostenlos?&lt;/strong&gt;
Ja. k6 ist Open Source unter der Lizenz AGPL-3.0 und läuft kostenlos auf Ihren eigenen Rechnern. Grafana Cloud k6 ist ein separater gehosteter Dienst mit eigener Preisgestaltung.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ist Artillery kostenlos?&lt;/strong&gt;
Größtenteils. Der Großteil von Artillery steht unter der Lizenz MPL-2.0, einige Azure-spezifische Module nutzen jedoch eine Source-Available-Lizenz, die für den produktiven Einsatz auf Azure eine kommerzielle Lizenz verlangt, so das Repository des Projekts (geprüft am 8. Oktober 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kann LoadFocus Artillery-Tests ausführen?&lt;/strong&gt;
Nein. LoadFocus führt k6- und JMeter-Skripte aus. Um einen Artillery-Test über einen Rechner hinaus zu skalieren, nutzen Sie die Befehle von Artillery für AWS Lambda, Fargate oder Azure Container Instances in Ihrem eigenen Cloud-Konto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welches Tool braucht weniger Ressourcen auf dem Lastgenerator?&lt;/strong&gt;
Das haben wir nicht selbst gemessen, deshalb nennen wir keinen Sieger. Das k6-Projekt sagt, dass selbst schwächere Rechner viel Traffic simulieren können, und fair vergleichen lässt sich das nur, wenn Sie dasselbe Szenario mit beiden Tools auf Ihrer eigenen Hardware laufen lassen.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-vs-k6/&quot;&gt;Gatling vs k6: JVM-Simulationen oder ein Go-Binary?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Lasttest durchführen: eine Schritt-für-Schritt-Anleitung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/open-source-load-testing-tools/&quot;&gt;Open-Source-Lasttest-Tools: sechs Optionen im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/load-testing-in-github-actions/&quot;&gt;Lasttests in GitHub Actions: ein praktischer Leitfaden&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/k6-vs-locust/&quot;&gt;k6 vs Locust: JavaScript-Skripte oder Python-Nutzer?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/artillery-load-testing/&quot;&gt;Artillery-Lasttests: das Node.js-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Open-Source-Lasttest-Tools: sechs Optionen im Überblick</title><link>https://loadtest.app/de/open-source-load-testing-tools/</link><guid isPermaLink="true">https://loadtest.app/de/open-source-load-testing-tools/</guid><description>Sechs Open-Source-Lasttest-Tools im Überblick: JMeter, k6, Gatling, Locust, Artillery und Vegeta, mit ihren Stärken und wann ein anderes Tool besser passt.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Offenlegung: loadtest.app wird von LoadFocus herausgegeben, das einen in diesem Artikel behandelten Lasttest-Dienst verkauft.&lt;/p&gt;&lt;p&gt;Sechs verbreitete Open-Source-Lasttest-Tools sind derzeit Apache JMeter, k6, Gatling, Locust, Artillery und Vegeta. Wählen Sie nach der Sprache, in der Ihr Team Tests schreibt, und danach, wie Sie skalieren müssen: JMeter für die größte Protokollabdeckung, k6 oder Artillery für JavaScript, Gatling für die JVM, Locust für Python und Vegeta für schnelle HTTP-Prüfungen mit fester Rate.&lt;/p&gt;
&lt;p&gt;Für diesen Artikel haben wir die Tools nicht gegeneinander gebenchmarkt. Die Fakten stammen aus den Repositories und der Dokumentation der Projekte, geprüft am 8. Oktober 2026, und die Hinweise unter „Gut für“ sind unsere Einschätzung.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Lizenz&lt;/th&gt;
&lt;th&gt;Tests geschrieben in&lt;/th&gt;
&lt;th&gt;Läuft auf&lt;/th&gt;
&lt;th&gt;Last auf mehrere Rechner verteilen&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;In einer Desktop-GUI gebaute Testpläne&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Eingebauter Remote-Modus (Client-Server)&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;Ein Go-Binary&lt;/td&gt;
&lt;td&gt;k6-operator auf Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Apache 2.0 (einige Komponenten unter einer Enterprise-Lizenz)&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript, TypeScript&lt;/td&gt;
&lt;td&gt;JVM&lt;/td&gt;
&lt;td&gt;Kommerzielle Enterprise-Edition&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;Eingebaut&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;MPL-2.0 (einige Azure-Module unter 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 oder Azure ACI über die 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;Kommandozeile oder Go-Code&lt;/td&gt;
&lt;td&gt;Ein Go-Binary&lt;/td&gt;
&lt;td&gt;Mehrere Instanzen starten&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Lohnt sich Apache JMeter noch?&lt;/h2&gt;
&lt;p&gt;Ja, besonders wenn Sie Protokolle jenseits von HTTP brauchen. JMeter deckt von den sechs Tools das breiteste Spektrum ab und hat den größten Bestand an vorhandenen Testplänen und Wissen.&lt;/p&gt;
&lt;p&gt;JMeter ist eine Java-Anwendung unter der Lizenz Apache 2.0. Die &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;Protokollliste&lt;/a&gt; umfasst HTTP und HTTPS, SOAP- und REST-Webservices, FTP, Datenbanken über JDBC, LDAP, JMS-Messaging, E-Mail und rohes TCP. Testpläne bauen Sie in einer Desktop-GUI, für echte Tests führen Sie sie ohne GUI über die Kommandozeile aus, und der Client-Server-Remote-Modus verteilt einen Test auf mehrere Rechner.&lt;/p&gt;
&lt;p&gt;Gut für Systeme mit gemischten Protokollen, Teams mit vorhandenen JMeter-Plänen und Tester, die Tests lieber visuell aufbauen. Wählen Sie etwas anderes, wenn Ihr Team Tests als reinen Code will, der wie die Anwendung geprüft wird, denn in der GUI gebaute XML-Pläne sind in einem Pull Request schwer zu lesen.&lt;/p&gt;
&lt;h2&gt;Wann ist k6 die richtige Wahl?&lt;/h2&gt;
&lt;p&gt;Wenn Ihr Team JavaScript schreibt und Tests als Code mit eingebauten Pass/Fail-Schwellenwerten will. k6 kommt als einzelnes Go-Binary, was die Einrichtung in der CI einfach hält.&lt;/p&gt;
&lt;p&gt;k6 steht &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;unter der Lizenz AGPL-3.0&lt;/a&gt; und spricht HTTP, WebSockets und gRPC, dazu kommt ein Browser-Modul für Frontend-Prüfungen. Thresholds machen aus einem Ziel wie einer Grenze für das 95. Perzentil einen Exit-Code ungleich null für die CI. Zum Skalieren führt der &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; verteilte Tests auf Kubernetes aus, und Grafana verkauft einen gehosteten Dienst.&lt;/p&gt;
&lt;p&gt;Gut für Entwickler, die API-Tests neben ihrem Code pflegen, und für CI-Pipelines. Wählen Sie etwas anderes, wenn Ihr Team kein JavaScript will oder die AGPL-Lizenz nicht dazu passt, wie Sie das Tool einbetten oder ausliefern. Den direkten Vergleich finden Sie in &lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Für wen ist Gatling gedacht?&lt;/h2&gt;
&lt;p&gt;Für Teams auf der JVM, die Tests als Code und von Haus aus einen detaillierten HTML-Bericht wollen. Gatling bietet außerdem ein JavaScript- und TypeScript-SDK auf derselben Engine.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;Gatling&lt;/a&gt; lässt virtuelle Benutzer auf einer nicht blockierenden Engine auf Basis von Netty laufen, sodass ein einzelner Rechner viel Last erzeugen kann. Simulationen entstehen in Java, Kotlin, Scala, JavaScript oder TypeScript und laufen über Plugins für Maven, Gradle, sbt oder npm. Die Community-Edition steht unter Apache 2.0 und deckt HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events und JMS ab, während die Komponenten für gRPC, MQTT und GraphQL unter der Enterprise-Komponentenlizenz von Gatling stehen.&lt;/p&gt;
&lt;p&gt;Gut für Java- und Scala-Teams und für alle, die ausführliche Berichte ohne zusätzliche Werkzeuge wollen. Wählen Sie etwas anderes, wenn Sie Last allein mit der Open-Source-Edition auf mehrere Rechner verteilen müssen: Last aus verwalteter oder privater Infrastruktur zu erzeugen, ist die Aufgabe des kommerziellen Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Ist Locust eine gute Wahl für Python-Teams?&lt;/h2&gt;
&lt;p&gt;Ja. Locust-Tests sind reines Python, Schleifen, Bedingungen und jede Python-Bibliothek funktionieren also wie in normalem Code.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;Locust&lt;/a&gt; steht unter der MIT-Lizenz und arbeitet ereignisbasiert mit gevent, wodurch ein einzelner Prozess viele Benutzer bedienen kann. Tests laufen über die Kommandozeile oder eine Web-Oberfläche, die Durchsatz, Antwortzeiten und Fehler live zeigt, und Locust verteilt einen Test von sich aus auf mehrere Rechner. HTTP ist eingebaut, weitere Protokolle kommen durch eigenen Python-Code hinzu.&lt;/p&gt;
&lt;p&gt;Gut für Python-Teams, Szenarien mit komplexer Logik und alle, die einen Test gern im Browser verfolgen. Wählen Sie etwas anderes, wenn Sie deklarative Tests im Konfigurationsstil wollen oder ein fertiges Plugin für ein ungewöhnliches Protokoll wichtiger ist, als selbst eines zu schreiben.&lt;/p&gt;
&lt;h2&gt;Wann ist Artillery sinnvoll?&lt;/h2&gt;
&lt;p&gt;Wenn Ihr Team mit Node.js arbeitet, kurze YAML-Szenarien mag oder Playwright-Browsertests im selben Tool wie die API-Tests will.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;Artillery&lt;/a&gt; steht größtenteils unter MPL-2.0, einige Azure-Module unter einer Source-Available-Lizenz. Es bringt HTTP, WebSocket und Socket.IO mit, gRPC und Kinesis kommen über &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;Zusatz-Engines&lt;/a&gt; hinzu, und die Befehle &lt;code&gt;run-lambda&lt;/code&gt; und &lt;code&gt;run-fargate&lt;/code&gt; verteilen einen Test auf Worker in Ihrem eigenen AWS-Konto. Der Befehl &lt;code&gt;run-aci&lt;/code&gt; macht dasselbe auf Azure Container Instances, über eine Evaluierung hinaus mit einem kostenpflichtigen Artillery-Abo (geprüft am 9. Oktober 2026).&lt;/p&gt;
&lt;p&gt;Gut für Node.js-Teams, gemischte API- und Browsertests und Firmen, die bereits AWS nutzen. Wählen Sie etwas anderes, wenn Sie Node.js nicht auf Ihren Lastgeneratoren haben wollen oder große Tests außerhalb von AWS und Azure laufen müssen.&lt;/p&gt;
&lt;h2&gt;Wofür eignet sich Vegeta?&lt;/h2&gt;
&lt;p&gt;Für schnelle HTTP-Prüfungen mit konstanter Rate von der Kommandozeile. Es erledigt eine Aufgabe, Anfragen mit fester Rate zu senden, und hält diese Aufgabe einfach.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tsenart/vegeta&quot;&gt;Vegeta&lt;/a&gt; ist ein Go-Tool unter der MIT-Lizenz, das als Kommandozeilenprogramm oder als Go-Bibliothek funktioniert, mit einer CLI, die sich mit anderen Unix-Werkzeugen kombinieren lässt. Weil es die Anfragerate konstant hält, statt Benutzer zu modellieren, beantwortet es Fragen wie „Was passiert bei 500 Anfragen pro Sekunde?“ besser, als es Nutzerreisen abbildet.&lt;/p&gt;
&lt;p&gt;Gut für schnelle Prüfungen eines Endpunkts, Kapazitätstests mit fester Rate und Shell-Skripte. Wählen Sie etwas anderes, wenn Sie mehrstufige Nutzerreisen, Think Time oder ausführliche Berichte brauchen.&lt;/p&gt;
&lt;h2&gt;Wo passt ein gehosteter Runner wie LoadFocus hinein?&lt;/h2&gt;
&lt;p&gt;Keines dieser Tools braucht einen gehosteten Dienst, aber große oder geografisch verteilte Last von eigenen Rechnern zu erzeugen, macht Arbeit. Ein gehosteter Runner übernimmt die Lasterzeugung und lässt Ihre Skripte, wie sie sind.&lt;/p&gt;
&lt;p&gt;LoadFocus, der Herausgeber dieser Website, ist ein solcher Dienst. Er &lt;a href=&quot;https://loadfocus.com/de-de/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-source-load-testing-tools&quot;&gt;führt vorhandene JMeter-Testpläne&lt;/a&gt; und &lt;a href=&quot;https://loadfocus.com/de-de/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-source-load-testing-tools&quot;&gt;k6-Skripte&lt;/a&gt; aus 25 Cloud-Regionen aus. Tests für Gatling, Locust, Artillery oder Vegeta führt er nicht aus, für diese Tools gelten also die oben beschriebenen Wege zur Skalierung. Grafana Cloud k6 und Gatling Enterprise sind die gehosteten Wege der Hersteller für k6 und Gatling.&lt;/p&gt;
&lt;h2&gt;Wie wählt man zwischen ihnen?&lt;/h2&gt;
&lt;p&gt;Gehen Sie von der Sprache aus, die Ihr Team bereits schreibt, und von den Protokollen, die Sie testen müssen, und prüfen Sie dann, wie jedes Tool skaliert. Damit schrumpfen sechs Optionen meist auf eine oder zwei.&lt;/p&gt;
&lt;p&gt;Schreiben Sie dann denselben kurzen Test in Ihren zwei Favoriten. Beide nebeneinander zu lesen, entscheidet die meisten Diskussionen schneller als jede Funktionstabelle, und unsere Anleitung &lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Lasttest durchführen&lt;/a&gt; führt Schritt für Schritt durch diesen ersten Test.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Mit welchem Open-Source-Lasttest-Tool fängt man am leichtesten an?&lt;/strong&gt;
Für einen einzelnen HTTP-Endpunkt liefern Vegeta oder k6 innerhalb von Minuten ein Ergebnis, weil beide aus einem einzigen Binary bestehen. Für mehrstufige Nutzerreisen nehmen Sie das Tool, dessen Testsprache Ihr Team bereits schreibt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Können Open-Source-Lasttest-Tools verteilte Tests ausführen?&lt;/strong&gt;
Ja, auf unterschiedlichen Wegen: JMeter hat einen eingebauten Remote-Modus, Locust verteilt von sich aus auf mehrere Rechner, k6 nutzt den k6-operator auf Kubernetes und Artillery nutzt AWS Lambda, Fargate oder Azure Container Instances. Bei Gatling gehört die Lasterzeugung aus verwalteter oder privater Infrastruktur zur kommerziellen Enterprise-Edition.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ist JMeter besser als k6?&lt;/strong&gt;
Keines ist allgemein besser. JMeter deckt mehr Protokolle ab und passt zu GUI-basiertem Testdesign, k6 passt zu Entwicklern, die Tests als JavaScript-Code in der CI wollen.&lt;/p&gt;
&lt;h2&gt;Weiterlesen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/http-benchmarking-tools/&quot;&gt;HTTP-Benchmark-Tools: wrk, hey, oha, ab und weitere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/locust-load-testing/&quot;&gt;Locust-Lasttests: das Python-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/gatling-load-testing/&quot;&gt;Gatling-Lasttests: das JVM-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/websocket-load-testing-tools/&quot;&gt;WebSocket-Lasttest-Tools: sechs Optionen im Vergleich&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/k6-vs-artillery/&quot;&gt;k6 vs Artillery: welches Lasttest-Tool passt zu Ihrem Team?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/how-to-run-a-load-test/&quot;&gt;Lasttest durchführen: eine Schritt-für-Schritt-Anleitung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/azure-load-testing/&quot;&gt;Azure Load Testing: der Microsoft-Dienst im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/artillery-load-testing/&quot;&gt;Artillery-Lasttests: das Node.js-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/nbomber-load-testing/&quot;&gt;NBomber-Lasttests: das .NET-Framework im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/tsung-load-testing/&quot;&gt;Tsung-Lasttests: das Erlang-Tool im Überblick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/pgbench/&quot;&gt;pgbench: PostgreSQL benchmarken und unter Last testen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/de/sysbench/&quot;&gt;sysbench nutzen: CPU-, Festplatten- und MySQL-Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>