Сравнение производительности СУБД Valkey и Redis

Представлены результаты тестирования свежих выпусков СУБД 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.

CFD0C5CECEC5D4_1749014706.png

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

CFD0C5CECEC5D4_1749014968.png

После оптимизации обработки прерываний в системе для снижения числа переключения контекста в 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

Для тестирования производительности использовалась команда:

   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



Источник: http://www.opennet.ru/opennews/art.shtml? num=63335

Полный текст статьи читайте на OpenNet