Práticas recomendadas de gestão de memória

Se não for gerida e configurada corretamente, uma instância do Memorystore for Redis pode sofrer pressão de memória, o que pode afetar o desempenho da aplicação. Esta página descreve as práticas recomendadas que pode usar para gerir de forma eficiente a utilização de memória da sua instância.

Neste tópico:

Conceitos de gestão de memória

Esta secção apresenta conceitos que tem de compreender para gerir a utilização de memória da sua instância.

Capacidade da instância

  • A capacidade da instância é a quantidade de memória que aprovisiona em gigabytes (GB) e o que lhe é cobrado. Para mais detalhes sobre a seleção da capacidade da instância certa, consulte o artigo Ajuste o tamanho da sua instância do Memorystore.

Configuração maxmemory

  • Maxmemory é uma configuração do Redis que lhe permite definir o limite de memória em que a sua política de remoção entra em vigor. O Memorystore for Redis designa esta configuração como maxmemory-gb. Quando cria uma instância, maxmemory-gb é definido como a capacidade da instância. Consoante a métrica da taxa de utilização da memória do sistema, pode ter de diminuir o limite de maxmemory-gb para fornecer sobrecarga de memória para picos de carga de trabalho.

    Para mais detalhes, consulte o artigo Faça a gestão da taxa de utilização da memória do sistema.

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

Rácio de utilização da memória do sistema

  • A métrica Rácio de utilização da memória do sistema permite-lhe medir a utilização de memória de uma instância relativamente à memória do sistema. A memória do sistema é gerida automaticamente pelo Memorystore para processar picos de utilização de memória causados por operações com utilização intensiva de memória e fragmentação de memória, o que é comum no Redis de código aberto.

    Se a métrica de rácio de utilização da memória do sistema exceder 80%, isto indica que a instância está sob pressão de memória e deve seguir as instruções em Gerir o rácio de utilização da memória do sistema. Se não tomar medidas e a utilização de memória continuar a aumentar, corre o risco de uma falha de instância devido a memória insuficiente. A métrica da taxa de utilização da memória do sistema pode exceder 80% devido à fragmentação da memória. Em alternativa, se a métrica aumentar rapidamente para 80% ou mais, pode ter usado uma das operações com utilização intensiva de memória.

    Deve ter uma taxa de utilização da memória do sistema de 50% ou menos durante as atualizações de manutenção. Além disso, por vezes, a exportação requer uma taxa de utilização da memória do sistema de 50% ou menos.

Memória usada

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

Política de despejo

  • A política de remoção da sua instância (também conhecida como política maxmemory) determina como o Redis remove chaves quando os dados da instância atingem o limite de maxmemory-gb. O Redis remove chaves como parte do exemplo de utilização normal da cache. A remoção de chaves ocorre como um processo em segundo plano. Por isso, as chaves não são removidas imediatamente após atingir o limite de maxmemory-gb. Uma taxa de gravação elevada pode exceder a remoção de chaves, o que resulta numa condição de falta de memória.

    A política de remoção predefinida de uma instância do Memorystore é volatile-lru. Se estiver a usar uma volatile-* política de remoção, certifique-se de que está a definir TTLs em chaves que quer que expirem. Caso contrário, o Redis não tem chaves para remover.

    Para ver uma lista de políticas de despejo, consulte Políticas de maxmemory.

    Para saber como alterar a política de remoção, consulte o artigo Configurar instâncias do Redis.

Fragmentação da memória

  • A fragmentação da memória pode fazer com que a sua instância do Memorystore fique sem memória, mesmo quando a proporção de memória usada para maxmemory-gb é baixa. A fragmentação da memória ocorre quando o sistema operativo atribui páginas de memória que o Redis não consegue utilizar totalmente após operações repetidas de escrita e eliminação. A acumulação destas páginas pode fazer com que o sistema fique sem memória e, eventualmente, provocar uma falha no servidor Redis. A configuração do activedefrag Redis pode ajudar a reduzir a fragmentação.

Desfragmentação ativa

  • As versões 4.0 e superiores do Redis oferecem uma configuração activedefrag. Se possível, deve criar a instância do Memorystore com o Redis 4.0. O Memorystore define activedefrag como "não" por predefinição. Definir activedefrag como "sim" tem um custo de CPU, mas pode ajudar a mitigar a fragmentação da memória, o que contribui para problemas de falta de memória.

    Se a métrica da taxa de utilização da memória do sistema indicar fragmentação da memória, deve ativar a opção activedefrag. Caso contrário, activedefrag continua a ser uma definição opcional.

Operações com utilização intensiva de memória

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

Operação de exportação

A funcionalidade de exportação do Memorystore usa a operação BGSAVE do Redis, que usa a cópia na gravação. Consoante o tamanho dos dados, o volume de gravação e as chaves acedidas, a memória necessária para uma exportação pode ser o dobro do espaço ocupado pelos seus dados. Por conseguinte, para que as exportações sejam bem-sucedidas, pode ter de reduzir o limite de maxmemory-gb para 50% da capacidade da instância durante as exportações.

Operações de dimensionamento e atualização de versão

Dimensionar ou atualizar durante períodos de carga de escrita elevada pode exercer pressão sobre a memória da sua instância devido à sobrecarga de memória causada pela replicação. Além disso, uma carga de leitura elevada pode aumentar o tamanho do buffer de saída do Redis, o que leva a uma maior pressão sobre a memória. Se uma operação de dimensionamento ou atualização falhar devido à pressão da memória, deve:

  • Reduza o maxmemory-gb para 50% da capacidade da instância antes de uma operação de dimensionamento/atualização. Se possível, também deve diminuir o maxmemory durante os períodos de tráfego de instâncias baixo, porque isso reduz o impacto negativo que a diminuição do maxmemory tem na sua taxa de acertos da cache.
  • Escale/atualize durante períodos de poucas gravações.

Manutenção

A manutenção também adiciona pressão de memória à sua instância. Deve tomar medidas para que a métrica Rácio de utilização da memória do sistema seja de 50% ou inferior no momento da manutenção agendada. Pode agendar a manutenção para uma altura em que o tráfego de instâncias seja baixo ou aumentar temporariamente o tamanho da instância durante o período de manutenção para que a métrica Rácio de utilização da memória do sistema seja de 50% ou inferior.

Monitorize a utilização de memória da sua instância

Monitorize as métricas e defina os alertas descritos nesta secção. Estas métricas e alertas dão-lhe informações sobre a utilização de memória da sua instância. Para saber como ver métricas e definir alertas, consulte o artigo Monitorizar instâncias do Redis.

Métrica Endereço métrico completo
Maxmemory redis.googleapis.com/stats/memory/maxmemory
Utilização de memória redis.googleapis.com/stats/memory/usage
Rácio de utilização da memória redis.googleapis.com/stats/memory/usage_ratio
Duração da sobrecarga da memória do sistema redis.googleapis.com/stats/memory/system_memory_overload_duration
Rácio de utilização da memória do sistema redis.googleapis.com/stats/memory/system_memory_usage_ratio
Relação de resultados da cache redis.googleapis.com/stats/memory/cache_hit_ratio
Chaves com prazo de validade redis.googleapis.com/keyspace/keys_with_expiration
Chaves expiradas redis.googleapis.com/stats/expired_keys
Chaves removidas redis.googleapis.com/stats/evicted_keys

Rácio de utilização de memória

A métrica Rácio de utilização de memória indica o quão perto o tamanho do conjunto de trabalho está de atingir o limite de maxmemory-gb. A menos que a política de remoção esteja definida como no-eviction, os dados da instância que atingem o maxmemory nem sempre indicam um problema. No entanto, a remoção de chaves é um processo em segundo plano que demora algum tempo. Se tiver uma taxa de gravação elevada, pode ficar sem memória antes de o Redis ter tempo para remover chaves para libertar espaço.

Rácio de utilização da memória do sistema

A taxa de utilização da memória do sistema é uma métrica essencial para monitorizar. Para garantir que a instância tem memória suficiente para suportar a sua carga de trabalho e outras operações com utilização intensiva de memória, é importante ter sempre memória do sistema suficiente disponível.

Defina um alerta para receber uma notificação se a métrica da taxa de utilização da memória do sistema atingir 80%. Se atingir 80%, deve começar a monitorizar mais atentamente a métrica da taxa de utilização da memória do sistema. Se a taxa de utilização da memória do sistema continuar a aumentar drasticamente, deve ativar o activedefrag, diminuir o maxmemory e ponderar dimensionar a sua instância.

Quando a taxa de utilização da memória do sistema atinge 100%, qualquer operação que aumente ainda mais a pegada de memória da sua instância é bloqueada e o Redis devolve o seguinte erro:

-OOM command not allowed under OOM prevention.

Consulte o artigo Faça a gestão da taxa de utilização da memória do sistema para ver mais detalhes.

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

Se a utilização de memória for demasiado elevada, o Memorystore bloqueia as escritas na instância para a manter em bom estado. A duração da sobrecarga da memória do sistema monitoriza durante quanto tempo a sua instância está no estado de escritas bloqueadas.

Deve definir um alerta para esta métrica para saber quando as suas gravações estão a ser bloqueadas para a sua instância. Além disso, pode consultar esta métrica para resolver problemas relacionados com a receção do erro -OOM command not allowed under OOM prevention..

Relação de resultados da cache

Deve monitorizar regularmente a taxa de acertos da cache para saber qual a percentagem de pesquisas de chaves que são devolvidas com êxito pelas chaves na sua instância do Redis. Em geral, uma taxa de acertos na cache mais elevada é melhor do que uma taxa de acertos na cache mais baixa. Deve tomar nota da taxa de acertos da cache antes de fazer alterações de configuração significativas, como ajustar o limite de maxmemory-gb, alterar a política de remoção ou dimensionar a instância. Em seguida, depois de modificar a instância, verifique novamente a taxa de acertos na cache para ver como a alteração afetou esta métrica.

Chaves com data de validade e chaves expiradas

A métrica do Stackdriver expirable keys monitoriza o número de chaves que estão definidas para expirar. Se não existirem chaves com prazo de validade, pode ser um indicador de que não está a definir TTLs nas chaves. Nestes casos, quando os dados da instância atingem o limite de maxmemory-gb, não existem chaves para remover, o que pode resultar numa condição de falta de memória se estiver a usar uma política de remoção de volatile-*.

Outra métrica que pode monitorizar são as chaves expiradas. Se a métrica mostrar muitas chaves expiradas, mas continuar a ver pressão de memória na sua instância, deve diminuir maxmemory-gb.

Resolver uma condição de falta de memória

Seguem-se algumas práticas recomendadas que deve seguir se a sua instância estiver a sofrer pressão de memória ou a ter erros de falta de memória.

  1. Se estiver a usar uma volatile-*política de remoção, certifique-se de que está a definir TTLs nas chaves que quer que expirem. Consulte a Política de Despejo para ver mais detalhes.

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

    1. Ative o activedefrag para a sua instância. Consulte o artigo Desfragmentação ativa para ver mais detalhes.
  3. Saiba como usar métricas para resolver problemas de condições de falta de memória e obter informações sobre a utilização de memória da sua instância: monitorize a utilização de memória da sua instância, faça a gestão da taxa de utilização da memória do sistema.

  4. Saiba como ajustar o maxmemory quando executar operações com utilização intensiva de memória.

  5. Se a métrica system memory usage ratio exceder 80%, reduza o limite de maxmemory-gb da instância. Consulte o artigo Faça a gestão da taxa de utilização da memória do sistema para ver mais detalhes.

  6. Considere aumentar a capacidade da instância.

  7. Se continuar a deparar-se com condições de OOM, contacte o apoio técnico da Google Cloud Platform.

Ajuste o tamanho da sua instância do Memorystore

Esta secção aborda três abordagens distintas que ajudam a dimensionar corretamente a sua instância com base na sua carga de trabalho:

Determine o tamanho inicial de uma instância do Memorystore

Primeiro, deve escolher se quer uma instância do nível padrão ou do nível básico. Para saber mais acerca dos níveis do Memorystore for Redis, consulte as capacidades dos níveis do Redis. Depois de selecionar o nível adequado para a sua aplicação, siga estes passos para determinar o tamanho da instância de que precisa:

  1. Determine o tamanho dos seus dados.

    • Estime o número de chaves e o tamanho médio das chaves que a sua aplicação vai escrever na instância do Redis. Multiplique estes valores para obter uma estimativa aproximada do tamanho da instância de que precisa.
  2. Escolha uma política de despejo.

    • Se usar a política noeviction maxmemory, o tamanho da instância tem de ser suficientemente grande para suportar o pico da carga de trabalho e o conjunto de trabalho. Se ficar sem memória com esta política maxmemory, a sua instância pode entrar numa condição de falta de memória.
    • Outras políticas de despejo não influenciam o tamanho da instância que deve aprovisionar.
  3. Aprovisione memória adicional para instâncias do nível Standard

    • Ao contrário das instâncias de nível básico, as instâncias de nível padrão reservam 10% da capacidade da instância como um buffer de replicação. Se escolher uma instância do nível padrão, certifique-se de que tem em conta a estimativa de dados do passo um e aprovisiona mais 10% para o buffer de replicação.
  4. Estime a sua taxa de gravação média e de pico

    • Se possível, estime a taxa de gravação e o tamanho das chaves que a sua aplicação vai usar. A taxa de gravação, comparada com a taxa de remoção de chaves, determina a rapidez com que a sua instância vai crescer ao longo do tempo.
  5. Expanda para alcançar a relação de resultados da cache pretendida

    • Monitorize a taxa de acertos na cache e, se não estiver a receber tantos acertos na cache bem-sucedidos quanto quer, significa que tem de aumentar o tamanho da instância ou certificar-se de que a sua aplicação está a escrever as chaves na instância do Memorystore que estão a ser pedidas e não cumpridas.

Determine se a sua instância está a bloquear escritas devido a uma condição de falta de memória

Se receber o seguinte erro:

-OOM command not allowed under OOM prevention.

Em seguida, verifique se:

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

Se for o caso, isto indica provavelmente que a instância está a bloquear as gravações devido a uma condição de falta de memória.

Faça a gestão da taxa de utilização da memória do sistema

Defina um alerta para receber uma notificação se a métrica Rácio de utilização da memória do sistema exceder 80%. Se a taxa de utilização de memória do sistema exceder 80%, deve tomar as medidas adequadas para que a instância não fique sem memória. Consoante o volume de escrita e o padrão de acesso às chaves, a utilização da memória do sistema pode aumentar rapidamente para 100%. O Memorystore oferece as seguintes formas de gerir a proporção de utilização da memória do sistema:

  • Ative a opção activedefrag para instâncias que executam a versão 4.0 e superior do Redis.
  • Diminua o limite de maxmemory-gb da sua instância.
  • Aumente a escala da instância.
  • Escolha a política de despejo adequada.
  • Defina TTLs em chaves voláteis.
  • Elimine manualmente as chaves da sua instância.

Ative o activedefrag

Se a proporção de utilização da memória do sistema exceder 80%, ative o activedefrag (para instâncias que executam o Redis versão 4.0 e superior). A desfragmentação pode demorar horas a libertar memória fragmentada. Se o tráfego de escrita for elevado, a desfragmentação por si só pode não ser suficiente para impedir que a instância fique sem memória. Por conseguinte, pode ter de implementar as seguintes recomendações:

Diminua o limite de maxmemory da sua instância

Se a taxa de utilização da memória do sistema exceder 80%, deve diminuir o valor de maxmemory-gb, mas, primeiro, veja como a taxa de utilização da memória do sistema mudou ao longo do tempo para determinar que novo limite de maxmemory-gb deve definir.

Cenário 1: a relação de utilização da memória do sistema tem vindo a aumentar de forma gradual e lenta. A fragmentação é um problema provável e deve diminuir maxmemory-gb em pequenos incrementos até que a taxa de utilização da memória do sistema se estabilize abaixo de 80%.

Cenário 2: a taxa de utilização da memória do sistema aumentou rapidamente e vê uma carga de escrita significativa na sua instância. Uma operação com utilização intensiva de memória provavelmente causou o pico. Nesta situação, deve diminuir o limite maxmemory-gb em incrementos maiores para garantir que a instância evita entrar numa condição de falta de memória ou recupera de uma condição de falta de memória. Deve ter em atenção que a redução de maxmemory pode diminuir a taxa de acertos da cache das suas instâncias. Uma taxa de acertos na cache muito inferior indica que deve aumentar a escala da sua instância para que a sua aplicação possa tirar partido das vantagens da utilização do Redis. Para saber como ajustar a configuração do maxmemory-gb, consulte o artigo Configurar instâncias do Redis.

Aumente a escala da sua instância

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

Exemplo de escalabilidade de maxmemory:

Se tiver uma instância de 10 GB com maxmemory-gb definida como 8 GB, tem 8 GB para armazenar chaves e 2 GB de sobrecarga de memória. Se dimensionar a instância para 20 GB, maxmemory-gb é dimensionado para 16 GB. Por conseguinte, a sua instância tem agora 16 GB de memória para armazenar chaves e 4 GB de sobrecarga. Consulte o artigo Escalar instâncias do Redis para ver instruções sobre como aumentar ou diminuir o tamanho da sua instância.

Escolha a política de despejo adequada

Se estiver a armazenar dados voláteis, escolha uma das volatile-* políticas de despejo. Se estiver a armazenar dados não voláteis, escolha uma das allkeys-*políticas.

Elimine manualmente chaves da sua instância

Pode melhorar as condições de falta de memória eliminando chaves da sua instância manualmente. Esta é uma solução temporária que ajuda a melhorar o estado de funcionamento da sua instância.