Представлены результаты тестирования свежих выпусков СУБД 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 –network=”host” –rm –cpuset-cpus=”2-7″ valkey/valkey:8.1.1 –save “” –appendonly no –io-threads 6 –protected-mode no –maxmemory 10gb
Для тестирования производительности использовалась команда: