Redis: afficher la taille / taille de la base de données pour les clés

88

Mon instance redis semble devenir très volumineuse et j'aimerais savoir laquelle des multiples bases de données que j'ai dedans consomme combien de mémoire. La INFOcommande de Redis me montre juste la taille totale et le nombre de clés par base de données, ce qui ne me donne pas beaucoup d'informations ... Donc, tous les outils / idées qui me donnent plus d'informations lors de la surveillance du serveur Redis seraient appréciés.

La documentation Redis ne me montre aucune commande pouvant renvoyer la mémoire consommée de certaines touches, donc je suppose que si un code bogué écrirait beaucoup de "poubelle" à redis, cela pourrait être vraiment difficile à trouver ...

Bernhard Vallant
la source

Réponses:

113

Donc ma solution à mon propre problème: après avoir joué redis-cliun peu plus longtemps, j'ai découvert que DEBUG OBJECT <key>quelque chose comme la serializedlengthclé de la clé, c'était en fait quelque chose que je cherchais ...

Pour une base de données entière, vous devez agréger toutes les valeurs pour KEYS *lesquelles il ne devrait pas être trop difficile avec un langage de script de votre choix ...

Le problème est que redis.io n'a pas vraiment beaucoup d'informations sur DEBUG OBJECT.

Bernhard Vallant
la source
1
La longueur sérialisée est-elle la taille de l'objet entier, en octets?
raffian
18
@BernhardVallant, merci pour la réponse. Je suis allé de l'avant et j'ai écrit un script rapide qui imprime toutes les clés et leurs tailles dans un format lisible par l'homme. Je pensais que je partagerais. :) gist.github.com/epicserve/5699837
Brent O'Connor
13
La valeur de serializedlength ne concerne pas la taille de la mémoire! C'est la taille qu'un objet prendrait lors de l'enregistrement dans un fichier RDB sur le disque. Vérifiez le code source: github.com/antirez/redis/blob/… et github.com/antirez/redis/blob/…
Hugo Tavares
il ne semble pas y avoir de moyen d'obtenir la taille de la clé ou de la valeur ou de la valeur de clé en mémoire (pas la taille sauvegardée sur le disque)
Avner Barr
4
Pour info: n'essayez rien avec DEBUG sur AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… . Même trouvé redis-cli --bigkeys
calerait
40

MEMORY USAGE key La commande vous donne le nombre d'octets dont une clé et sa valeur ont besoin pour être stockées dans la RAM.

L'utilisation rapportée est le total des allocations de mémoire pour les données et les frais administratifs requis par une clé de sa valeur (documentation redis source)

chien de mer
la source
11
ceci ne peut être utilisé que version> 4.0
teik
15

Jetez un œil à ce projet, il produit des statistiques intéressantes sur les espaces de clés basés sur des expressions régulières et des préfixes. Il utilise la DEBUG OBJECTcommande et scanne la base de données, identifiant les groupes de clés et estimant le pourcentage d'espace qu'ils occupent.

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

La sortie ressemble à ceci:

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 celui-ci: https://github.com/sripathikrishnan/redis-rdb-tools qui effectue une analyse complète sur l'ensemble de l'espace de clés en analysant un fichier dump.rdb hors ligne. Celui-ci fonctionne bien aussi. Il peut vous donner la taille moyenne / min / max des entrées de votre base de données, et le fera même en fonction d'un préfixe.

jumand
la source
8

Vous pourriez trouver très utile d'échantillonner les clés Redis et de les regrouper par type. Salvatore a écrit un outil appelé redis-sampler qui émet environ 10000 RANDOMKEYcommandes suivies d'une TYPEsur les clés récupérées. En quelques secondes ou minutes, vous devriez obtenir une vue assez précise de la distribution des types de clés.

J'ai écrit une extension (malheureusement pas n'importe où open-source car elle est liée au travail), qui ajoute un peu d'introspection des noms de clés via des expressions rationnelles qui vous donnent une idée des types de clés d'application (selon la structure de dénomination que vous using), sont stockés dans Redis. Combiné avec la sortie plus générale de redis-sampler, cela devrait vous donner une très bonne idée de ce qui se passe.

rlotun
la source
7
Tks, m'a aidé plus que leredis-cli --bigkeys
nmat
4

Vous pouvez peut-être faire une introspection sur le fichier db. Le protocole est relativement simple (mais pas bien documenté), vous pouvez donc écrire un analyseur pour déterminer quelles clés individuelles prennent beaucoup de place.


Nouvelles suggestions:

Avez-vous essayé d'utiliser MONITORpour voir ce qui est écrit, en direct? Vous pouvez peut-être trouver le problème avec les données en mouvement.

Donald Miner
la source
Cela semble intéressant, mais j'essaie néanmoins de trouver un moyen facile de surveiller la consommation de mémoire de Redis sur le serveur ... L'examen du vidage me semble plus pratique pour le débogage, sans trop mentionner que le vidage est un peu concerts maintenant!
Bernhard Vallant
Vous devriez demander à la liste de diffusion redis. Je suis vraiment intéressant d'entendre la «meilleure» réponse à cela.
Donald Miner
Eh bien, j'ai déjà essayé INFOet MONITOR, mais le problème principal est peut-être que, lorsque vous ne regardez pas Redis, il est devenu vraiment grand ...
Bernhard Vallant
Ok je l'ai posté sur leur liste de diffusion, mais j'ai trouvé une réponse par moi-même aussi ... Voir ci-dessous!
Bernhard Vallant
ré. introspection sur le fichier db - J'ai écrit un script pour analyser les fichiers dump.rdb et générer un fichier csv indiquant la mémoire approximative utilisée par chaque clé. Voir github.com/sripathikrishnan/redis-rdb-tools
Sripathi Krishnan
1

Je préfère généralement la méthode d'échantillonnage par clé pour résoudre de tels scénarios.

redis-cli -p 6379 -n numéro_base --bigkeys

Par exemple:-

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

anrajme
la source
Pourquoi est-ce la méthode de "l'échantillonnage clé"? Je trouve cela très limité car il ne montre que la pointe de l'iceberg.
MrR
0

Que diriez-vous de redis-cli obtenir KEYNAME | wc -c

Ed Greenberg
la source