Zaprezentowane wyniki testowania świeżych wydań baz danych Redis 8.0 i Valkey 8.1, w których ogłoszono istotne optymalizacje wydajności. We wszystkich przeprowadzonych testach fork rozwijany przez społeczność przewyższył oryginalny projekt, głównie dzięki wprowadzeniu w Valkey nowego mechanizmu do wielowątkowego zarządzania wejściem/wyjściem w trybie asynchronicznym, przekazanego projektowi przez firmę Amazon.
W testowym środowisku AWS Graviton4 c8g.2xlarge z 8 VCPU w Valkey 8.1.1 udało się osiągnąć wydajność 999.8 tysięcy zapytań SET na sekundę, podczas gdy w Redis 8.0 osiągnięto poziom 729.4 tysięcy zapytań na sekundę. W ogólnym rozrachunku przezroczystość Valkey okazała się wyższa od Redis o 37% dla operacji SET i o 16% dla GET. W porównaniu z Redis projekt Valkey wykazał również 30% spadek opóźnień w obsłudze zapytań dla operacji SET oraz 60% dla operacji GET.

Oddzielnie przeprowadzono analizę zmiany przepustowości i opóźnień w zależności od liczby równolegle wykonujących się przetworników w trybie przetwarzania wielowątkowego. Do 3 wątków Valkey i Redis pokazują mniej więcej równe rezultaty, ale potem na prowadzenie wychodzi Valkey. Przy 6 wątkach na systemie z 8 VCPU wydajność Valkey wynosiła 678 tysięcy zapytań SET na sekundę, a Redis — 563 tysiące zapytań na sekundę przy limicie 256 jednoczesnych połączeń. Przy zwiększeniu liczby połączeń do 400 wydajność Valkey wzrosła do 832 tysięcy zapytań SET na sekundę.

Po optymalizacji obsługi przerwań w systemie w celu zmniejszenia liczby przełączeń kontekstu w Valkey udało się zwiększyć wydajność do 999,8 tysiąca zapytań SET na sekundę. Esencja optymalizacji sprowadza się do przydzielenia 2 VCPU do obsługi przerwań i przypisania pozostałych 6 VCPU do wątków przetwarzania wejścia/wyjścia Valkey i Redis, aby wykluczyć migrację przetworników między CPU. sudo ethtool -L ens34 combined 2 # ograniczamy do 2 liczbę przetworników IRQ grep ens34 /proc/interrupts # sprawdzamy, które przetworniki są zaangażowane (99 i 100) echo 1 | sudo tee /proc/irq/99/smp_affinity # przypisujemy przetwornik 99 do rdzenia 1 echo 2 | sudo tee /proc/irq/100/smp_affinity # przypisujemy przetwornik 100 do rdzenia 2 # Uruchamiamy SGBD (dla Redis zmienić valkey/valkey:8.1.1 na redis:8.0) z przypisaniem kontenera do rdzeni CPU 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
Do testowania wydajności użyto polecenia: 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
Źródło: opennet.ru
