У меня есть экземпляр Redis 3.0.5, который со временем показывает рост mem_fragmentation_ratio.
Приложение, использующее этот экземпляр, постоянно создает и удаляет ключи.
После одного месяц, я получаю mem_fragmentation_ratio> 1.30. 5, которые имеют тенденцию показывать рост mem_fragmentation_ratio со временем. Приложение, использующее этот экземпляр, постоянно создает и удаляет ключи. Через месяц я заканчиваю ...
У меня есть экземпляр Redis 3.0.5, который со временем показывает рост mem_fragmentation_ratio.
Приложение, использующее этот экземпляр, постоянно создает и удаляет ключи.
После одного месяц, я получаю mem_fragmentation_ratio> 1.30. 5, которые имеют тенденцию показывать рост mem_fragmentation_ratio со временем. Приложение, использующее этот экземпляр, постоянно создает и удаляет ключи. Через месяц я заканчиваю ...
У меня есть экземпляр 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 используется по умолчанию, поддерживается активная дефрагментация. Запущенный доктор памяти
также рекомендует включить эту функцию, когда уровень фрагментации станет слишком высоким.