Zum Hauptinhalt springen

Das Resp.benchmark Tool

Das Garnet Projekt enthält ein Benchmark-Tool zum Ausführen von RESP-Benchmarks mit verschiedenen Clients, verschiedenen Workloads und verschiedenen Strategien zur Messung von Durchsatz, Leistung und Latenz.

Dieses Werkzeug befindet sich im Ordner

> Garnet\benchmark\Resp.benchmark

Verwendung

Die mit Resp.benchmark verfügbaren Optionen können durch Ausführen des Benchmark-Tools mit dem Befehlszeilenschalter --help angezeigt werden. Beispiel

> cd Garnet\benchmark\Resp.benchmark
> dotnet run -c Release -f net8.0 -- --help

Implementierungsdetails

Der Benchmark läuft in zwei Phasen.

  • Laden Sie Schlüssel in die Datenbank
  • Führen Sie einen Benchmark für einen einzelnen Befehl aus

In beiden Phasen wird ReqGen verwendet, um die Anfragen zum Laden von Daten oder zum Durchführen des Benchmarks zu generieren.

Es gibt mehrere Optionen zur Anforderungsgenerierung, wie im Konstruktor der ReqGen-Klasse angegeben.

        public ReqGen(
int Start,
int DbSize,
int NumOps,
int BatchSize,
OpType opType,
bool randomGen = true,
bool randomServe = true,
int keyLen = default,
int valueLen = default)
  • Start: Schlüssel-Offset.
  • DbSize: Anzahl der Schlüssel in der Datenbank
  • NumOps: Gesamtzahl der auszuführenden Operationen
  • BatchSize: Gesamtzahl der Operationen in einem Batch.
  • opType: Auszuführende Operation (z. B. GET, MSET, INCR)
  • randomGen: Ob Schlüssel sequenziell oder zufällig generiert werden sollen.
  • randomServe: Ob die Anfragen zufällig oder in der Reihenfolge bedient werden sollen, in der sie generiert wurden.
  • keyLen: Die geringste Anzahl von Bytes in einem Schlüssel. Schlüssel werden aus dem Bereich (Start, DbSize) zugewiesen und entsprechend aufgefüllt, um eine Menge von mindestens. Die Standardgröße entspricht der maximalen Anzahl von Ziffern von DbSize.
  • valueLen: Die Gesamtzahl von Bytes in einem Wert.

Die folgende Methode wird verwendet, um die Daten in die Datenbank zu laden

        public void LoadData(
int loadDbThreads = 8,
int BatchSize = 1 << 12,
int keyLen = default,
int valueLen = default)
  • loadDbThreads: Gesamtzahl der für das Laden verwendeten Threads
  • BatchSize: Gesamtzahl der Schlüssel-Wert-Paare in einem Batch
  • keyLen: Länge eines Schlüssels in Bytes.
  • valueLen: Länge eines Wertes in Bytes.

Die folgende Methode wird verwendet, um eine Iteration des Benchmarks für einen gegebenen Befehl mit den angegebenen Parametern auszuführen

        public void Run(
OpType opType,
int TotalOps,
int[] NumThreads,
int BatchSize = 1 << 12,
TimeSpan runTime = default,
bool randomGen = true,
bool randomServe = true,
int keyLen = default,
int valueLen = default)
  • opType: zu benchmarkender Befehl
  • totalops: insgesamt ausgeführte Operationen für den gegebenen Benchmark.
  • NumThreads: Gesamtzahl der Clients, die zur Ausführung des Benchmarks verwendet werden
  • BatchSize: Gesamtzahl der Operationen in einem einzelnen Batch.
  • runTime: Mindestdauer für die Ausführung des Benchmarks.
  • randomGen: Die Reihenfolge, in der Schlüssel in den Anfragen generiert werden.
  • randomServe: Die Reihenfolge, in der auf die Anforderungspuffer zugegriffen wird.
  • keyLen: geringste Anzahl von Bytes in einem einzelnen Schlüssel.
  • valueLen: Gesamtzahl von Bytes in einem Wert.

Benchmarking von Befehlen

Die zu benchmarkenden Befehle aus jeder Kategorie sind

Rohe Zeichenkettenbefehle

  • SET
  • GET
  • MGET
  • INCR
  • SETEX

Bitmap-Befehle

  • SETBIT
  • BITOP
  • GETBIT
  • BITCOUNT
  • BITPOS
  • BITOP_AND
  • BITOP_OR
  • BITOP_XOR
  • BITOP_NOT
  • BITFIELD_GET
  • BITFIELD_SET
  • BITFIELD_INCR

Hyperloglog-Befehle

  • PFADD
  • PFCOUNT
  • PFMERGE

Sortierte Mengen & Geo-Befehle

  • ZADD
  • GEOADD
  • ZREM
  • ZCARD

Serverbefehle

  • PING

Art der Benchmarks

Online-Benchmarks

Diese Optionen messen die Leistung des Servers im kontinuierlichen Online-Modus.

Aus dem Ordner

Garnet/benchmark/Resp.benchmark

Für einen Lauf mit 1 Clientsitzung

dotnet run -c Release -f net8.0 -- --online --op-workload GET,SET --op-percent 50,50 -b 1  -t 1

Für einen Lauf mit 16 Clientsitzungen

dotnet run -c Release -f net8.0 -- --online --op-workload GET,SET --op-percent 50,50 -b 1  -t 16

Für einen Lauf mit ZADD- und ZCARD-Befehlen

dotnet run -c Release -f net8.0 -- --online --op-workload ZADD,ZCARD --op-percent 50,50 -b 1  -t 1 --keylength --client SERedis

Wo

  • --op-workload: die verschiedenen zu sendenden Befehle.
  • --online: Die Art des durchzuführenden Benchmarks.
  • --op-percent: Das Gewicht der Last für jeden Befehl.
  • --t oder threads: Die Anzahl der Verbindungen, die das Tool zum Senden der Last erstellt.
  • --client: Der zu verwendende Client. GarnetClientSession ist eine gute Option, um das System maximal zu belasten. SERedis steht für die StackExchange.Redis-Bibliothek.
  • --keylength: Die Länge der Schlüsselgröße.

Offline-Benchmarks

Diese Benchmark-Kategorie verwendet unseren LightClient mit vordefinierten Batches, um zu messen, welchen Durchsatz der Server über einen bestimmten Zeitraum erzielen kann.

Einige Beispiele für die Ausführung von Offline-Benchmarks sind

dotnet run -c Release -f net8.0 -- --op GET -t 2,4,8,16 -b 512 --dbsize 10241024 --keylength 1024
dotnet run -c Release -f net8.0 -- --op ZADDCARD -t 64 --b 512 --dbsize 16777216 --keylength 512

Wo

  • --op: der zu sendende Befehl. ZADDCARD führt ZADD und ZCARD im selben Lauf aus.
  • --t oder threads: Die zu verwendende Anzahl von Threads.
  • --dbsize: Die Menge der im Speicher zu erstellenden Schlüssel

Vorsortierung von Daten für Benchmarks

Sie können den Speicher vor der Ausführung von GET-Benchmarks mit Schlüsseln vorab füllen, indem Sie die folgenden Schritte ausführen

  • Führen Sie MSET mit dem Resp Benchmark Tool aus
dotnet run -c Release -f net8.0 -- --op MSET --dbsize 16777216 --keylength 512

Führen Sie dann den GET-Befehl im Online-Modus aus

dotnet run -c Release -f net8.0 -- --op-workload GET --online -b 1 --op-percent 100 -t 64 --client GarnetClientSession --itp 1024 --runtime -1 --dbsize 16777216 --keylength 512

Wenn Sie wissen möchten, wie hoch die Trefferquote ist, können Sie dies von jedem Client-CLI-Tool aus abfragen

INFO stats

Betrachten Sie die Metrik garnet_hit_rate. Der Wert sollte idealerweise nahe 100 liegen.

Metriken müssen im Garnet-Server aktiviert sein, um Statistiken mit dem INFO-Befehl zu erhalten

 --latency-monitor --metrics-sampling-freq 5