Práticas recomendadas para o gerenciamento de memória

Uma instância do Memorystore para Redis, se não for gerenciada e configurada corretamente, poderá sofrer pressão de memória que pode afetar o desempenho do aplicativo. Nesta página, descrevemos as práticas recomendadas para gerenciar com eficiência o uso de memória da instância.

Neste tópico:

Conceitos de gerenciamento de memória

Nesta seção, apresentamos conceitos necessários para gerenciar o uso de memória da instância.

Capacidade da instância

  • A capacidade da instância é a quantidade de memória que você provisiona em gigabytes (GB) e o que é cobrado. Para mais detalhes sobre como selecionar a capacidade correta da instância, consulte Dimensionar a instância do Memorystore.

Configuração do Maxmemory

  • Maxmemory é uma configuração do Redis que permite definir o limite de memória em que a política de remoção entra em vigor. O Memorystore para Redis designa essa configuração como maxmemory-gb. Quando você cria uma instância, maxmemory-gb é definido como a capacidade da instância. Dependendo da métrica de proporção de uso de memória do sistema, talvez seja necessário diminuir o limite de maxmemory-gb para fornecer sobrecarga de memória para picos de carga de trabalho.

    Para mais detalhes, consulte Gerenciar a proporção de uso de memória do sistema.

    Para saber como ajustar o maxmemory-gb, consulte Como configurar instâncias do Redis.

Proporção de uso da memória do sistema

  • A métrica de proporção de uso de memória do sistema permite medir o uso de memória de uma instância em relação à memória do sistema. A memória do sistema é gerenciada automaticamente pelo Memorystore para lidar com picos de uso de memória causados por operações com uso intenso de memória e fragmentação de memória, que é comum no Redis de código aberto.

    Se a métrica de proporção de uso de memória do sistema exceder 80%, isso indicará que a instância está sob pressão de memória, portanto, siga as instruções em Gerenciar a proporção de uso de memória do sistema. Se você não fizer nada e o uso da memória continuar a crescer, haverá risco de falha em uma instância devido à memória insuficiente. A métrica de proporção de uso de memória do sistema pode exceder 80% devido à fragmentação da memória. Outra possibilidade é que, se a métrica atingir rapidamente 80% ou mais, isso indicará que talvez você tenha usado uma das operações com uso intenso de memória.

    A proporção de uso da memória do sistema é de 50% ou menos durante as atualizações de manutenção. Além disso, às vezes, a exporting (link em inglês) requer uma proporção de uso da memória do sistema de até 50%.

Memória usada

  • A métrica de memória usada mostra a quantidade de dados na instância do Memorystore. A memória usada de uma instância pode aumentar até o limite de configuração maxmemory-gb. Quando a memória usada excede o limite de maxmemory-gb, a política de remoção entra em vigor.

Política de remoção

  • A política de remoção da instância (também conhecida como política maxmemory) determina como o Redis remove chaves quando os dados da instância atingem o limite maxmemory-gb. O Redis remove chaves como parte do caso de uso de cache normal. A remoção de chaves ocorre em segundo plano, por isso, as chaves não são removidas imediatamente após o limite de maxmemory-gb ser atingido. Uma alta taxa de gravação pode ultrapassar a remoção de chave, resultando em uma condição de falta de memória.

    A política de remoção padrão de uma instância do Memorystore é volatile-lru. Se você estiver usando uma política de remoção volatile-*, verifique se está definindo TTLs nas chaves que precisam expirar. Caso contrário, o Redis não terá chaves para remover.

    Para ver uma lista de políticas de remoção, consulte Políticas de maxmemory.

    Para saber como alterar sua política de remoção, consulte Como configurar instâncias do Redis.

Fragmentação de memória

  • A fragmentação de memória pode fazer com que a instância do Memorystore fique sem memória mesmo quando a proporção de memória usada para maxmemory-gb estiver baixa. A fragmentação de memória acontece quando o sistema operacional aloca páginas de memória que o Redis não pode utilizar totalmente após operações repetidas de gravação e exclusão. O acúmulo dessas páginas pode causar falta de memória do sistema e, por fim, falha no servidor Redis. A configuração activedefrag do Redis pode ajudar a reduzir a fragmentação.

Desfragmentação ativa

  • As versões 4.0 e posteriores do Redis fornecem uma configuração activedefrag. Se possível, crie sua instância do Memorystore usando o Redis 4.0. O Memorystore define activedefrag como "não" por padrão. Definir activedefrag como "sim" vem com uma troca de CPU, mas pode ajudar a atenuar a fragmentação de memória, o que contribui para problemas de falta de memória.

    Se a métrica de proporção de uso de memória do sistema indica a fragmentação de memória, ative activedefrag. Caso contrário, activedefrag ainda será uma configuração opcional.

Operações com uso intenso de memória

As operações a seguir usam memória significativa, especialmente quando executadas em conjunto com uma alta taxa de gravação:

Operação de exportação

O recurso export do Memorystore usa a operação BGSAVE do Redis, que usa cópia durante a gravação. Dependendo do tamanho dos dados, do volume de gravação e das chaves tocadas, a memória necessária para uma exportação pode ser o dobro do espaço que seus dados ocupam. Portanto, para que as exportações sejam bem-sucedidas, talvez seja necessário reduzir o limite de maxmemory-gb para 50% da capacidade da instância durante as exportações.

Operações de escalonamento e upgrade de versão

O escalonamento ou o upgrade durante períodos de alta carga de gravação podem colocar pressão de memória na instância devido à sobrecarga de memória causada pela replicação. Além disso, uma alta carga de leitura pode aumentar o tamanho do buffer de saída do Redis, levando a um aumento na pressão da memória. Se uma operação de escalonamento ou upgrade falhar devido à pressão da memória, faça o seguinte:

  • Reduza o maxmemory-gb para 50% da capacidade da instância antes de uma operação de escalonamento/upgrade. Se possível, diminua também o maxmemory durante períodos de tráfego baixo da instância, porque isso reduz o impacto negativo ao diminuir o maxmemory na proporção de ocorrência em cache.
  • Escalonamento/upgrade durante períodos de pouca gravação.

Manutenção

A manutenção também adiciona pressão de memória à instância. Tome medidas para que a métrica de Proporção de uso da memória do sistema seja de 50% ou menos no momento da manutenção programada. Para isso, programe para um momento em que o tráfego da instância esteja baixo ou aumente temporariamente o tamanho dela durante a janela de manutenção para que a métrica de proporção de uso da memória do sistema seja de 50% ou menos.

Monitorar o uso de memória da instância

Monitore as métricas e defina os alertas descritos nesta seção. Essas métricas e alertas fornecem informações sobre o uso de memória da sua instância. Para saber como visualizar métricas e definir alertas, consulte Como monitorar instâncias do Redis.

Métrica Endereço da métrica completa
Maxmemory redis.googleapis.com/stats/memory/maxmemory
Uso de memória redis.googleapis.com/stats/memory/usage
Proporção de uso de memória redis.googleapis.com/stats/memory/usage_ratio
Duração de sobrecarga da memória do sistema redis.googleapis.com/stats/memory/system_memory_overload_duration
Proporção de uso da memória do sistema redis.googleapis.com/stats/memory/system_memory_usage_ratio
Proporção de ocorrência em cache redis.googleapis.com/stats/memory/cache_hit_ratio
Chaves a expirar redis.googleapis.com/keyspace/keys_with_expiration
Chaves expiradas redis.googleapis.com/stats/expired_keys
Chaves removidas redis.googleapis.com/stats/evicted_keys

Proporção de uso de memória

A métrica de proporção de uso de memória indica a proximidade do tamanho do conjunto de trabalho em relação ao limite de maxmemory-gb. A menos que a política de remoção esteja definida como sem remoção, os dados da instância que atingem maxmemory nem sempre indicam um problema. No entanto, a remoção de chaves é um processo em segundo plano que leva tempo. Se houver uma alta taxa de gravação, a memória poderá se esgotar antes que o Redis tenha tempo de remover as chaves para liberar espaço.

Proporção de uso da memória do sistema

A proporção de uso de memória do sistema é uma métrica essencial a ser monitorada. Para garantir que a instância tenha memória suficiente para aceitar sua carga de trabalho e outras operações com uso intensivo de memória, é importante sempre ter memória suficiente do sistema disponível.

Defina um alerta para notificá-lo se a métrica de proporção de uso de memória do sistema atingir 80%. Se atingir 80%, comece a monitorar a métrica de proporção de uso de memória do sistema mais de perto. Se a proporção de uso de memória do sistema continuar a crescer drasticamente, ative activedefrag, diminua maxmemory e avalie se escalonará a instância.

Quando a proporção de uso de memória do sistema atinge 100%, qualquer operação que aumente ainda mais a memória ocupada da instância é bloqueada e o Redis retorna o seguinte erro:

-OOM command not allowed under OOM prevention.

Consulte Gerenciar a proporção de uso de memória do sistema para mais detalhes.

Duração de sobrecarga da memória do sistema

Se o uso da memória for muito alto, o Memorystore bloqueará gravações na instância para manter sua integridade. A duração da sobrecarga de memória do sistema rastreia a duração de tempo em que a instância fica no estado de gravações bloqueadas.

Você precisa definir um alerta para essa métrica para saber quando suas gravações estão sendo bloqueadas para sua instância. Além disso, é possível recapitular essa métrica para solucionar o erro -OOM command not allowed under OOM prevention..

Proporção de ocorrência em cache

Monitore regularmente a proporção de ocorrência em cache para saber qual porcentagem de pesquisas de chaves é retornada com sucesso por chaves na instância do Redis. De modo geral, uma proporção de ocorrência em cache mais alta é melhor do que uma proporção de ocorrência em cache mais baixa. Anote a proporção de ocorrência em cache antes de fazer grandes alterações na configuração, como ajustar o limite de maxmemory-gb, alterar a política de remoção ou escalonar a instância. Em seguida, depois de modificar a instância, verifique a proporção de ocorrência em cache novamente para ver como a alteração afetou essa métrica.

Chaves a expirar e chaves expiradas

A métrica do Stackdriver chaves a expirar monitora o número de chaves definidas para expiração. Se não houver chaves a expirar, isso poderá indicar que você não está definindo TTLs nas chaves. Nesses casos, quando os dados da instância atingem o limite de maxmemory-gb, não há chaves a serem removidas. Isso pode resultar em uma condição de memória insuficiente se você estiver usando uma política de remoção volatile-*.

Outra métrica que pode ser monitorada são as chaves expiradas. Se a métrica mostrar muitas chaves expiradas, mas você ainda vir a pressão de memória na instância, diminua maxmemory-gb.

Como resolver uma condição de falta de memória

Veja a seguir algumas práticas recomendadas que devem ser seguidas se a instância estiver enfrentando pressão de memória ou erros de falta de memória.

  1. Se você estiver usando uma política de remoção volatile-*, verifique se está definindo TTLs nas chaves que precisam expirar. Consulte Política de remoção para mais detalhes.

  2. Para instâncias que executam o Redis 4.0 e superior:

    1. Ative activedefrag para a instância. Consulte Desfragmentação ativa para mais detalhes.
  3. Saiba como usar métricas para resolver problemas de falta de memória e acessar informações sobre o uso de memória da instância: Monitorar o uso de memória da instância, Gerencie a proporção de uso de memória do sistema.

  4. Saiba como ajustar maxmemory ao executar Operações com uso intenso de memória.

  5. Se a métrica de proporção de uso de memória do sistema exceder 80%, reduza o limite de maxmemory-gb da instância. Consulte Gerenciar a proporção de uso de memória do sistema para mais detalhes.

  6. Avalie se escalonará a capacidade da instância .

  7. Se você ainda encontrar condições de OOM, entre em contato com o suporte do Google Cloud Platform.

Dimensionar a instância do Memorystore corretamente

Nesta seção, fazemos três abordagens distintas que ajudam a dimensionar corretamente sua instância com base na carga de trabalho:

Determinar o tamanho inicial de uma instância do Memorystore

Primeiro, escolha se quer uma instância de nível Padrão ou Básico. Para saber mais sobre os níveis do Memorystore para Redis, consulte Recursos do nível do Redis. Depois de selecionar o nível certo para o aplicativo, siga estas etapas para determinar o tamanho da instância de que você precisa:

  1. Determine o tamanho dos dados.

    • Estime o número de chaves e o tamanho médio das chaves que o aplicativo gravará na instância do Redis. Multiplique esses valores para ter uma estimativa aproximada do tamanho da instância de que você precisa.
  2. Escolha uma política de remoção.

    • Se você usar a política maxmemory de noeviction, o tamanho da instância precisará ser grande o suficiente para manter o conjunto de trabalho e a carga de trabalho de pico. Se você ficar sem memória com essa política maxmemory, a instância poderá inserir uma condição de falta de memória.
    • Outras políticas de remoção não influenciam o tamanho da instância que você precisa provisionar.
  3. Provisione memória extra para instâncias de nível Padrão

    • Ao contrário das instâncias do nível Básico, as instâncias do nível Padrão reservam 10% da capacidade da instância como um buffer de replicação. Se você escolher uma instância de nível padrão, receba a estimativa de dados da etapa um e provisione 10% extra para o buffer de replicação.
  4. Estime sua taxa média e de pico de gravação

    • Se possível, estime a taxa de gravação e o tamanho das chaves que seu aplicativo usará. A taxa de gravação em comparação com a taxa de remoção de chaves determina a velocidade de crescimento da instância ao longo do tempo.
  5. Escalone verticalmente para atingir a proporção de ocorrência em cache pretendida

    • Monitore a proporção de ocorrência em cache e, se não estiver recebendo as ocorrências em cache bem-sucedidas pretendidas, isso significará que você precisa aumentar o tamanho da instância ou verificar se o aplicativo está gravando as chaves na instância do Memorystore que estão sendo solicitadas e não cumpridas.

Determinar se a instância está bloqueando gravações devido a uma condição de falta de memória

Se for exibido o erro a seguir:

-OOM command not allowed under OOM prevention.

Verifique se:

  1. A métrica de proporção de uso de memória do sistema excedeu 80% pouco antes de sua instância começar a ter problemas.
  2. A proporção de uso de memória do sistema aumentou muito rapidamente antes de ocorrerem problemas com a instância.
  3. A métrica de duração da sobrecarga de memória do sistema mostrou valores acima de zero durante o mesmo período em que houve gravações bloqueadas.

Em caso afirmativo, isso provavelmente indica que a instância está bloqueando gravações devido a uma condição de falta de memória.

Gerenciar a proporção de uso de memória do sistema

Defina um alerta para notificá-lo se a métrica de proporção de uso de memória do sistema exceder 80%. Se a proporção de uso de memória do sistema exceder 80%, será necessário tomar as medidas adequadas para que a instância não fique sem memória. Dependendo do volume de gravação e do padrão de acesso da chave, o uso da memória do sistema pode aumentar para 100% rapidamente. O Memorystore fornece as seguintes maneiras de gerenciar a proporção de uso de memória do sistema:

  • Ative activedefrag para instâncias que executam o Redis versão 4.0 e superior.
  • Reduzir o limite de maxmemory-gb da instância.
  • Escalonar verticalmente a instância.
  • Escolher a política de remoção apropriada.
  • Defina a TTL de chaves voláteis.
  • Excluir manualmente as chaves da instância.

Ativar activedefrag

Se a proporção de uso de memória do sistema exceder 80%, ative activedefrag (para instâncias que executam o Redis versão 4.0 e superior). A desfragmentação da memória pode levar horas. Se o tráfego de gravação for alto, a desfragmentação pode não ser suficiente para interromper a falta de memória na instância. Portanto, talvez seja necessário implementar as recomendações a seguir:

Diminuir o limite de maxmemory da instância

Se a proporção de uso de memória do sistema exceder 80%, diminua maxmemory-gb, mas primeiro veja como a proporção de uso de memória do sistema mudou ao longo do tempo para determinar qual novo limite de maxmemory-gb será definido.

Cenário 1: a proporção de uso de memória do sistema vem aumentando de maneira lenta e gradual. A fragmentação é um problema provável, e você precisa diminuir maxmemory-gb em pequenos incrementos até que a proporção de uso de memória do sistema fique estabilizada abaixo de 80%.

Cenário 2: a proporção de uso de memória do sistema aumentou rapidamente e você vê uma carga de gravação significativa na instância. Uma operação com uso intenso de memória provavelmente causou o pico. Nessa situação, diminua o limite de maxmemory-gb em incrementos maiores para garantir que a instância evite entrar em uma condição de memória insuficiente ou se recupere de uma condição de falta de memória. Observe que diminuir a maxmemory pode reduzir as proporção de ocorrência em cache das suas instâncias. Uma proporção de ocorrência em cache muito menor indica que você precisa escalonar verticalmente a instância para que o aplicativo possa se beneficiar com as vantagens de usar o Redis. Para saber como ajustar a configuração do maxmemory-gb, consulte Como configurar instâncias do Redis.

Escalonar verticalmente sua instância

Siga as instruções em Como escalonar instâncias do Redis para aumentar a capacidade da instância.

Exemplo de escalonamento do Maxmemory:

Se você tiver uma instância de 10 GB com maxmemory-gb definido como 8 GB, terá 8 GB para armazenar chaves e 2 GB de sobrecarga de memória. Se você escalonar a instância para 20 GB, o maxmemory-gb será escalonado para 16 GB. Portanto, sua instância agora tem 16 GB de memória para armazenar chaves e 4 GB de sobrecarga. Consulte Como escalonar instâncias do Redis para ver instruções sobre como aumentar ou diminuir o tamanho da instância.

Escolher a política de remoção apropriada

Se você estiver armazenando dados voláteis, escolha uma das políticas de remoção volatile-*. Se você estiver armazenando dados que não são voláteis, escolha uma das políticas allkeys-*.

Excluir chaves da instância manualmente

É possível melhorar as condições de falta de memória excluindo chaves da instância manualmente. Essa é uma solução temporária que ajuda a melhorar a integridade da instância.