Подтвердить что ты не робот

Профилирование использования памяти Redis

Есть ли какой-нибудь инструмент, который я могу использовать, чтобы узнать, сколько памяти занимает Редис?

4b9b3361

Ответ 1

Попробуйте найти INFO команду. Я также рекомендую прочитать эту статью об использовании памяти Redis, где вы можете найти дополнительную информацию о том, сколько памяти занимает определенные структуры данных.

Ответ 2

См. https://github.com/sripathikrishnan/redis-rdb-tools

Rdb Tools сообщает о памяти, используемой каждой парой key = value в базе данных. Он анализирует файл дампа redis и создает файл csv. Каждая строка в этом CSV файле является ключом, а в столбцах содержится память, потребляемая этим ключом.

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

Точка, о которой нужно помнить, - информация об использовании памяти является приблизительной. Основываясь на моих экспериментах, я обнаружил, что фактическое использование памяти примерно на 15% выше, чем указано в этом инструменте.

Ответ 3

Redis будет выводить использование памяти каждые 5 секунд, если для параметра loglevel установлено значение verbose или debug.

Например, это вывод в моей почти пустой базе данных:

[49523] 07 Apr 00:38:58 - DB 0: 2 keys (0 volatile) in 4 slots HT.
[49523] 07 Apr 00:38:58 - 1 clients connected (0 slaves), 924416 bytes in use

Вы можете видеть, что в базе данных есть 2 ключа и 1 подключенный клиент. В активном использовании используются 924416 байтов. Общее использование памяти (как показано в поле used_memory_rss, возвращаемом командой INFO) может быть немного выше (см. Документацию INFO для деталей).

Данные, хранящиеся в redis, очевидно, требуют памяти, но это не единственная управляемая причина использования памяти. С большим количеством настроенных баз данных, использование памяти увеличивается (в моей системе примерно на 450 байт на базу данных). Каждое соединение также использует память (в моей системе около 8 килобайт на соединение).

Ответ 4

Обратите внимание, что Redis получил встроенный анализатор памяти с версии 4. Использование:

"MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key"
  "MEMORY STATS                         - Show memory usage details"
  "MEMORY PURGE                         - Ask the allocator to release memory"
  "MEMORY MALLOC-STATS                  - Show allocator internal stats"

Ответ 5

См. https://github.com/gamenet/redis-memory-analyzer

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

Вы можете сканировать всеми или выбранными типами Redis, такими как "string", "hash", "list", "set", "zset" и использовать соответствующий шаблон, как вам нравится.

Также RMA пытается различать имена ключей по шаблонам, например, если у вас есть такие ключи, как "пользователь: 100" и "пользователь: 101", приложение выберет общий шаблон "user: *" на выходе, чтобы вы могли анализировать большую часть памяти проблемных данных в вашем экземпляре.

Ответ 6

Если вам также интересно, как распределяется эта память между вашими ключами, вы можете попробовать https://github.com/alexdicianu/redis_toolkit. Он работает только в том случае, если ваши клавиши следуют этому шаблону A: B, A: B: C или A: B: * и т.д. Очень полезно, если вы используете Redis как механизм кэширования объектов для CMS, например Wordpress или Drupal.

Вот пример.

$ ./redis-toolkit report -type memory -name NAME
+----------------------------------------+----------+-----------+----------+
|                     KEY                | NR  KEYS | SIZE (MB) | SIZE (%) |
+----------------------------------------+----------+-----------+----------+
| posts:*                                |      500 |      0.56 |     2.79 |
| post_meta:*                            |      440 |     18.48 |    92.78 |
| terms:*                                |      192 |      0.12 |     0.63 |
| options:*                              |      109 |      0.52 |     2.59 |

Ответ 7

Вы можете получить представление о памяти, используемой группами ключей, используя малоизвестную (и, возможно, измененную) команду DEBUG OBJECT.

В Ruby IRB вы можете попробовать это (предупреждение, будет читать каждый ключ, может занять некоторое время):

keys = $redis.keys;nil
map = Hash.new(0)
keys.each{|k| map[k.split(':').first] += $redis.debug("object", k).split[4].split(':')[1].to_i rescue 0};nil
map.sort_by{|x|x[1]}

Это покажет вам префикс ключа и агрегирует байты, занятые каждым префиксом. Redis на самом деле занимает гораздо больше памяти, чем сумма, но это даст вам относительную идею и позволит вам узнать, какой префикс ключа самый большой.

После этого вы можете получить все ключи для префикса с помощью $redis.keys( "prefix *" ) и использовать другие команды Redis для проверки каждого из них.