Redis: Datenbankgröße / -größe für Schlüssel anzeigen

86

Meine Redis-Instanz scheint sehr groß zu werden und ich möchte herausfinden, welche der mehreren Datenbanken, die ich dort habe, wie viel Speicher verbraucht. Der INFOBefehl von Redis zeigt mir nur die Gesamtgröße und die Anzahl der Schlüssel pro Datenbank an, was mir nicht viel Einblick gibt. Daher sind alle Tools / Ideen, die mir bei der Überwachung des Redis-Servers mehr Informationen geben, willkommen.

Die Redis-Dokumentation zeigt mir keine Befehle, die den verbrauchten Speicher bestimmter Schlüssel zurückgeben können. Wenn also ein fehlerhafter Code viel "Müll" in Redis schreiben würde, könnte dies sehr schwer zu finden sein ...

Bernhard Vallant
quelle

Antworten:

112

Also meine Lösung für mein eigenes Problem: Nachdem redis-cliich ein bisschen länger herumgespielt hatte, fand ich heraus, dass DEBUG OBJECT <key>sich so etwas wie der serializedlengthSchlüssel herausstellt, was eigentlich etwas war, wonach ich gesucht habe ...

Für eine ganze Datenbank müssen Sie alle Werte zusammenfassen, für KEYS *die es mit einer Skriptsprache Ihrer Wahl nicht allzu schwierig sein sollte ...

Das Schlimme ist, dass redis.io nicht wirklich viele Informationen hat DEBUG OBJECT.

Bernhard Vallant
quelle
1
Ist die serialisierte Länge die Größe des gesamten Objekts in Bytes?
Raffian
18
@BernhardVallant, danke für die Antwort. Ich schrieb ein schnelles Skript, das alle Tasten und ihre Größen in einem für Menschen lesbaren Format druckt. Ich dachte, ich würde teilen. :) gist.github.com/epicserve/5699837
Brent O'Connor
13
Der Wert der serialisierten Länge hängt nicht von der Speichergröße ab! Dies ist die Größe, die ein Objekt beim Speichern in einer RDB-Datei auf der Festplatte annehmen würde. Überprüfen Sie den Quellcode: github.com/antirez/redis/blob/… und github.com/antirez/redis/blob/…
Hugo Tavares
Es scheint keine Möglichkeit zu geben, die Größe des Schlüssels oder Werts oder Schlüsselwerts im Speicher zu ermitteln (nicht die Größe der Festplatte)
Avner Barr
4
Zu Ihrer Information : Versuchen Sie nichts mit DEBUG auf AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… . Sogar gefundene Redis-Cli
Bigkeys
66

Die Lösung aus den Kommentaren verdient eine eigene Antwort:

redis-cli --bigkeys
miracle2k
quelle
1
Bei großen Schlüsseln handelt es sich um die Größe des Schlüssels , nicht um die Größe des gespeicherten Werts. Sie könnten also einen Schlüssel amit einem Wert von 4 GB haben, dies würde jedoch bei großen Schlüsseln nicht angezeigt. (Dies wird von gist.github.com/michael-grunder/9257326 und docs.redislabs.com/latest/ri/memory-optimizations/… durchgeführt. )
EoghanM
37

MEMORY USAGE key Der Befehl gibt die Anzahl der Bytes an, die ein Schlüssel und sein Wert im RAM speichern müssen.

Die gemeldete Nutzung ist die Summe der Speicherzuweisungen für Daten und Verwaltungsaufwand, die ein Schlüssel für seinen Wert benötigt (Quell-Redis-Dokumentation).

Dogfish
quelle
11
Dies kann nur Version> 4.0
teek
15

Schauen Sie sich dieses Projekt an, in dem einige interessante Statistiken zu Schlüsselbereichen ausgegeben werden, die auf regulären Ausdrücken und Präfixen basieren. Es verwendet den DEBUG OBJECTBefehl und scannt die Datenbank, identifiziert Schlüsselgruppen und schätzt den Prozentsatz des Speicherplatzes, den sie belegen.

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

Die Ausgabe sieht folgendermaßen aus:

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  
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  

Oder dies hier: https://github.com/sripathikrishnan/redis-rdb-tools, das eine vollständige Analyse des gesamten Schlüsselraums durch Offline-Analyse einer dump.rdb-Datei durchführt. Dieser funktioniert auch gut. Es kann Ihnen die durchschnittliche / min / max-Größe für die Einträge in Ihrer Datenbank geben und wird dies sogar basierend auf einem Präfix tun.

jumand
quelle
8

Es kann sehr nützlich sein, Redis-Schlüssel zu testen und nach Typ zu gruppieren. Salvatore hat ein Tool namens Redis-Sampler geschrieben , das ungefähr 10000 RANDOMKEYBefehle gefolgt von a ausgibtTYPE bei abgerufenen Schlüsseln. Innerhalb von Sekunden oder Minuten sollten Sie eine ziemlich genaue Ansicht der Verteilung der Schlüsseltypen erhalten.

Ich habe eine Erweiterung geschrieben (leider nirgendwo Open Source, da sie arbeitsbezogen ist), die ein wenig Introspektion von Schlüsselnamen über Regexs hinzufügt, die Ihnen eine Vorstellung davon geben, welche Arten von Anwendungsschlüsseln (je nach Ihrer Namensstruktur) using), werden in Redis gespeichert. In Kombination mit der allgemeineren Ausgabe von Redis-Sampler sollte dies Ihnen eine äußerst gute Vorstellung davon geben, was los ist.

rlotun
quelle
7
Tks, hat mir tatsächlich mehr geholfen als derredis-cli --bigkeys
nmat
4

Vielleicht können Sie die Datenbankdatei überprüfen. Das Protokoll ist relativ einfach (aber nicht gut dokumentiert), sodass Sie einen Parser dafür schreiben können, um festzustellen, welche einzelnen Schlüssel viel Platz beanspruchen.


Neue Vorschläge:

Haben Sie versucht MONITOR, live zu sehen, was geschrieben wird? Vielleicht können Sie das Problem mit den Daten in Bewegung finden.

Donald Miner
quelle
Scheint interessant zu sein, aber ich versuche trotzdem, einen einfachen Weg zu finden, um den Speicherverbrauch von redis auf dem Server zu überwachen ... Die Untersuchung des Dumps scheint für mich praktikabler zu sein, um zu debuggen, ganz zu schweigen davon, dass es sich bei dem Dump um einige handelt Gigs jetzt!
Bernhard Vallant
Sie sollten die Redis-Mailingliste fragen. Ich bin wirklich interessant, die "beste" Antwort darauf zu hören.
Donald Miner
Nun, ich habe es bereits versucht INFOund MONITOR, aber vielleicht ist das Hauptproblem, dass Redis, wenn man nicht zuschaut, wirklich groß geworden ist ...
Bernhard Vallant
Ok, ich habe es auf ihrer Mailingliste gepostet, aber auch selbst eine Antwort gefunden ... Siehe unten!
Bernhard Vallant
Re. Selbstbeobachtung der Datenbankdatei - Ich habe ein Skript geschrieben, um dump.rdb-Dateien zu analysieren und eine CSV-Datei auszugeben, die den ungefähren Speicher angibt, der von jedem Schlüssel verwendet wird. Siehe github.com/sripathikrishnan/redis-rdb-tools
Sripathi Krishnan
1

Normalerweise bevorzuge ich die Schlüsselstichprobenmethode, um solche Szenarien zu beheben.

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

Z.B:-

redis-cli -p 6370 -n 0 - große Schlüssel

anrajme
quelle
Warum ist dies die "Key Sampling" -Methode? Ich finde es sehr begrenzt, da es nur die Spitze des Eisbergs zeigt.
MrR