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

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

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

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

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

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

Бенчмарки выполнялись с помощью memtier-benchmark. 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. Используя Environment Abstraction Layer (EAL) вместе с другими компонентами стека, модуль способен опрашивать и интерпретировать данные без накладных расходов на обработку прерываний. Он способен работать в своем собственном фреймворке и позволяет вам продолжать использовать вашу рабочую версию Redis или любую другую версию Redis (включая нестабильные и новые версии).

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

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

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

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

Хотите больше полезных советов? Смотрите и подписывайтесь на наш канал! Здесь я публикую лучшие советы для пользователей Андроид, Windows, iOS и Mac OS. Также вы можете задать мне любой вопрос, подписавшись на канал.

Наш канал в Telegram