Redis: muestra el tamaño / tamaño de la base de datos para las claves

88

Mi instancia de redis parece estar creciendo mucho y me gustaría saber cuál de las múltiples bases de datos que tengo allí consume cuánta memoria. El INFOcomando de Redis solo me muestra el tamaño total y la cantidad de claves por base de datos, lo que no me da mucha información ... Por lo tanto, cualquier herramienta / idea que me brinde más información al monitorear el servidor de Redis sería apreciada.

La documentación de Redis no me muestra ningún comando que pueda devolver la memoria consumida de ciertas claves, así que supongo que si algún código con errores escribiría mucha "basura" para redis, esto podría ser realmente difícil de encontrar ...

Bernhard Vallant
fuente

Respuestas:

113

Entonces, mi solución a mi propio problema: después de jugar redis-cliun poco más, descubrí que DEBUG OBJECT <key>revela algo como la serializedlengthclave of, que de hecho era algo que estaba buscando ...

Para una base de datos completa, necesita agregar todos los valores para lo KEYS *cual no debería ser demasiado difícil con el lenguaje de programación de su elección ...

Lo malo es que redis.io realmente no tiene mucha información sobre DEBUG OBJECT.

Bernhard Vallant
fuente
1
¿Es la longitud serializada el tamaño de todo el objeto, en bytes?
raffian
18
@BernhardVallant, gracias por la respuesta. Seguí adelante y escribí un guión rápido que imprime todas las claves y sus tamaños en un formato legible por humanos. Pensé que lo compartiría. :) gist.github.com/epicserve/5699837
Brent O'Connor
13
¡El valor de serializedlength no se refiere al tamaño de la memoria! Es el tamaño que tomaría un objeto cuando se guarda en un archivo RDB en el disco. Verifique el código fuente: github.com/antirez/redis/blob/… y github.com/antirez/redis/blob/…
Hugo Tavares
no parece haber una manera de obtener el tamaño de la clave o el valor o el valor de la clave en la memoria (no el tamaño volcado en el disco)
Avner Barr
4
FYI: no se moleste en probar nada con DEBUG en AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… . Incluso encontró redis-cli --bigkeys se estancaría
sonjz
40

MEMORY USAGE key El comando le da la cantidad de bytes que una clave y su valor requieren para ser almacenados en la RAM.

El uso informado es el total de asignaciones de memoria para datos y gastos administrativos que requiere una clave de su valor (documentación de fuente redis)

cazón
fuente
11
esto solo se puede usar en la versión> 4.0
teik
15

Eche un vistazo a este proyecto, genera algunas estadísticas interesantes sobre los espacios de teclas basadas en expresiones regulares y prefijos. Utiliza el DEBUG OBJECTcomando y escanea la base de datos, identificando grupos de claves y estimando el porcentaje de espacio que ocupan.

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

La salida se ve así:

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 este: https://github.com/sripathikrishnan/redis-rdb-tools que hace un análisis completo en todo el espacio de claves analizando un archivo dump.rdb sin conexión. Este también funciona bien. Puede darle el tamaño promedio / mínimo / máximo para las entradas en su base de datos, e incluso lo hará basándose en un prefijo.

jumand
fuente
8

Puede resultarle muy útil probar claves de Redis y agruparlas por tipo. Salvatore ha escrito una herramienta llamada redis-sampler que emite alrededor de 10000 RANDOMKEYcomandos seguidos de las TYPEclaves recuperadas. En cuestión de segundos o minutos, debería obtener una vista bastante precisa de la distribución de los tipos de claves.

Escribí una extensión (desafortunadamente no en ningún lugar de código abierto porque está relacionada con el trabajo), que agrega un poco de introspección de los nombres de clave a través de expresiones regulares que le dan una idea de qué tipo de claves de aplicación (de acuerdo con la estructura de nombres que esté usando), se almacenan en Redis. Combinado con la salida más general de redis-sampler, esto debería darle una muy buena idea de lo que está sucediendo.

rlotun
fuente
7
Tks, en realidad me ayudó más queredis-cli --bigkeys
nmat
4

Quizás pueda hacer algo de introspección en el archivo db. El protocolo es relativamente simple (aunque no está bien documentado), por lo que podría escribir un analizador para determinar qué claves individuales ocupan mucho espacio.


Nuevas sugerencias:

¿Ha intentado usar MONITORpara ver lo que se está escribiendo en vivo? Quizás pueda encontrar el problema con los datos en movimiento.

Donald Miner
fuente
Parece interesante, pero sin embargo, estoy tratando de encontrar una manera fácil de monitorear el consumo de memoria de redis en el servidor ... Examinar el volcado parece ser más práctico para depurarme, sin mencionar que el volcado es un poco conciertos ahora!
Bernhard Vallant
Debe preguntar a la lista de correo de redis. Realmente me interesa escuchar la "mejor" respuesta para esto.
Donald Miner
Bueno, ya lo he intentado INFOy MONITOR, pero el principal problema es que cuando no estaba viendo Redis creció mucho ...
Bernhard Vallant
Ok, lo publiqué en su lista de correo, pero también encontré una respuesta ... ¡Vea abajo!
Bernhard Vallant
re. introspección en el archivo db: escribí un script para analizar los archivos dump.rdb y generar un archivo csv que informa la memoria aproximada utilizada por cada clave. Ver github.com/sripathikrishnan/redis-rdb-tools
Sripathi Krishnan
1

Por lo general, prefiero el método de muestreo de claves para solucionar estos escenarios.

redis-cli -p 6379 -n número_bd --bigkeys

P.ej:-

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

anrajme
fuente
¿Por qué es este el método de "muestreo clave"? Lo encuentro muy limitado ya que solo muestra la punta del iceberg.
MrR
0

¿Qué tal redis-cli get KEYNAME | wc -c

Ed Greenberg
fuente