Przedstawiono wyniki testów najnowszych wydań DBMS Redis 8.0 i Valkey 8.1, w których zadeklarowano znaczące optymalizacje wydajnościowe. We wszystkich przeprowadzonych testach fork opracowany przez społeczność przewyższył oryginalny projekt, głównie dzięki implementacji w Valkey nowego mechanizmu wielowątkowego przetwarzania wejścia/wyjścia w trybie asynchronicznym, przeniesionego do projektu przez Amazon.
W środowisku testowym AWS Graviton4 c8g.2xlarge z 8 VCPU, Valkey 8.1.1 osiągnął przepustowość 999.8 tys. żądań SET na sekundę, podczas gdy Redis 8.0 osiągnął poziom 729.4 tys. żądań na sekundę. Ogólnie rzecz biorąc, przepustowość Valkey była o 37% wyższa niż Redis dla operacji SET i o 16% wyższa dla GET. Jednocześnie, w porównaniu do Redis, Valkey wykazał 30% redukcję w SET i 60% redukcję w GET.

Przeprowadzono osobną analizę zmiany przepustowości i opóźnień w zależności od liczby procesorów równoległych w trybie przetwarzania wielowątkowego wejścia/wyjścia. Do 3 wątków Valkey i Redis wykazują mniej więcej równe wyniki, ale Valkey przejmuje prowadzenie. Przy 6 wątkach w systemie z 8 VCPU wydajność Valkey wynosiła 678 tysięcy żądań SET na sekundę, a Redis 563 tysiące żądań na sekundę z limitem 256 równoczesnych połączeń. Gdy liczba połączeń wzrosła do 400, wydajność Valkey wzrosła do 832 tysięcy żądań SET na sekundę.

Po zoptymalizowaniu obsługi przerwań w systemie w celu zmniejszenia liczby przełączeń kontekstu w Valkey, udało nam się zwiększyć wydajność do 999.8 tys. żądań SET na sekundę. Istota optymalizacji sprowadzała się do przydzielenia 2 VCPU do obsługi przerwań i powiązania pozostałych 6 VCPU z wątkami przetwarzania I/O Valkey i Redis, aby wyeliminować migrację obsługi przerwań między procesorami. sudo ethtool -L ens34 combined 2 # ogranicz liczbę obsługi przerwań IRQ do 2 grep ens34 /proc/interrupts # sprawdź, które obsługi są zaangażowane (99 i 100) echo 1 | sudo tee /proc/irq/99/smp_affinity # powiąż obsługę 99 z rdzeniem 1 echo 2 | sudo tee /proc/irq/100/smp_affinity # powiąż handler 100 z rdzeniem 2 # uruchom DBMS (w przypadku Redis zmień valkey/valkey:8.1.1 na redis:8.0) z powiązaniem kontenera z rdzeniami procesora 2-7 docker run —network=»host» —rm \ —cpuset-cpus=»2-7″ valkey/valkey:8.1.1 \ —save «» —appendonly nie —io-threads 6 \ —protected-mode nie —maxmemory 10gb
Do testów wydajnościowych użyto następującego 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
