Redis быстро заполняет память, работает --bigkeys освобождает ее - PullRequest
1 голос
/ 16 января 2020

Месяц go, неожиданно Redis начал быстро заполнять память сервера. Чтобы решить проблему, мы запустили redis-cli --bigkeys и, к нашему удивлению, вся использованная память была освобождена.

У нас есть кластер из 6 узлов, 3 мастера и 3 подчиненных, каждый из базы данных мастеров около 15 ГБ. Каждый из узлов хранится в выделенном ящике по 64 ГБ каждый. Redis заполняет всю память 64 ГБ два раза в день. У нас есть cron, запускающий redis-cli --bigkeys два раза в день для освобождения используемой памяти.

В чем может быть причина?

Спасибо.

1 Ответ

1 голос
/ 17 января 2020

Звучит так, как будто вы получаете OOM command not allowed ошибок, если вы не запускаете redis-cli --bigkeys два раза в день.

В этом случае у вас, вероятно, много и / или больших клавиш с EXPIRE, которые постоянно добавляются , Ключи с истекшим сроком хранения удаляются из памяти:

  • Пассивно: когда вы пытаетесь получить к нему доступ и обнаруживается, что срок действия ключа истек. Вот как redis-cli --bigkeys помогает вам , он вызывает пассивное удаление по всему пространству клавиш.
  • Активно: каждые 100 мс он пытается удалить из памяти ключи с истекшим сроком действия в случайном порядке , никогда не тратя на это больше 1 мс за цикл, пока не оценивается, что истекло менее 25% ключи остаются. Логика c не такая уж тривиальная, см. activeExpireCycle .

Так что все это указывает на то, что активное истечение срока не может наверстать упущенное в вашем случае.

Из вашего комментария maxmemory=0 и maxmemory-policy=noeviction. Возможно, вы захотите установить значение maxmemory и от maxmemory-policy=noeviction до volatile-ttl (удалите ключ с ближайшим временем истечения).

Что это делает, когда команда записи обнаруживает, что вы превысили maxmemory, она будет пытаться освободить место для нового ключа в соответствии с политикой. Политика volatile-ttl будет сначала удалять все оставшиеся ключи с истекшим сроком действия. См. Evict. c.

Вы также можете увеличить частоту фоновых задач, чаще чистить устаревшие ключи, см. Hz в redis.conf . Вы можете удвоить его до 20.

По умолчанию для "hz" установлено значение 10. Увеличение значения будет использовать больше ресурсов ЦП, когда Redis находится в режиме ожидания, но в то же время сделает Redis более отзывчивым, когда многие ключи истекают одновременно, и время ожидания может быть обработано с большей точностью.

Кроме того, activedefrag = yes может помочь, см. здесь .

Существует новый параметр active-expire-effort redis.conf, который позволит вам вкладывать больше ресурсов процессора в active-expire, но он недоступен в последней стабильной версии (5.0.7).

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

...