У меня есть экземпляр Redis 3.0.5, который со временем показывает рост mem_fragmentation_ratio.
Приложение, использующее этот экземпляр, постоянно создает и удаляет ключи.
Через месяц у меня mem_fragmentation_ratio> 1.30. Это влияет на объем памяти Redis на этом сервере:
~$ redis-cli info memory
# Memory
used_memory:7711297480
used_memory_human:7.18G
used_memory_rss:10695098368
used_memory_peak:11301744128
used_memory_peak_human:10.53G
used_memory_lua:95232
mem_fragmentation_ratio:1.39
mem_allocator:jemalloc-3.6.0
Если я перезапускаю службу Redis и перезагружаюсь из AOF, mem_fragmentation_ratio возвращается к приемлемому уровню (1.06):
~$ redis-cli info memory
# Memory
used_memory:7493466968
used_memory_human:6.98G
used_memory_rss:7924920320
used_memory_peak:8279112992
used_memory_peak_human:7.71G
used_memory_lua:91136
mem_fragmentation_ratio:1.06
mem_allocator:jemalloc-3.6.0
Повторное использование Redis влияет на наше приложение (даже если мы делаем это с переключением Sentinel после перезапуска ведомого устройства).
Есть ли другой способ уменьшить mem_fragmentation_ratio, например, процесс «дефрагментации», который я мог бы запланировать вне пиковой нагрузки?
Фрагментация памяти - нетривиальная проблема.
До версии 4 единственным способом решить эту проблему был перезапуск процесса (возможно, после создания ведомого устройства, его продвижения и перенаправления на него трафика). Начиная с версии 4, существует экспериментальный механизм активной дефрагментации памяти, который можно включить с помощью простого CONFIG SET activedefrag yes
.
Активная дефрагментация (представленная в Redis 4) была улучшена в Redis 5. Цитата из объявления AWS о Redis 5:
Этот выпуск поставляется с тем, что можно назвать активной дефрагментацией 2: он быстрее, умнее и имеет меньшую задержку. Эта функция особенно полезна для рабочих нагрузок, когда распределитель не может поддерживать достаточно низкую фрагментацию, поэтому стратегия заключается в сотрудничестве и Redis, и распределителя. Чтобы это работало, необходимо использовать распределитель Jemalloc. К счастью, в Linux это распределитель по умолчанию.
Еще одна цитата из Главный разработчик Redis:
Активная дефрагментация, версия 2. Дефрагментация памяти работающего сервера - это черная магия, но Оран Агра улучшил свои прошлые усилия, и теперь она работает лучше, чем раньше. Очень полезно для длительных рабочих нагрузок, которые склонны фрагментировать Jemalloc.
Если вы используете распределитель Jemalloc и боретесь с фрагментацией, я бы рекомендовал включить эту функцию:
CONFIG SET activedefrag yes
Если ты на ElastiCache Redis от AWS, Jemalloc используется по умолчанию, поддерживается активная дефрагментация. Бег memory doctor
также рекомендует включить эту функцию, когда уровень фрагментации станет слишком высоким.