RabbitMQ: тревога по свободному месту блокирует отправителей
RabbitMQ защищает себя тревогами: при нехватке свободного места или памяти он перестаёт принимать сообщения от отправителей, но продолжает отдавать их получателям. Служба при этом активна, и по её состоянию проблему не увидеть.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Свободного места меньше порога
Порог по умолчанию равен объёму памяти машины: на сервере с 16 ГБ памяти брокер требует 16 ГБ свободного места.
-
Память превысила порог
При превышении доли памяти брокер тоже блокирует отправителей. Обычно это следствие разросшихся очередей.
-
Очереди без ограничения длины
Очередь без предела растёт, пока не съест память или диск. Это вопрос описания очередей, а не настройки брокера.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Активные тревоги брокера.
sudo rabbitmq-diagnostics alarmsСамые большие очереди.
sudo rabbitmqctl list_queues name messages | sort -k2 -rn | headМесто и память машины.
df -h /var/lib/rabbitmq && free -hРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Порог по умолчанию равен объёму памяти машины: на сервере с 16 ГБ памяти брокер требует 16 ГБ свободного места.
- Как проверить
-
Посмотрите тревоги и место.
sudo rabbitmq-diagnostics alarms 2>/dev/null df -h /var/lib/rabbitmq
- Как исправить
- Освободите место или уменьшите порог осознанно: он защищает от ситуации, когда брокеру некуда сбросить очереди.
- Почему происходит
- При превышении доли памяти брокер тоже блокирует отправителей. Обычно это следствие разросшихся очередей.
- Как проверить
-
Посмотрите память и очереди.
sudo rabbitmq-diagnostics memory_breakdown 2>/dev/null | head sudo rabbitmqctl list_queues name messages | sort -k2 -rn | head
- Как исправить
- Разберитесь с очередями: получатели должны успевать за отправителями. Поднятие порога лишь отодвигает предел.
- Почему происходит
- Очередь без предела растёт, пока не съест память или диск. Это вопрос описания очередей, а не настройки брокера.
- Как проверить
-
Посмотрите самые большие очереди.
sudo rabbitmqctl list_queues name messages memory | sort -k2 -rn | head
- Как исправить
- Задайте очередям предел длины или срок жизни сообщений: тогда рост будет ограничен по определению.
Пример вывода
Тревога по свободному месту блокирует отправителей. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
rabbitmq[1200]: disk resource limit alarm set. **********************************************************
rabbitmq[1200]: *** Publishers will be blocked until this alarm clears ***
app[4100]: warn: publish timeout after 30s (connection blocked)
Связанные ошибки
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- Failed with result 'oom-kill' Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
- RabbitMQ: узел не находит свои данные после смены имени машины Имя узла RabbitMQ включает имя хоста. После его смены брокер не видит прежние очереди.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Disk quota exceeded для службы Место на разделе есть, а запись отклоняется: исчерпана дисковая квота пользователя или группы.
- Docker: no space left on device при запуске контейнеров Раздел с /var/lib/docker заполнен образами и слоями. Как посчитать занятое и что можно удалить безопасно.
- Elasticsearch: индексы переведены в режим только для чтения Elasticsearch блокирует запись при нехватке места: пороги watermark. Как снять блокировку правильно.
- Elasticsearch: служба падает из-за размера кучи JVM Размер кучи больше доступной памяти или больше предела службы: падение при старте или под нагрузкой.
Где встречается чаще всего
Источники
- Документация RabbitMQ: тревоги по ресурсам
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено заполнением раздела с данными брокера.