Представени са резултатите от тестването на последните версии на СУБД 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) с привързване на контейнера към ядрата на 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
Източник: opennet.ru
