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

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.


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)


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.


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.


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.


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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.