Рубріки: HighloadТеория

Оптимизация настроек Redis

Игорь Грегорченко

Чтобы получить наилучшую производительность необходима тонкая настройка, которая уменьшит вероятность непредвиденных ошибок, ограничений и пиковых нагрузок. Это касается всех частей системы, железа и базы данных.

С чего начать

Любую оптимизацию необходимо начинать с профилирования и тестирования приложения под высокими нагрузками. Также не забывайте о серверной оптимизации, правильной настройке Nginx и дополнительной оптимизации Ubuntu-сервера. Такой подход сохранит нервы и упростит дальнейшую процедуру тюнинга.

Когда Redis настроена и готова к работе, рекомендуем проверить ее при помощи встроенного теста:

$ redis-benchmark -q -n 100000 -c 50 -P 12

# Вывод будет таким
PING_INLINE: 641025.62 requests per second                                                             
PING_BULK: 694444.50 requests per second                                                               
SET: 434782.59 requests per second                                                                     
GET: 520833.34 requests per second                                                                     
INCR: 456621.00 requests per second                                                                    
LPUSH: 462962.94 requests per second                                                                   
LPOP: 440528.62 requests per second                                                                    
SADD: 418410.06 requests per second                                                                    
SPOP: 549450.56 requests per second                                                                    
LPUSH (needed to benchmark LRANGE): 473933.66 requests per second                                      
LRANGE_100 (first 100 elements): 37397.16 requests per second                                          
LRANGE_300 (first 300 elements): 10351.97 requests per second                                          
LRANGE_500 (first 450 elements): 6939.14 requests per second                                           
LRANGE_600 (first 600 elements): 5518.76 requests per second                                           
MSET (10 keys): 88105.73 requests per second

# Выполнит 100 000 запросов от 50 клиентов по 12 команд одновременно

Бэкапы

В Redis реализовано два persistence-режима: RDB и AOF.

При включении RDB система создает компактные снэпшоты данных в заданные интервалы времени. Это хороший подход для восстановления информации в случае сбоя. Бэкапы пишутся в параллельном процессе при помощи команды fork(), который в случае большой БД затратен по ресурсам и времени. Кроме этого, в случае неожиданного выключения сервера, все данные, которые не были записаны или находились в процессе создания резервной копии, будут утеряны.

AOF представляет собой лог операций, которые выполняют клиенты. Метод расшифровывается как Append Only File, то есть все новые данные добавляются к уже имеющимся данным, причем, каждую секунду по умолчания. Так что в случае сбоя потери будут минимальны. Но подход немного медленнее RDB, лог-файл существенно больше, производительность зависит от параметров fsync.

Для настройки Redis нужно отредактировать файл конфигурации /etc/redis/redis.conf:

# Параметры по умолчанию
save 900 1
save 300 10
save 60 10000

dir /var/redis/ # Директория хранения
dbfilename dump.rdb # Имя файла 
rdbcompression yes # Включение сжатия

# По умолчанию включен режим RDB

Хотите максимальной производительности — отключите persistence полностью. Или же настройте частоту создания снэпшотов. По умолчанию установлены параметры:

  • Создать копию, если было хотя бы одно изменение в течение 15 минут (900 секунд);
  • Создать копию, если в течение 5 минут (300 секунд) было хотя бы 10 изменений;
  • Создать копию, если за минуту было 10 000 изменений.

Еще один вариант — используйте репликацию.

Дополнительные параметры

Чтобы избежать узких мест, рекомендуем увеличить количество соединений, которые слушает сокет:
tcp-backlog 65536
# Значение по умолчанию — 511

Также стоит обратить внимание на разрешенное количество клиентов:

maxclients 10000
# Если слишком низкое, то появится ошибка ‘max number of clients reached’

Redis работает с ОЗУ, используя весь максимум доступной памяти. Так что есть смысл ограничить разрешенный объем, чтобы другие процессы сервера также могли выполняться:

maxmemory 1572864000
# Указание в байтах

Поиск проблем при помощи INFO

Просмотр статистики работы Redis поможет найти ошибки и проблемные места. К примеру, можно оценить скорость кэширования:

$ redis-cli INFO stats |grep keyspace
keyspace_hits:1920
keyspace_misses:930

# Система явно не успевает

Таким способом отслеживайте лимит доступной памяти maxmemory через eviction ключей:

$ redis-cli INFO stats |grep evicted_keys
evicted_keys:11582

# Система упирается в доступный объем памяти

Также стоит подобрать наилучшую политику отклонения ключей (eviction policy):

maxmemory-policy allkeys-lru
# Указывать в файле конфигурации Redis

Доступно 6 параметров:

  • noeviction — возвращает ошибку;
  • allkeys-lru — отклоняет ключи, убирая наименее используемые ключи (least recently used (LRU);
  • volatile-lru — отклоняет ключи, удаляя наименее используемые, если установлен срок истечения;
  • allkeys-random — отклоняет ключи в случайном порядке;
  • volatile-random — отклоняет ключи в случайном порядке, если установлен срок истечения;
  • volatile-ttl — в первую очередь отклоняет ключи c наименьшим сроком истечения.

Самое главное

Для создания отказоустойчивой системы используйте репликацию. Отключение снэпшотов принесет заметный прирост производительности. Также стоит подобрать наилучшую eviction policy для вашего приложения.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

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

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023