Resultaten av testning av de senaste versionerna av Redis 8.0 och Valkey 8.1 DBMS presenteras, där betydande prestandaoptimeringar har rapporterats. I alla utförda tester överträffade den fork som utvecklats av communityn det ursprungliga projektet, främst på grund av implementeringen i Valkey av en ny mekanism för flertrådad input/output-bearbetning i asynkront läge, överförd till projektet av Amazon.
I testmiljön AWS Graviton4 c8g.2xlarge med 8 VCPU:er uppnådde Valkey 8.1.1 en dataflödeshastighet på 999.8 tusen SET-förfrågningar per sekund, medan Redis 8.0 uppnådde en nivå på 729.4 tusen förfrågningar per sekund. Sammantaget var Valkeys dataflöde 37 % högre än Redis för SET-operationer och 16 % högre för GET. Samtidigt, jämfört med Redis, uppvisade Valkey en 30 % minskning av SET-latens och 60 % minskning av GET-latens.

En separat analys genomfördes av förändringen i dataflöde och fördröjningar beroende på antalet parallella processorer i flertrådigt I/O-behandlingsläge. Upp till 3 trådar visar Valkey och Redis ungefär lika resultat, men sedan tar Valkey ledningen. Med 6 trådar på ett system med 8 VCPU:er var Valkeys prestanda 678 tusen SET-förfrågningar per sekund, och Redis var 563 tusen förfrågningar per sekund med en gräns på 256 samtidiga anslutningar. När antalet anslutningar ökade till 400 ökade Valkeys prestanda till 832 tusen SET-förfrågningar per sekund.

Efter att ha optimerat avbrottshanteringen i systemet för att minska antalet kontextväxlar i Valkey, lyckades vi öka prestandan till 999.8 tusen SET-förfrågningar per sekund. Kärnan i optimeringen kom ner till att allokera 2 VCPU:er för avbrottshantering och binda de återstående 6 VCPU:erna till Valkey- och Redis I/O-behandlingstrådar för att eliminera migreringen av hanterare mellan processorer. sudo ethtool -L ens34 combined 2 # begränsa antalet IRQ-hanterare till 2 grep ens34 /proc/interrupts # se vilka hanterare som är involverade (99 och 100) echo 1 | sudo tee /proc/irq/99/smp_affinity # bind hanterare 99 till kärna 1 echo 2 | sudo tee /proc/irq/100/smp_affinity # bind handler 100 till kärna 2 # Starta DBMS (för Redis, ändra valkey/valkey:8.1.1 till redis:8.0) med containerbindning till CPU-kärnor 2-7 docker run —network=»host» —rm \ —cpuset-cpus=»2-7″ valkey/valkey:8.1.1 \ —save «» —appendonly nej —io-threads 6 \ —protected-mode nej —maxmemory 10gb
För prestandatestning användes följande kommando: 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
Källa: opennet.ru
