Wie man Benchmarks in CI mit Bencher verfolgt
Die meisten Benchmark-Ergebnisse sind vergänglich. Sie verschwinden, sobald Ihr Terminal das Scrollback-Limit erreicht. Einige Benchmark-Harnesses ermöglichen es Ihnen, Ergebnisse zu speichern, aber die meisten tun dies nur lokal. Bencher ermöglicht es Ihnen, Ihre Benchmarks sowohl von lokalen als auch von CI-Durchläufen zu verfolgen und die Ergebnisse zu vergleichen, während Sie weiterhin Ihren bevorzugten Benchmark-Harness verwenden.
Es gibt zwei beliebte Methoden, um Benchmark-Ergebnisse beim Continuous Benchmarking, d.h. Benchmarking in CI, zu vergleichen:
- Statistisches Continuous Benchmarking
- Verfolgen Sie Benchmark-Ergebnisse über die Zeit, um eine Basislinie zu erstellen.
- Verwenden Sie diese Basislinie zusammen mit Statistischen Schwellenwerten, um eine statistische Grenze zu erstellen.
- Vergleichen Sie die neuen Ergebnisse mit dieser statistischen Grenze, um Leistungsregressionen zu erkennen.
- Relatives Continuous Benchmarking
- Führen Sie die Benchmarks für den aktuellen Basiscode aus.
- Verwenden Sie Prozentuale Schwellenwerte, um eine Grenze für den Basiscode zu erstellen.
- Wechseln Sie zur neuen Version des Codes.
- Führen Sie die Benchmarks für die neue Version des Codes aus.
- Vergleichen Sie die Ergebnisse der neuen Version des Codes mit den Ergebnissen des Basiscode, um Leistungsregressionen zu erkennen.
Statistisches kontinuierliches Benchmarking
Anknüpfend an die
Schnellstart- und Docker Self-Hosted-Tutorials,
lassen Sie uns statistisches kontinuierliches Benchmarking zu unserem Save Walter White
-Projekt hinzufügen.
🐰 Stellen Sie sicher, dass Sie ein API-Token erstellt und als
BENCHER_API_TOKEN
-Umgebungsvariable gesetzt haben, bevor Sie fortfahren!
Zuerst müssen wir ein neues Testbed erstellen, um unsere CI-Runner zu repräsentieren, passenderweise ci-runner
genannt.
- Verwenden Sie das
bencher testbed create
CLI-Unterkommando. Siehe dietestbed create
-Dokumentation für weitere Details. (Bsp.:bencher testbed create
) - Setzen Sie die
--name
-Option auf den gewünschten Testbed-Namen. (Bsp.:--name ci-runner
) - Geben Sie das Projektargument als den
Save Walter White
Projekt-Slug an. (Bsp.:save-walter-white-1234abcd
)
Als Nächstes müssen wir einen neuen Schwellenwert für unser ci-runner
Testbed erstellen:
- Verwenden Sie das
bencher threshold create
CLI-Unterkommando. Siehe diethreshold create
-Dokumentation für weitere Details. (Bsp.:bencher threshold create
) - Setzen Sie die
--branch
-Option auf den Standardmain
Branch. (Bsp.:--branch main
) - Setzen Sie die
--branch
-Option auf das neueci-runner
Testbed. (Bsp.:--testbed ci-runner
) - Setzen Sie die
--measure
-Option auf das integrierteLatency
-Maß, das durchbencher mock
generiert wird. Siehe die Definition von Maß für Details. (Bsp.:--measure Latency
) - Setzen Sie die
--test
-Option auf einent-test
Schwellenwert. Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.:--test t-test
) - Setzen Sie die
--upper-boundary
-Option auf eine obere Grenze von0.95
. Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.:--upper-boundary 0.95
) - Geben Sie das Projektargument als den
Save Walter White
Projekt-Slug an. (Bsp.:save-walter-white-1234abcd
)
Nun sind wir bereit, unsere Benchmarks in CI auszuführen. Da jede CI-Umgebung ein wenig anders ist, ist das folgende Beispiel eher illustrativ als praktisch gemeint. Für spezifischere Beispiele siehe Kontinuierliches Benchmarking in GitHub Actions und Kontinuierliches Benchmarking in GitLab CI/CD.
Wir müssen eine historische Basislinie für unseren main
Branch erstellen, indem wir jede Änderung in CI benchmarken:
- Verwenden Sie das
bencher run
CLI-Unterkommando um Ihre Benchmarks desfeature-branch
Branches auszuführen. Siehe dasbencher run
CLI-Unterkommando für einen vollständigen Überblick. (Bsp.:bencher run
) - Setzen Sie die
--project
-Option auf den Projekt-Slug. Siehe die--project
-Dokumentation für weitere Details. (Bsp.:--project save-walter-white-1234abcd
) - Setzen Sie die
--branch
-Option auf den Standardbranch-Namen. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.:--branch main
) - Setzen Sie die
--testbed
-Option auf den Testbed-Namen. Siehe die--tested
-Dokumentation für weitere Details. (Bsp.:--testbed ci-runner
) - Setzen Sie die
--adapter
-Option auf den gewünschten Benchmark-Harness-Adapter. Siehe Benchmark-Harness-Adapter für einen vollständigen Überblick. (Bsp.:--adapter json
) - Setzen Sie das
--err
-Flag, um den Befehl fehlschlagen zu lassen, wenn ein Alarm ausgelöst wird. Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.:--err
) - Geben Sie die Benchmark-Kommandoargumente an.
Siehe Benchmark-Kommando für einen vollständigen Überblick.
(Bsp.:
bencher mock
)
Schließlich sind wir bereit, Leistungsregressionen in CI zu erkennen.
So würden wir die Leistung eines neuen Feature-Branches, benannt feature-branch
, in CI verfolgen:
- Verwenden Sie das
bencher run
CLI-Unterkommando um Ihre Benchmarks desfeature-branch
Branches auszuführen. Siehe dasbencher run
CLI-Unterkommando für einen vollständigen Überblick. (Bsp.:bencher run
) - Setzen Sie die
--project
-Option auf den Projekt-Slug. Siehe die--project
-Dokumentation für weitere Details. (Bsp.:--project save-walter-white-1234abcd
) - Setzen Sie die
--branch
-Option auf den Namen des Feature-Branches. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.:--branch feature-branch
) - Setzen Sie die
--branch-start-point
-Option auf den Startpunkt des Feature-Branches. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.:--branch-start-point main
) - Setzen Sie die
--branch-start-point-hash
-Option auf dengit
-Hash des Startpunkts des Feature-Branches. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.:--branch-start-point-hash 32ae...dd8b
) - Setzen Sie die
--testbed
-Option auf den Testbed-Namen. Siehe die--tested
-Dokumentation für weitere Details. (Bsp.:--testbed ci-runner
) - Setzen Sie die
--adapter
-Option auf den gewünschten Benchmark-Harness-Adapter. Siehe Benchmark-Harness-Adapter für einen vollständigen Überblick. (Bsp.:--adapter json
) - Setzen Sie das
--err
-Flag, um den Befehl fehlschlagen zu lassen, wenn ein Alarm ausgelöst wird. Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.:--err
) - Geben Sie die Benchmark-Kommandoargumente an.
Siehe Benchmark-Kommando für einen vollständigen Überblick.
(Bsp.:
bencher mock
)
Das erste Mal, wenn dieser Befehl in CI ausgeführt wird,
wird der feature-branch
Branch erstellt, da er noch nicht existiert.
Der neue feature-branch
wird den main
Branch
am Hash 32aea434d751648726097ed3ac760b57107edd8b
als seinen Ausgangspunkt verwenden.
Das bedeutet, dass feature-branch
eine Kopie aller Daten und Schwellenwerte
vom main
Branch haben wird, um die Ergebnisse von bencher mock
dagegen zu vergleichen,
für den ersten und alle nachfolgenden Läufe.
Relatives kontinuierliches Benchmarking
Anknüpfend an die Tutorials Schnellstart und Docker Self-Hosted fügen wir unserem Save Walter White
-Projekt relatives kontinuierliches Benchmarking hinzu.
🐰 Stellen Sie sicher, dass Sie einen API-Token erstellt haben und diesen als
BENCHER_API_TOKEN
Umgebungsvariable gesetzt haben, bevor Sie fortfahren!
Zuerst müssen wir eine neue Testumgebung erstellen, um unsere CI-Runner darzustellen, treffend benannt ci-runner
.
- Verwenden Sie das
bencher testbed create
CLI-Unterkommando. Siehe dietestbed create
Dokumentation für mehr Details. (Bsp.:bencher testbed create
) - Setzen Sie die
--name
Option auf den gewünschten Testumgebungs-Namen. (Bsp.:--name ci-runner
) - Geben Sie das Projektargument als
Save Walter White
-Projekt-Slug an. (Bsp.:save-walter-white-1234abcd
)
Relatives kontinuierliches Benchmarking führt einen Seite-an-Seite Vergleich zweier Versionen Ihres Codes durch.
Dies kann nützlich sein, wenn man es mit lauten CI/CD-Umgebungen zu tun hat,
wo die verfügbaren Ressourcen zwischen den Läufen stark variieren können.
In diesem Beispiel vergleichen wir die Ergebnisse vom Laufen auf dem main
-Branch
mit Ergebnissen vom Laufen auf einem Feature-Branch namens feature-branch
.
Da jede CI-Umgebung ein wenig anders ist,
ist das folgende Beispiel eher illustrativ als praktisch gedacht.
Für spezifischere Beispiele siehe Kontinuierliches Benchmarking in GitHub Actions
und Kontinuierliches Benchmarking in GitLab CI/CD.
Zuerst müssen wir den main
-Branch mit git
in CI auschecken:
Dann müssen wir unsere Benchmarks auf dem main
-Branch in CI ausführen:
- Verwenden Sie das
bencher run
CLI-Unterkommando um Ihre Benchmarks desmain
-Branches auszuführen. Siehe dasbencher run
CLI-Unterkommando für einen vollständigen Überblick. (Bsp.:bencher run
) - Setzen Sie die
--project
Option auf den Projekt-Slug. Siehe die--project
Dokumentation für mehr Details. (Bsp.:--project save-walter-white-1234abcd
) - Setzen Sie die
--branch
Option auf den Namen des Feature-Branches. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.:--branch feature-branch
) - Setzen Sie das
--branch-reset
Flag. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.:--branch-reset
) - Setzen Sie die
--testbed
Option auf den Namen der Testumgebung. Siehe die--tested
Dokumentation für mehr Details. (Bsp.:--testbed ci-runner
) - Setzen Sie die
--adapter
Option auf den gewünschten Benchmark-Harness-Adapter. Siehe Benchmark-Harness-Adapter für einen vollständigen Überblick. (Bsp.:--adapter json
) - Geben Sie die Benchmark-Befehlsargumente an.
Siehe Benchmark-Befehl für einen vollständigen Überblick.
(Bsp.:
bencher mock
)
Das erste Mal, wenn dieser Befehl in CI ausgeführt wird,
wird der feature-branch
Branch erstellt, da er noch nicht existiert.
Der neue feature-branch
wird keinen Startpunkt, vorhandene Daten oder Schwellenwerte haben.
Bei späteren Läufen wird die alte Version des feature-branch
umbenannt
und ein neuer feature-branch
wird erstellt ohne Startpunkt, vorhandene Daten oder Schwellenwerte.
Als Nächstes müssen wir einen neuen Schwellenwert in CI für unseren neuen feature-branch
Branch erstellen:
- Verwenden Sie das
bencher threshold create
CLI-Unterkommando. Siehe diethreshold create
Dokumentation für mehr Details. (Bsp.:bencher threshold create
) - Setzen Sie die
--branch
Option auf den neuenfeature-branch
Branch. (Bsp.:--branch feature-branch
) - Setzen Sie die
--branch
Option auf dieci-runner
Testumgebung. (Bsp.:--testbed ci-runner
) - Setzen Sie die
--measure
Option auf das integrierteLatency
Maß, das vonbencher mock
generiert wird. Siehe die Definition von Maß für Details. (Bsp.:--measure Latency
) - Setzen Sie die
--test
Option auf einenProzentsatz
-Schwellenwert. Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.:--test t-test
) - Setzen Sie die
--upper-boundary
Option auf eine obere Grenze von0.25
(d. h.25%
). Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.:--upper-boundary 0.25
) - Geben Sie das Projektargument als den
Save Walter White
-Projekt-Slug an. (Bsp.:save-walter-white-1234abcd
)
Dann müssen wir den feature-branch
Branch mit git
in CI auschecken:
Schließlich sind wir bereit, unsere Benchmarks des feature-branch
in CI auszuführen:
- Verwenden Sie das
bencher run
CLI-Unterkommando um Ihre Benchmarks desfeature-branch
auszuführen. Siehe dasbencher run
CLI-Unterkommando für einen vollständigen Überblick. (Bsp.:bencher run
) - Setzen Sie die
--project
Option auf den Projekt-Slug. Siehe die--project
Dokumentation für mehr Details. (Bsp.:--project save-walter-white-1234abcd
) - Setzen Sie die
--branch
Option auf den Namen des Feature-Branches. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.:--branch feature-branch
) - Setzen Sie die
--testbed
Option auf den Namen der Testumgebung. Siehe die--tested
Dokumentation für mehr Details. (Bsp.:--testbed ci-runner
) - Setzen Sie die
--adapter
Option auf den gewünschten Benchmark-Harness-Adapter. Siehe Benchmark-Harness-Adapter für einen vollständigen Überblick. (Bsp.:--adapter json
) - Setzen Sie das
--err
Flag, um den Befehl fehlschlagen zu lassen, wenn ein Alarm ausgelöst wird. Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.:--err
) - Geben Sie die Benchmark-Befehlsargumente an.
Siehe Benchmark-Befehl für einen vollständigen Überblick.
(Bsp.:
bencher mock
)
Jedes Mal, wenn dieser Befehl in CI ausgeführt wird,
wird das Ergebnis des feature-branch
nur mit den neuesten Ergebnissen des main
verglichen.
🐰 Glückwunsch! Sie haben gelernt, wie man Benchmarks in CI mit Bencher verfolgt! 🎉