Представлені результати тестування нових випусків СУБД Redis 8.0 і Valkey 8.1, в яких були заявлені значні оптимізації продуктивності. У всіх проведених тестах форк, що розвивається співтовариством, обігнав оригінальний проект, в основному завдяки впровадженню в Valkey нового механізму для багатопотокової обробки вводу/виводу в асинхронному режимі, переданого проекту Amazon.
У тестовому оточенні AWS Graviton4 c8g.2xlarge з 8 VCPU в Valkey 8.1.1 вдалося досягти продуктивності в 999.8 тисяч SET-запитів на секунду, тоді як у Redis 8.0 було досягнуто рівня 729.4 тисяч запитів на секунду. У загальному вигляді пропускна спроможність Valkey виявився вищим за Redis на 37% для операцій SET і на 16% для GET. При цьому в порівнянні з Redis проект Valkey продемонстрував зниження затримок під час обробки запитів на 30% для операцій SET та на 60% для операцій GET.

Окремо проведено аналіз зміни пропускної спроможності та затримок залежно від кількості паралельно виконуваних обробників у режимі багатопотокової обробки вводу/виводу. До 3 потоків Valkey і Redis показують приблизно рівні результати, але потім виривається Valkey. При 6 потоках на системі з 8 VCPU продуктивність Valkey склала 678 тисяч SET-запитів в секунду, а Redis - 563 тисяч запитів в секунду при ліміті в 256 одночасних з'єднань. При збільшенні з'єднань до 400 продуктивність Valkey зросла до 832 тисяч SET-запитів на секунду.

Після оптимізації обробки переривань у системі зниження числа перемикання контексту в Valkey вдалося підняти продуктивність до 999.8 тисяч SET-запитів в секунду. Суть оптимізації звелася до виділення 2 VCPU для обробки переривань і прив'язки 6 VCPU, що залишилися, до потоків обробки вводу/виводу Valkey і Redis, щоб виключити міграцію обробників між CPU. sudo ethtool -L ens34 combined 2 # обмежуємо до 2 число обробників IRQ grep ens34 /proc/interrupts # дивимося які обробники задіяні (99 і 100) echo 1 | sudo tee /proc/irq/99/smp_affinity # прив'язуємо обробник 99 до ядра 1 echo 2 | sudo tee /proc/irq/100/smp_affinity # прив'язуємо обробник 100 до ядра 2 # Запускаємо СУБД (для Redis поміняти valkey/valkey:8.1.1 на redis:8.0) c прив'язкою контейнера до ядр CPU 2-7 docker run —net -cpuset-cpus="2-7" valkey/valkey:8.1.1 \ -save "" -appendonly no-io-threads 6 \ -protected-mode no
Для тестування продуктивності використовувалася команда: docker run -network="host" -rm -cpuset-cpus="2-7" \ valkey/valkey: 8.0.1 valkey-benchmark \-h 172.31.4.92 -p -threads 6379 -d 100000000
Джерело: opennet.ru
