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