Redis: mostra la dimensione / dimensione del database per le chiavi


88

La mia istanza di redis sembra diventare molto grande e mi piacerebbe scoprire quale dei molteplici database che ho al suo interno consuma quanta memoria. Il INFOcomando di Redis mi mostra solo la dimensione totale e il numero di chiavi per database, il che non mi dà molte informazioni ... Quindi qualsiasi strumento / idea che mi dia più informazioni durante il monitoraggio del server redis sarebbe apprezzato.

La documentazione di Redis non mi mostra alcun comando che possa restituire la memoria consumata di alcune chiavi, quindi immagino che se un codice difettoso scrivesse un sacco di "spazzatura" in redis, questo potrebbe essere davvero difficile da trovare ...

Risposte:


113

Quindi la mia soluzione al mio problema: dopo aver giocato redis-cliun po 'più a lungo ho scoperto che DEBUG OBJECT <key>rivela qualcosa come il serializedlengthtasto of, che in realtà era qualcosa che stavo cercando ...

Per un intero database è necessario aggregare tutti i valori per i KEYS *quali non dovrebbe essere troppo difficile con un linguaggio di scripting di propria scelta ...

La cosa brutta è che redis.io non ha davvero molte informazioni su DEBUG OBJECT.


1
La lunghezza serializzata è la dimensione dell'intero oggetto, in byte?
raffian

18
@BernhardVallant, grazie per la risposta. Sono andato avanti e ho scritto uno script veloce che stampa tutte le chiavi e le loro dimensioni in un formato leggibile dall'uomo. Ho pensato di condividere. :) gist.github.com/epicserve/5699837
Brent O'Connor

13
Il valore di serializedlength non riguarda la dimensione della memoria! È la dimensione che un oggetto richiederebbe quando viene salvato in un file RDB su disco. Controlla il codice sorgente: github.com/antirez/redis/blob/… e github.com/antirez/redis/blob/…
Hugo Tavares

non sembra esserci un modo per ottenere la dimensione della chiave o del valore o del valore-chiave in memoria (non la dimensione scaricata su disco)
Avner Barr

4
FYI: non preoccuparti di provare nulla con DEBUG su AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… . Anche trovato redis-cli
bigkey si fermavano


40

MEMORY USAGE key comando fornisce il numero di byte che una chiave e il suo valore richiedono per essere memorizzati nella RAM.

L'utilizzo riportato è il totale delle allocazioni di memoria per i dati e i costi amministrativi richiesti da una chiave per il suo valore (documentazione redis sorgente)


11
questo può essere utilizzato solo nella versione> 4.0
teik

15

Dai un'occhiata a questo progetto che fornisce alcune statistiche interessanti sugli spazi delle chiavi basate su regex e prefissi. Usa il DEBUG OBJECTcomando e scansiona il db, identificando gruppi di chiavi e stimando la percentuale di spazio che stanno occupando.

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

L'output è simile a questo:

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

O questo questo: https://github.com/sripathikrishnan/redis-rdb-tools che esegue un'analisi completa sull'intero keyspace analizzando un file dump.rdb offline. Anche questo funziona bene. Può darti la dimensione media / min / max per le voci nel tuo database e lo farà anche in base a un prefisso.


8

Potresti trovare molto utile campionare le chiavi Redis e raggrupparle per tipo. Salvatore ha scritto uno strumento chiamato redis-sampler che emette circa 10000 RANDOMKEYcomandi seguiti da una TYPEchiave richiamata. In pochi secondi o minuti, dovresti ottenere una visione abbastanza accurata della distribuzione dei tipi di chiavi.

Ho scritto un'estensione (sfortunatamente non da nessuna parte open source perché è correlata al lavoro), che aggiunge un po 'di introspezione dei nomi delle chiavi tramite regex che ti danno un'idea di quali tipi di chiavi dell'applicazione (in base alla struttura dei nomi che stai using), vengono archiviati in Redis. Combinato con l'output più generale di redis-sampler, questo dovrebbe darti un'idea estremamente buona di cosa sta succedendo.


7
Tks, in realtà mi ha aiutato più delredis-cli --bigkeys
nmat

4

Forse puoi fare qualche introspezione sul file db. Il protocollo è relativamente semplice (ma non ben documentato), quindi potresti scrivere un parser per determinare quali singole chiavi occupano molto spazio.


Nuovi suggerimenti:

Hai provato a usare MONITORper vedere cosa viene scritto, dal vivo? Forse puoi trovare il problema con i dati in movimento.


Sembra essere interessante, ma comunque sto cercando di trovare un modo semplice per monitorare il consumo di memoria di redis sul server ... Esaminare il dump sembra essere più praticabile per il debug per me, non menzionare anche che il dump è pochi concerti adesso!
Bernhard Vallant

Dovresti chiedere alla mailing list redis. Sono davvero interessante ascoltare la "migliore" risposta per questo.
Donald Miner

Beh, ho già provato INFOe MONITOR, ma il problema principale è che quando non si guardava Redis è diventato davvero grande ...
Bernhard Vallant

Ok l'ho postato sulla loro mailing list, ma ho trovato una risposta anche da solo ... Vedi sotto!
Bernhard Vallant

ri. introspezione su file db - Ho scritto uno script per analizzare i file dump.rdb e produrre un file csv che riporta la memoria approssimativa utilizzata da ciascuna chiave. Vedi github.com/sripathikrishnan/redis-rdb-tools
Sripathi Krishnan


1

Di solito preferisco il metodo di campionamento chiave per risolvere tali scenari.

redis-cli -p 6379 -n numero_db --bigkeys

Per esempio:-

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


Perché questo è il metodo di "campionamento chiave"? Lo trovo molto limitato in quanto mostra solo la punta dell'iceberg.
MrR

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.