Как справиться с повышением фрагментации памяти Redis?

У меня есть экземпляр 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, например, процесс «дефрагментации», который я мог бы запланировать в непиковое время?

6
задан 14 September 2016 в 17:04
2 ответа

Фрагментация памяти - нетривиальная проблема.

До версии 4 единственным способом решения этой проблемы был перезапуск процесса (возможно, после создания подчиненного устройства, продвижения его и перенаправления на него трафика) . Начиная с версии 4, существует экспериментальный механизм активной дефрагментации памяти, который можно включить с помощью простого CONFIG SET activedefrag yes .

8
ответ дан 3 December 2019 в 00:21

Активная дефрагментация (представленная в Redis 4) была улучшена в Redis 5. Цитата из объявления AWS о Redis 5:

Этот выпуск поставляется с тем, что можно назвать активной дефрагментацией 2: Это быстрее, умнее и с меньшей задержкой.Эта функция особенно полезна для рабочих нагрузок, где распределитель не может поддерживать достаточно низкую фрагментацию, поэтому стратегия заключается в сотрудничестве и Redis, и распределителя. Чтобы это работало, необходимо использовать распределитель Jemalloc. К счастью, в Linux это распределитель по умолчанию.

Еще одна цитата главного разработчика Redis :

Активная дефрагментация, версия 2. Дефрагментация памяти работающего сервера - черная магия, но Оран Агра улучшил его прошлые усилия, и теперь он работает лучше, чем раньше. Очень полезно для длительных рабочих нагрузок, которые склонны к фрагментации Jemalloc.

Если вы используете распределитель Jemalloc и боретесь с фрагментацией, я бы порекомендовал включить эту функцию:

CONFIG SET activedefrag yes

Если вы используете ElastiCache Redis от AWS , Jemalloc используется по умолчанию, поддерживается активная дефрагментация. Запущенный доктор памяти также рекомендует включить эту функцию, когда уровень фрагментации станет слишком высоким.

0
ответ дан 3 December 2019 в 00:21

Теги

Похожие вопросы