Redis: OOM command not allowed when used memory exceeds maxmemory
Сообщение об отказе записи при исчерпании памяти означает, что Redis достиг заданного предела и не может ничего вытеснить: политика запрещает. Служба работает и отвечает на чтение — это защита данных, а не сбой.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Политика вытеснения запрещает удаление
При значении
noevictionRedis не удаляет ключи сам и отказывает в записи. Это правильный выбор для хранилища данных и неправильный для кеша. -
Предел памяти не задан, и упор произошёл в предел службы
Без
maxmemoryRedis растёт, пока не упрётся в предел контрольной группы, и тогда его убивает ядро — это хуже отказа в записи. -
Ключи без срока жизни
Политика вытеснения по сроку не может освободить память, если срок не задан ни у одного ключа.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Потребление, предел и объём вытесненного.
redis-cli info memory | head -10Предел и политика вытеснения.
redis-cli config get maxmemory maxmemory-policyПредел памяти службы.
systemctl show redis-server -p MemoryMax -p MemoryPeakРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- При значении
noevictionRedis не удаляет ключи сам и отказывает в записи. Это правильный выбор для хранилища данных и неправильный для кеша.
- Как проверить
-
Посмотрите предел и политику.
redis-cli config get maxmemory maxmemory-policy redis-cli info memory | head -8
- Как исправить
-
Для кеша выберите политику вытеснения по давности использования. Для хранилища данных поднимайте предел и следите за ростом.
redis-cli config set maxmemory-policy allkeys-lru
- Почему происходит
- Без
maxmemoryRedis растёт, пока не упрётся в предел контрольной группы, и тогда его убивает ядро — это хуже отказа в записи.
- Как проверить
-
Посмотрите оба предела.
redis-cli config get maxmemory systemctl show redis-server -p MemoryMax -p MemoryPeak
- Как исправить
-
Задайте
maxmemoryниже предела службы: тогда Redis будет управлять памятью сам, а не погибать от ядра.
- Почему происходит
- Политика вытеснения по сроку не может освободить память, если срок не задан ни у одного ключа.
- Как проверить
-
Посмотрите статистику по срокам.
redis-cli info keyspace
- Как исправить
- Задавайте срок жизни ключам кеша либо используйте политику, которая вытесняет любые ключи.
Пример вывода
Предел достигнут, вытеснение запрещено. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
redis-server[1200]: # WARNING: OOM command not allowed when used memory > 'maxmemory'
app[4100]: error: OOM command not allowed when used memory > 'maxmemory'.
Связанные ошибки
- Failed with result 'oom-kill' Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
- Redis: MISCONF Errors writing to the RDB snapshot Redis отказывается принимать запись: не удалось сохранить снимок на диск. Место, права, настройка overcommit.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Elasticsearch: служба падает из-за размера кучи JVM Размер кучи больше доступной памяти или больше предела службы: падение при старте или под нагрузкой.
- Hardware Error / EDAC: ошибки памяти в журнале Ядро сообщает об ошибках памяти. Что считать безобидным, а что поводом менять модуль.
- Java-служба: OutOfMemoryError и куча Служба на JVM падает с нехваткой памяти: размер кучи, предел контрольной группы, дампы кучи.
- MySQL убит из-за памяти: буферный пул больше доступной памяти MySQL падает сразу после старта или через минуты: размер innodb_buffer_pool_size превышает память машины.
- RabbitMQ: тревога по свободному месту блокирует отправителей Брокер перестаёт принимать сообщения: сработала тревога по диску или памяти. Как снять и что настроить.
Где встречается чаще всего
Источники
- Документация Redis: политики вытеснения
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено при maxmemory 16 МБ и политике noeviction.