Redis: mostra o tamanho / tamanho do banco de dados para as chaves

92

Minha instância do redis parece estar ficando muito grande e eu gostaria de descobrir qual dos vários bancos de dados que tenho nele consome quanta memória. O INFOcomando do Redis apenas me mostra o tamanho total e o número de chaves por banco de dados, o que não me dá muita percepção ... Portanto, quaisquer ferramentas / ideias que me forneçam mais informações ao monitorar o servidor redis seriam bem-vindas.

A documentação do Redis não me mostra nenhum comando que possa retornar a memória consumida de certas chaves, então eu acho que se algum código com erros escreveria muito "lixo" para redis, isso poderia ser realmente difícil de encontrar ...

Bernhard Vallant
fonte

Respostas:

115

Então, minha solução para meu próprio problema: depois de brincar redis-clium pouco mais, descobri que isso DEBUG OBJECT <key>revela algo como o serializedlengthof key, que na verdade era algo que eu estava procurando ...

Para um banco de dados inteiro, você precisa agregar todos os valores para o KEYS *que não deve ser muito difícil com uma linguagem de script de sua escolha ...

O ruim é que redis.io não tem muitas informações sobre o DEBUG OBJECT.

Bernhard Vallant
fonte
1
O comprimento serializado é o tamanho de todo o objeto, em bytes?
raffian de
18
@BernhardVallant, obrigado pela resposta. Eu fui em frente e escrevi um script rápido que imprime todas as chaves e seus tamanhos em um formato legível por humanos. Pensei em compartilhar. :) gist.github.com/epicserve/5699837
Brent O'Connor
13
O valor de serializedlength não se refere ao tamanho da memória! É o tamanho que um objeto teria ao salvar em um arquivo RDB no disco. Verifique o código-fonte: github.com/antirez/redis/blob/… e github.com/antirez/redis/blob/…
Hugo Tavares
não parece haver uma maneira de obter o tamanho da chave ou valor ou valor-chave na memória (não o tamanho despejado no disco)
Avner Barr,
4
Para sua informação: não se preocupe em tentar nada com DEBUG no AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… . Mesmo encontrado redis-cli --bigkeys iria parar
sonjz
41

MEMORY USAGE key comando fornece 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 despesas administrativas que uma chave seu valor exige (documentação de redis da fonte)

cação
fonte
13
isso só pode ser usado versão> 4.0
teik
15

Dê uma olhada neste projeto, ele produz algumas estatísticas interessantes sobre espaços-chave com base em regexs e prefixos. Ele usa o DEBUG OBJECTcomando e verifica o banco de dados, identificando grupos de chaves e estimando a porcentagem de espaço que estão ocupando.

https://github.com/snmaynard/redis-audit

A saída é semelhante a esta:

Summary  

---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
Key                                                | Memory Usage | Expiry Proportion | Last Access Time                                    
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
notification_3109439                               | 88.14%       | 0.0%              | 2 minutes                               
user_profile_3897016                               | 11.86%       | 99.98%            | 20 seconds  
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  

Ou este: https://github.com/sripathikrishnan/redis-rdb-tools que faz uma análise completa em todo o keyspace analisando um arquivo dump.rdb offline. Este também funciona bem. Ele pode fornecer o tamanho médio / mínimo / máximo para as entradas em seu banco de dados, e até fará isso com base em um prefixo.

Jumand
fonte
8

Você pode achar muito útil experimentar as chaves Redis e agrupá-las por tipo. Salvatore escreveu uma ferramenta chamada redis-sampler que emite cerca de 10.000 RANDOMKEYcomandos seguidos por TYPEteclas recuperadas. Em questão de segundos ou minutos, você deve obter uma visão bastante precisa da distribuição dos tipos de chave.

Eu escrevi uma extensão (infelizmente não em qualquer lugar de código aberto porque é relacionada ao trabalho), que adiciona um pouco de introspecção de nomes de chave via regexs que dão uma ideia de quais tipos de chaves de aplicativo (de acordo com qualquer estrutura de nomenclatura que você usando), são armazenados no Redis. Combinado com a saída mais geral do redis-sampler, isso deve lhe dar uma ideia extremamente boa do que está acontecendo.

rlotun
fonte
7
Tks, na verdade me ajudou mais do que oredis-cli --bigkeys
nmat
4

Talvez você possa fazer alguma introspecção no arquivo db. O protocolo é relativamente simples (mas não bem documentado), então você pode escrever um analisador para ele para determinar quais chaves individuais estão ocupando muito espaço.


Novas sugestões:

Já experimentou usar MONITORpara ver o que está sendo escrito, ao vivo? Talvez você possa encontrar o problema com os dados em movimento.

Donald Miner
fonte
Parece ser interessante, mas, no entanto, estou tentando encontrar uma maneira fácil de monitorar o consumo de memória do redis no servidor ... Examinar o dump parece ser mais praticável para depurar para mim, sem mencionar que o dump é um pouco shows agora!
Bernhard Vallant,
Você deve perguntar à lista de discussão redis. Estou realmente interessado em ouvir a "melhor" resposta para isso.
Donald Miner,
Bem, já tentei INFOe MONITOR, mas o maior problema é, que quando não estava assistindo o redis cresceu muito ...
Bernhard Vallant
Ok, eu postei na lista de discussão deles, mas também encontrei uma resposta por conta própria ... Veja abaixo!
Bernhard Vallant,
ré. introspecção no arquivo db - escrevi um script para analisar arquivos dump.rdb e gerar um arquivo csv relatando a memória aproximada usada por cada chave. Consulte github.com/sripathikrishnan/redis-rdb-tools
Sripathi Krishnan
2

Eu geralmente prefiro o método de amostragem de chave para solucionar esses cenários.

redis-cli -p 6379 -n db_number --bigkeys

Por exemplo:-

redis-cli -p 6370 -n 0 --bigkeys

anrajme
fonte
Por que esse é o método de "amostragem principal"? Acho que é muito limitado, pois mostra apenas a ponta do iceberg.
MrR
0

Que tal redis-cli get KEYNAME | wc -c

Ed Greenberg
fonte