Насколько быстрым может быть единичный экземпляр Redis?

Ссылка на оригинал - https://docs.keydb.dev/blog/2019/06/17/blog-post/, автор публикации - docs.keydb.dev

Redis известна как одна из самых быстрых баз данных. Но что, если некоторые ограничения будут сняты, как быстро может стать отдельный экземпляр? Мы часто слышим, что Redis, вероятно, станет связанной с сетью или с памятью, прежде чем она будет связан с ограничением производительности CPU. В зависимости от вашей настройки, может быть два варианта.

В этой статье мы собираемся обсудить, как мы создали модуль, который практически удваивает производительность Redis!

Возвращаясь к вопросу о привязке к процессору или сети, по нашему опыту, возможны оба варианта. EQ Alpha выпустила KeyDB - многопоточный форк с открытым исходным кодом Redis, который доказывает, что многопоточность может значительно повысить производительность. Однако нас всегда беспокоила другая область, которая была главным узким местом. Производительность часто поддерживалась в спинлок и системных вызовах ядра. Благодаря большим разработкам сетевых адаптеров Linux становится узким местом при обработке пакетов данных. С копированием пакетов ядра, прерываниями и системными вызовами данные, обрабатываемые ядром, ограничиваются, это в «пространстве ядра». С другой стороны, мы запускаем наши приложения в так называемом «пользовательском пространстве». Таким образом, возникает вопрос, не существует ли способа обойти ядро? Да, есть. Корпорация Intel разработала свой Data Plane Development Kit (DPDK), который предоставляет драйверы и библиотеки для ускорения рабочих нагрузок при обработке пакетов. Идея обхода ядра позволяет обрабатывать потоки данных в пользовательском пространстве, в то время как Linux работает с потоком управления.

Эта идея была реализована на практике и протестирована с модулем, только что опубликованным EQ Alpha. Модуль позволяет Redis взаимодействовать в пользовательском пространстве с NIC, минуя ядро. Это позволило обычному автономному экземпляру Redis перейти от 164 000 операций в секунду до более 300 000 операций в секунду, что примерно в 1,8 раза сократило время ожидания в экземпляре Redis 5.0. На приведенной ниже диаграмме показано количество операций в секунду и размер данных. Тесты проводились с последней версией Redis (5.0) и с добавленным модулем Accelerator.

образ

образ

Эталонные тесты выполнялись с помощью мемиер-бенчмарка. Memtier работал на машине m5.4xlarge, а Redis работал на m5.2xlarge. Memtier работал с 12 потоками и 100 клиентами и тестировался, чтобы убедиться, что этот инструмент не является узким местом. Испытания проводились на одних и тех же машинах, причем в каждом сценарии проводились одинаковые испытания. Трубопровод не был использован для этих результатов. Если использовался конвейер, QPS превышает 2 миллиона без существенных различий между memtier_benchmark --clients=100 --threads=12 --requests=20000 -s <ipaddress> -a <password> --hide-histogram.

Наибольший выигрыш наблюдается на экземплярах одного компьютера (не работает кластер узлов на одном сервере - хотя некоторые выигрыши все еще можно увидеть здесь). Запуск мастера / реплики на том же сервере или в составе кластера компьютеров также имеет большие преимущества. Если сервер связан с процессором, усиление может быть не таким высоким. Рекомендуется машина с 4 или более ядрами

Это значительные выгоды от работы в пользовательском пространстве. Использование этого модуля позволяет использовать экземпляр Redis в этой среде без изменения базового кода. Redis будет работать через сокеты Unix, что приведет к более быстрому выполнению dpdk Используя уровень абстракции среды (EAL) вместе с другими компонентами стека, модуль может опрашивать и интерпретировать данные без дополнительных затрат на обработку прерываний. Он может работать в своей собственной среде и позволяет вам продолжать использовать вашу производственную версию Redis или любую другую версию Redis для этой заметки (включая нестабильные и новые выпуски).

Концепция интересна, и она пробуждает любопытство относительно того, что происходит внутри. Так как же выглядит запуск экземпляра Redis без этих ограничений? Ниже приведены два Flamegraphs,которые могут помочь обеспечить визуализацию профилированного программного обеспечения. Они были сгенерированы при запуске Redis с модулями и без:

Ниже приведен график флейма, сгенерированный при выполнении регулярного теста на немодифицированном Redis.

образ

Ниже приведен график, сгенерированный во время теста производительности, когда модуль Accelerator работает в фоновом режиме:

образ

Надеемся, что эта статья поможет раскрыть потенциал того, что ваши экземпляры могут разблокировать. Одна из целей EQ Alpha как с этим модулем, так и с проектом KeyDB состоит в том, чтобы помочь найти варианты, которые позволяют создавать более крупные и мощные экземпляры, которые могут минимизировать необходимость сегментирования и кластеризации за счет большей нагрузки. Этот модуль, будучи в форме отдельного модуля, является полезным, поскольку он, вероятно, обеспечит повышение производительности независимо от того, куда пойдет базовый код Redis и в будущих версиях.

Если вы хотите получить больше информации о модуле или KeyDB, пожалуйста, проверьте!

Не нашли ответ на свой вопрос? Возможно, вы найдете решение проблемы на нашем канале в Youtube! Здесь мы собрали небольшие, но эффективные инструкции. Смотрите и подписывайтесь на наш youtube-канал!

Смотреть на Youtube