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
    1. Verfolgen Sie Benchmark-Ergebnisse über die Zeit, um eine Basislinie zu erstellen.
    2. Verwenden Sie diese Basislinie zusammen mit Statistischen Schwellenwerten, um eine statistische Grenze zu erstellen.
    3. Vergleichen Sie die neuen Ergebnisse mit dieser statistischen Grenze, um Leistungsregressionen zu erkennen.
  • Relatives Continuous Benchmarking
    1. Führen Sie die Benchmarks für den aktuellen Basiscode aus.
    2. Verwenden Sie Prozentuale Schwellenwerte, um eine Grenze für den Basiscode zu erstellen.
    3. Wechseln Sie zur neuen Version des Codes.
    4. Führen Sie die Benchmarks für die neue Version des Codes aus.
    5. 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.

bencher testbed create \
--name ci-runner \
save-walter-white-1234abcd
  1. Verwenden Sie das bencher testbed create CLI-Unterkommando. Siehe die testbed create-Dokumentation für weitere Details. (Bsp.: bencher testbed create)
  2. Setzen Sie die --name-Option auf den gewünschten Testbed-Namen. (Bsp.: --name ci-runner)
  3. 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:

bencher threshold create \
--branch main \
--testbed ci-runner \
--measure Latency \
--test t-test \
--upper-boundary 0.95 \
save-walter-white-1234abcd
  1. Verwenden Sie das bencher threshold create CLI-Unterkommando. Siehe die threshold create-Dokumentation für weitere Details. (Bsp.: bencher threshold create)
  2. Setzen Sie die --branch-Option auf den Standard main Branch. (Bsp.: --branch main)
  3. Setzen Sie die --branch-Option auf das neue ci-runner Testbed. (Bsp.: --testbed ci-runner)
  4. Setzen Sie die --measure-Option auf das integrierte Latency-Maß, das durch bencher mock generiert wird. Siehe die Definition von Maß für Details. (Bsp.: --measure Latency)
  5. Setzen Sie die --test-Option auf einen t-test Schwellenwert. Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.: --test t-test)
  6. Setzen Sie die --upper-boundary-Option auf eine obere Grenze von 0.95. Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.: --upper-boundary 0.95)
  7. 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:

bencher run \
--project save-walter-white-1234abcd \
--branch main \
--testbed ci-runner \
--adapter json \
--err \
bencher mock
  1. Verwenden Sie das bencher run CLI-Unterkommando um Ihre Benchmarks des feature-branch Branches auszuführen. Siehe das bencher run CLI-Unterkommando für einen vollständigen Überblick. (Bsp.: bencher run)
  2. Setzen Sie die --project-Option auf den Projekt-Slug. Siehe die --project-Dokumentation für weitere Details. (Bsp.: --project save-walter-white-1234abcd)
  3. Setzen Sie die --branch-Option auf den Standardbranch-Namen. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.: --branch main)
  4. Setzen Sie die --testbed-Option auf den Testbed-Namen. Siehe die --tested-Dokumentation für weitere Details. (Bsp.: --testbed ci-runner)
  5. 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)
  6. 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)
  7. 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:

bencher run \
--project save-walter-white-1234abcd \
--branch feature-branch \
--branch-start-point main \
--branch-start-point-hash 32aea434d751648726097ed3ac760b57107edd8b \
--testbed ci-runner \
--adapter json \
--err \
bencher mock
  1. Verwenden Sie das bencher run CLI-Unterkommando um Ihre Benchmarks des feature-branch Branches auszuführen. Siehe das bencher run CLI-Unterkommando für einen vollständigen Überblick. (Bsp.: bencher run)
  2. Setzen Sie die --project-Option auf den Projekt-Slug. Siehe die --project-Dokumentation für weitere Details. (Bsp.: --project save-walter-white-1234abcd)
  3. Setzen Sie die --branch-Option auf den Namen des Feature-Branches. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.: --branch feature-branch)
  4. 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)
  5. Setzen Sie die --branch-start-point-hash-Option auf den git-Hash des Startpunkts des Feature-Branches. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.: --branch-start-point-hash 32ae...dd8b)
  6. Setzen Sie die --testbed-Option auf den Testbed-Namen. Siehe die --tested-Dokumentation für weitere Details. (Bsp.: --testbed ci-runner)
  7. 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)
  8. 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)
  9. 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.

bencher testbed create \
--name ci-runner \
save-walter-white-1234abcd
  1. Verwenden Sie das bencher testbed create CLI-Unterkommando. Siehe die testbed create Dokumentation für mehr Details. (Bsp.: bencher testbed create)
  2. Setzen Sie die --name Option auf den gewünschten Testumgebungs-Namen. (Bsp.: --name ci-runner)
  3. 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:

git checkout main

Dann müssen wir unsere Benchmarks auf dem main-Branch in CI ausführen:

bencher run \
--project save-walter-white-1234abcd \
--branch feature-branch \
--branch-reset \
--testbed ci-runner \
--adapter json \
bencher mock
  1. Verwenden Sie das bencher run CLI-Unterkommando um Ihre Benchmarks des main-Branches auszuführen. Siehe das bencher run CLI-Unterkommando für einen vollständigen Überblick. (Bsp.: bencher run)
  2. Setzen Sie die --project Option auf den Projekt-Slug. Siehe die --project Dokumentation für mehr Details. (Bsp.: --project save-walter-white-1234abcd)
  3. Setzen Sie die --branch Option auf den Namen des Feature-Branches. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.: --branch feature-branch)
  4. Setzen Sie das --branch-reset Flag. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.: --branch-reset)
  5. Setzen Sie die --testbed Option auf den Namen der Testumgebung. Siehe die --tested Dokumentation für mehr Details. (Bsp.: --testbed ci-runner)
  6. 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)
  7. 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:

bencher threshold create \
--branch feature-branch \
--testbed ci-runner \
--measure Latency \
--test percentage \
--upper-boundary 0.25 \
save-walter-white-1234abcd
  1. Verwenden Sie das bencher threshold create CLI-Unterkommando. Siehe die threshold create Dokumentation für mehr Details. (Bsp.: bencher threshold create)
  2. Setzen Sie die --branch Option auf den neuen feature-branch Branch. (Bsp.: --branch feature-branch)
  3. Setzen Sie die --branch Option auf die ci-runner Testumgebung. (Bsp.: --testbed ci-runner)
  4. Setzen Sie die --measure Option auf das integrierte Latency Maß, das von bencher mock generiert wird. Siehe die Definition von Maß für Details. (Bsp.: --measure Latency)
  5. Setzen Sie die --test Option auf einen Prozentsatz-Schwellenwert. Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.: --test t-test)
  6. Setzen Sie die --upper-boundary Option auf eine obere Grenze von 0.25 (d. h. 25%). Siehe Schwellenwerte & Alarme für einen vollständigen Überblick. (Bsp.: --upper-boundary 0.25)
  7. 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:

git checkout feature-branch

Schließlich sind wir bereit, unsere Benchmarks des feature-branch in CI auszuführen:

bencher run \
--project save-walter-white-1234abcd \
--branch feature-branch \
--testbed ci-runner \
--adapter json \
--err \
bencher mock
  1. Verwenden Sie das bencher run CLI-Unterkommando um Ihre Benchmarks des feature-branch auszuführen. Siehe das bencher run CLI-Unterkommando für einen vollständigen Überblick. (Bsp.: bencher run)
  2. Setzen Sie die --project Option auf den Projekt-Slug. Siehe die --project Dokumentation für mehr Details. (Bsp.: --project save-walter-white-1234abcd)
  3. Setzen Sie die --branch Option auf den Namen des Feature-Branches. Siehe Branch-Auswahl für einen vollständigen Überblick. (Bsp.: --branch feature-branch)
  4. Setzen Sie die --testbed Option auf den Namen der Testumgebung. Siehe die --tested Dokumentation für mehr Details. (Bsp.: --testbed ci-runner)
  5. 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)
  6. 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)
  7. 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! 🎉


Bencher zu GitHub Actions hinzufügen ➡

Bencher zu GitLab CI/CD hinzufügen ➡

🤖 Dieses Dokument wurde automatisch von OpenAI GPT-4 generiert. Es ist möglicherweise nicht korrekt und kann Fehler enthalten. Wenn Sie Fehler finden, öffnen Sie bitte ein Problem auf GitHub.


Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Mon, April 1, 2024 at 7:00:00 AM UTC