Como lidar com Redis aumentando a fragmentação de memória?

5

Eu tenho uma instância do Redis 3.0.5 que tendem a mostrar um crescente mem_fragmentation_ratio ao longo do tempo.

O aplicativo que usa essa instância está constantemente criando e excluindo chaves.

Após um mês, acabo com um mem_fragmentation_ratio > 1,30. Isso afeta a pegada de memória do Redis nesse servidor:

~$ 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

Se eu reiniciar o serviço Redis e recarregar a partir do AOF, o mem_fragmentation_ratio voltará ao nível aceitável (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

A reciclagem do Redis está afetando nosso aplicativo (mesmo que façamos isso com um failover do Sentinel após uma reinicialização do escravo).

Existe outra maneira de reduzir o mem_fragmentation_ratio, como um processo de 'desfragmentação' que eu poderia agendar fora do horário de pico?

    
por Olivier Dauby 14.09.2016 / 16:04

1 resposta

5

A fragmentação de memória é um problema não trivial.

Antes da v4, a única maneira de resolvê-lo era reiniciar o processo (possivelmente depois de fazer um escravo, promovê-lo e redirecionar o tráfego para ele). A partir da v4, há um mecanismo experimental de desfragmentação de memória ativa que pode ser ativado com um simples CONFIG SET activedefrag yes .

    
por 15.12.2017 / 20:06