Нахождение потребления памяти каждой БД redis

#memory #redis

#память #redis

Вопрос:

Проблема

Один из моих клиентов Python Redis завершается сбоем со следующим исключением:

redis.исключения.Ошибка ответа: ошибка Redis настроена на сохранение снимков базы данных RDB, но в настоящее время не может сохраняться на диске. Команды, которые могут изменять набор данных, отключены. Пожалуйста, проверьте журналы Redis для получения подробной информации об ошибке.

Я проверил компьютер redis, и, похоже, ему не хватает памяти:

free

              total       used       free     shared    buffers     cached
Mem:          3952       3656        295          0          1          9
-/  buffers/cache:       3645        306
Swap:            0          0          0
  

top

 top - 15:35:03 up 14:09,  1 user,  load average: 0.06, 0.17, 0.16
Tasks: 114 total,   2 running, 112 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.2 st
KiB Mem:   4046852 total,  3746772 used,   300080 free,     1668 buffers
KiB Swap:        0 total,        0 used,        0 free.    11364 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME  COMMAND
 1102 root      20   0 3678836 3.485g    736 S   1.3 90.3  10:12.53 redis-server
 1332 ubuntu    20   0   41196   3096    972 S   0.0  0.1   0:00.12 zsh
  676 root      20   0   10216   2292      0 S   0.0  0.1   0:00.03 dhclient
  850 syslog    20   0  255836   2288    124 S   0.0  0.1   0:00.39 rsyslogd
  

Я использую несколько десятков БД Redis в одном экземпляре Redis. Каждая БД обозначается числовыми идентификаторами, присвоенными redis-cli , например:

 $ redis-cli -n 80
127.0.0.1:6379[80]>
  

Как я узнаю, сколько памяти потребляет каждая БД, и каковы самые большие ключи в каждой БД?

Ответ №1:

Как я узнаю, сколько памяти потребляет каждая БД, и каковы самые большие ключи в каждой БД?

Вы НЕ МОЖЕТЕ получить используемую память для каждой БД. С INFO помощью command вы можете получить только полностью использованную память для экземпляра Redis. Redis записывает вновь выделенный объем памяти каждый раз, когда он динамически выделяет некоторую память. Однако он не выполняет такую запись для каждой БД. Кроме того, в нем нет записи для самых больших ключей.

Обычно вы должны настроить свой экземпляр Redis с maxmemory maxmemory-policy помощью and (т.е. Политики удаления при достижении maxmemory).

Ответ №2:

Вы можете написать какой-нибудь sh-скрипт, подобный этому (показывать количество элементов в каждой БД):

 #!/bin/bash
max_db=501

i=0

while  [ $i -lt $max_db ]
do
echo "db_nubner: $i"
redis-cli -n $i dbsize
i=$((i 1))
done
  

Пример вывода:

 db_nubner: 0
(integer) 71
db_nubner: 1
(integer) 0
db_nubner: 2
(integer) 1
db_nubner: 3
(integer) 1
db_nubner: 4
(integer) 0
db_nubner: 5
(integer) 1
db_nubner: 6
(integer) 28
db_nubner: 7
(integer) 1
  

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

Комментарии:

1. redis-cli info keyspace показывает эту информацию