Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Como analisar e otimizar o uso de memória no Redis


O Redis é um armazenamento de dados na memória, o que significa que todo o conjunto de dados é armazenado na memória (RAM). Embora isso seja ótimo para o desempenho, quando o tamanho dos dados começa a crescer, mais e mais RAM precisa ser adicionada para armazenar todos esses dados. Isso pode rapidamente se tornar proibitivamente caro e, antes que você perceba, os custos do servidor começam a disparar, deixando você preocupado se o Redis pode ser dimensionado para você de maneira econômica.

Este é, obviamente, um problema comum com qualquer banco de dados, mas dói mais no caso de bancos de dados em memória, como o Redis, já que a RAM é mais cara do que o armazenamento secundário, como discos rígidos e SSDs. Devemos lembrar, no entanto, que o Redis não se destina a armazenar terabytes de dados para seu aplicativo. Em vez disso, ele deve ser usado para armazenar especificamente os dados que precisam ser lidos (e, em menor grau, gravados) em uma taxa muito alta, enquanto o restante dos dados pode ficar em bancos de dados tradicionais apoiados em disco. Para esse fim, o Redis é usado com mais frequência como cache, mantendo apenas os dados mais ativos com altos requisitos de taxa de transferência de leitura/gravação (pense em placares e mensagens de bate-papo em tempo real). Portanto, o principal culpado pelo uso excessivo de memória com o Redis é o comportamento do aplicativo. Seu aplicativo pode estar armazenando dados desnecessários que não se beneficiam de estar no Redis, ou até mesmo dados completamente redundantes, ou seja, dados que nunca são usados ​​para qualquer finalidade, como esse usuário foi.

Para diagnosticar problemas com uso excessivo de memória, obviamente precisamos de uma maneira de descobrir quais chaves estão usando mais memória para que possamos começar a raciocinar e entender quais comportamentos do aplicativo estão causando o problema. Lembre-se, a otimização prematura é a raiz de todos os males, e o Redis não é exceção. Precisamos absolutamente de visibilidade das características de memória de nosso conjunto de dados para começar a pensar sobre onde está o problema e como podemos corrigi-lo. Abaixo, exploramos algumas das opções disponíveis para espiar nossos dados Redis e encontrar as áreas que podem se beneficiar da otimização no nível do aplicativo.

O comando MEMORY USAGE


Este comando apropriadamente nomeado está disponível desde o Redis 4.0.0 e é a primeira etapa para depurar problemas de memória com o Redis. Dos documentos:

O comando MEMORY USAGE informa o número de bytes que uma chave e seu valor requerem para serem armazenados na RAM. O uso relatado é o total de alocações de memória para dados e sobrecargas administrativas que uma chave requer seu valor.

Aqui está um exemplo:
MEMORY USAGE users_by_reputation
(integer) 2923419

Um inteiro simples representando o número de bytes usados ​​para armazenar a chave, o valor e os overheads internos é retornado. Para encontrar rapidamente o uso de memória de uma chave específica, não fica mais simples do que isso.

Dois possíveis contras são:
  1. Este comando está disponível apenas no Redis 4.0.0 e superior. Isso exclui a maioria dos provedores de nuvem.
  2. Ele informa apenas a memória usada por uma única chave, portanto, a menos que você saiba com antecedência qual chave ou chaves estão causando o problema, esse comando tem utilidade muito limitada.

redis-rdb-tools


redis-rdb-tools é uma ferramenta de linha de comando bacana que vai além do humilde MEMORY USAGE comando que discutimos acima. É uma ferramenta de perfil de memória popular e poderosa criada especificamente para o Redis que analisa um arquivo de despejo do Redis (.rdb) e gera um perfil de memória detalhado para cada chave no despejo, incluindo detalhes como a memória usada, tipo de dados, número de elementos, etc. Ele também permite que você filtre as chaves que são processadas, para que você possa opcionalmente executar a análise em uma chave específica ou em um subconjunto de chaves que correspondam a um padrão específico. A saída da análise é um arquivo CSV com colunas para a chave, memória usada, tipo de dados, número de elementos, etc.

Esta ferramenta é tão boa porque, ao contrário do MEMORY USAGE comando, que funciona apenas em uma única chave, esta ferramenta analisa todo o conjunto de dados e cospe o resultado em formato CSV, o que significa que você pode carregá-lo em qualquer banco de dados SQL e realizar as consultas que desejar, classificando-o e filtrando-o como desejar , com todo o poder do SQL, que oferece uma ótima visão do custo de memória de seus dados. Como bônus, se você estiver usando versões do Redis anteriores à 4.0.0, ainda poderá usar essa ferramenta para analisar chaves únicas, se desejar, pois essa ferramenta funciona analisando o dump binário que o Redis produz, em vez de depender do Redis para relatar o uso de memória. Por outro lado, essa diferença de abordagem significa que o uso de memória calculado é mais uma estimativa do que um valor exato, conforme mencionado na documentação do projeto. No entanto, isso não é realmente um problema quando nosso objetivo é identificar problemas de uso de memória, pois estamos mais interessados ​​nos tamanhos relativos das chaves e na identificação de chaves que usam significativamente mais memória do que deveriam estar usando, então alguns bytes aqui ou ali é realmente irrelevante.

Ferramentas RDB


O RDBTools é uma ferramenta baseada na web que oferece diversas ferramentas para gerenciar e otimizar o Redis, com foco principal na otimização de memória. Ele nasceu do projeto redis-rdb-tools de código aberto discutido acima. Com ele, podemos analisar sem esforço o uso de memória do nosso servidor Redis simplesmente apontando para nossa instância e clicando em “Analisar”. A ferramenta baixa um dump da instância em execução e o analisa, apresentando a você uma interface do usuário para filtrar e classificar suas chaves com base em vários parâmetros, como uso de memória, tipo de dados, codificação, número de elementos etc., semelhante à linha de comando ferramenta, mas sem nenhum esforço manual envolvido em fazer um dump, gerar o perfil de memória, configurar um banco de dados, importar o perfil, escrever e executar consultas, etc.

Além disso, o RDBTools também gera vários gráficos e tabelas a partir do perfil de memória, permitindo uma visão ainda maior de seus dados, além de recomendações para otimizar a configuração do seu servidor Redis, com base nos padrões do setor e anos de experiência otimizando o Redis, para espremer ainda mais economia de memória. Além da otimização de memória, há uma série de outros recursos úteis para quem usa o Redis, como uma CLI avançada integrada, editor de configuração com documentação em linha, visualizador de dados ao vivo avançado, etc.

O RDBTools está disponível como uma imagem docker, disponível no docker hub e pode ser executado em sua própria máquina, portanto, não há necessidade de se preocupar com o vazamento de dados confidenciais. Uma versão de teste está disponível gratuitamente para sempre, com alguns limites de uso. Consulte a página de preços para obter mais informações sobre os vários planos pagos disponíveis.

Conclusão


Ficar sem memória é um problema inevitável ao usar bancos de dados na memória, como o Redis. Como todos os problemas de otimização, o primeiro passo é diagnosticar o problema corretamente. É importante resistir à tentação de tirar conclusões precipitadas com base em hipóteses não verificadas. “Medir, medir, medir” é o nome do jogo quando se trata de otimização, e existem vários métodos e ferramentas para obter informações sobre seus problemas de memória Redis. Qual é o melhor depende de suas necessidades específicas e de onde você está no processo de desenvolvimento. Para alguém que está começando a usar o Redis, ficar de olho nas teclas individuais pode ser suficiente para começar, enquanto para usuários pesados ​​do Redis, certamente faz sentido optar por uma ferramenta GUI dedicada com todos os sinos e assobios para economizar dor mais tarde. Seja qual for sua escolha, sempre certifique-se de entender a raiz do seu problema antes de tentar resolvê-lo e lembre-se, se você estiver tendo problemas de memória com o Redis, provavelmente está usando mais memória do que realmente precisa.