Die Testergebnisse der neuesten Versionen von Redis 8.0 und Valkey 8.1 DBMS werden vorgestellt, in denen erhebliche Leistungsoptimierungen festgestellt wurden. In allen durchgeführten Tests übertraf der von der Community entwickelte Fork das ursprüngliche Projekt, hauptsächlich aufgrund der Implementierung eines neuen Mechanismus für die mehrfädige Ein-/Ausgabeverarbeitung im asynchronen Modus in Valkey, der von Amazon in das Projekt übertragen wurde.
In der AWS Graviton4 c8g.2xlarge-Testumgebung mit 8 VCPUs erreichte Valkey 8.1.1 einen Durchsatz von 999.8 Tausend SET-Anfragen pro Sekunde, während Redis 8.0 einen Durchsatz von 729.4 Tausend Anfragen pro Sekunde erreichte. Insgesamt war der Durchsatz von Valkey bei SET-Operationen 37 % und bei GET-Operationen 16 % höher als bei Redis. Gleichzeitig zeigte Valkey im Vergleich zu Redis eine Reduzierung der SET-Latenz um 30 % und der GET-Latenz um 60 %.

Eine separate Analyse wurde durchgeführt, um die Veränderung von Durchsatz und Verzögerungen in Abhängigkeit von der Anzahl paralleler Prozessoren im Multithread-E/A-Verarbeitungsmodus zu untersuchen. Bis zu drei Threads zeigen Valkey und Redis ungefähr gleiche Ergebnisse, doch dann übernimmt Valkey die Führung. Mit sechs Threads auf einem System mit acht VCPUs betrug die Leistung von Valkey 3 SET-Anfragen pro Sekunde und die von Redis 6 Anfragen pro Sekunde bei einem Limit von 8 gleichzeitigen Verbindungen. Bei einer Erhöhung der Verbindungsanzahl auf 678 stieg die Leistung von Valkey auf 563 SET-Anfragen pro Sekunde.

Nachdem wir die Interrupt-Verarbeitung im System optimiert hatten, um die Anzahl der Kontextwechsel in Valkey zu reduzieren, konnten wir die Leistung auf 999.8 SET-Anfragen pro Sekunde steigern. Der Kern der Optimierung bestand darin, 2 VCPUs für die Interrupt-Verarbeitung zuzuweisen und die verbleibenden 6 VCPUs an die E/A-Verarbeitungsthreads von Valkey und Redis zu binden, um die Migration von Handlern zwischen CPUs zu vermeiden. sudo ethtool -L ens34 combined 2 # Anzahl der IRQ-Handler auf 2 begrenzen grep ens34 /proc/interrupts # sehen, welche Handler beteiligt sind (99 und 100) echo 1 | sudo tee /proc/irq/99/smp_affinity # Handler 99 an Kern 1 binden echo 2 | sudo tee /proc/irq/100/smp_affinity # Handler 100 an Kern 2 binden # DBMS starten (für Redis, valkey/valkey:8.1.1 in redis:8.0 ändern) mit Containerbindung an CPU-Kerne 2-7 docker run —network=»host» —rm \ —cpuset-cpus=»2-7″ valkey/valkey:8.1.1 \ —save «» —appendonly no —io-threads 6 \ —protected-mode no —maxmemory 10gb
Für Leistungstests wurde der folgende Befehl verwendet: docker run —network=»host» —rm —cpuset-cpus=»2-7″ \ valkey/valkey:8.0.1 valkey-benchmark \ -h 172.31.4.92 -p 6379 -t SET,GET -n 100000000 -c 256 \ -r 3000000 —threads 6 -d 1024
Source: opennet.ru
