Redis: Показать размер базы данных / размер ключей


88

Мой экземпляр redis, кажется, становится очень большим, и я хотел бы узнать, какая из нескольких баз данных, которые у меня есть, потребляет сколько памяти. INFOКоманда Redis просто показывает мне общий размер и количество ключей для каждой базы данных, что не дает мне особого представления ... Так что любые инструменты / идеи, которые дают мне больше информации при мониторинге сервера Redis, будут оценены.

Документация Redis не показывает мне никаких команд, которые могут вернуть потребленную память определенных ключей, поэтому я предполагаю, что если какой-либо ошибочный код будет записывать много "мусора" в redis, это будет действительно сложно найти ...

Ответы:


113

Итак, мое решение моей собственной проблемы: поиграв redis-cliнемного дольше, я обнаружил, что DEBUG OBJECT <key>обнаруживается что-то вроде serializedlengthключа, который на самом деле был тем, что я искал ...

Для всей базы данных вам необходимо агрегировать все значения, для KEYS *чего не должно быть слишком сложно с языком сценариев по вашему выбору ...

Плохо то, что у redis.io действительно мало информации DEBUG OBJECT.


1
Является ли сериализованная длина размером всего объекта в байтах?
raffian

18
@BernhardVallant, спасибо за ответ. Я пошел дальше и написал быстрый сценарий, который печатает все ключи и их размеры в удобочитаемом формате. Думал, что поделюсь. :) gist.github.com/epicserve/5699837
Брент О'Коннор,

13
Значение serializedlength не связано с размером памяти! Это размер, который будут иметь объекты при сохранении в файл RDB на диске. Проверьте исходный код: github.com/antirez/redis/blob/… и github.com/antirez/redis/blob/…
Hugo Tavares

похоже, нет способа получить размер ключа, или значения, или ключевого значения в памяти (не размер выгружаемого на диск)
Avner Barr

4
К вашему сведению: не пытайтесь ничего делать с DEBUG на AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… . Даже найденный redis-cli --bigkeys будет останавливаться
sonjz

70

Решение из комментариев заслуживает собственного ответа:

redis-cli --bigkeys

1
big keys - это размер ключа , а не размер сохраненного значения ... так что у вас может быть ключ aсо значением 4 ГБ, но это не будет отображаться в bigkeys. (это делается gist.github.com/michael-grunder/9257326 и docs.redislabs.com/latest/ri/memory-optimizations/… )
EoghanM

40

MEMORY USAGE key Команда дает вам количество байтов, которое требуется для хранения ключа и его значения в ОЗУ.

Сообщаемое использование - это общее выделение памяти для данных и административных накладных расходов, которые требуются для ключа, соответствующего его значению (исходная документация Redis)


11
может использоваться только версия> 4.0
teik

15

Взгляните на этот проект, он выводит интересную статистику о пространствах ключей на основе регулярных выражений и префиксов. Он использует DEBUG OBJECTкоманду и сканирует базу данных, идентифицируя группы ключей и оценивая процент пространства, которое они занимают.

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

Результат выглядит так:

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

Или вот этот: https://github.com/sripathikrishnan/redis-rdb-tools, который выполняет полный анализ всего пространства ключей, анализируя файл dump.rdb в автономном режиме. Этот тоже хорошо работает. Он может дать вам средний / минимальный / максимальный размер для записей в вашей базе данных и даже сделает это на основе префикса.


8

Возможно, вам будет очень полезно взять образцы ключей Redis и сгруппировать их по типу. Сальваторе написал инструмент под названием redis-sampler, который выдает около 10000 RANDOMKEYкоманд, за которыми следуют TYPEизвлеченные ключи. За секунды или минуты вы должны получить довольно точное представление о распределении типов ключей.

Я написал расширение (к сожалению, нигде с открытым исходным кодом, потому что оно связано с работой), которое добавляет немного самоанализа имен ключей с помощью регулярных выражений, которые дают вам представление о том, какие типы ключей приложения (в зависимости от структуры именования вы using), хранятся в Redis. В сочетании с более общим выводом redis-sampler это должно дать вам очень хорошее представление о том, что происходит.


7
Спасибо, на самом деле помог мне больше, чемredis-cli --bigkeys
nmat

4

Возможно, вам удастся провести некоторый анализ файла db. Протокол относительно прост (но плохо документирован), поэтому вы можете написать для него парсер, чтобы определить, какие отдельные ключи занимают много места.


Новые предложения:

Вы пробовали использовать, MONITORчтобы посмотреть, что пишется вживую? Возможно, вы найдете проблему с данными в движении.


Кажется интересным, но, тем не менее, я пытаюсь найти простой способ контролировать потребление памяти Redis на сервере ... Изучение дампа кажется мне более практичным для отладки, не говоря уже о том, что дамп - это несколько концерты сейчас!
Бернхард Валлант 03

Вам следует спросить список рассылки Redis. Мне действительно интересно услышать «лучший» ответ на этот вопрос.
Дональд Майнер,

Ну, уже попробовали, INFOи MONITOR, возможно, главная проблема в том, что, когда я не смотрел, Redis действительно вырос ...
Бернхард Валлант

Хорошо, я отправил это в их список рассылки, но нашел ответ и сам ... См. Ниже!
Бернхард Валлант

ре. интроспекция файла db - я написал сценарий для анализа файлов dump.rdb и вывода файла csv, сообщающего приблизительную память, используемую каждым ключом. См github.com/sripathikrishnan/redis-rdb-tools
Sripathi Кришнан


1

Я обычно предпочитаю ключевой метод выборки для устранения таких сценариев.

redis-cli -p 6379 -n номер_базы --bigkeys

Например:-

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


Почему это метод «ключевой выборки»? Я считаю его очень ограниченным, поскольку он показывает только верхушку айсберга.
MrR

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.