#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
показывает эту информацию