Django Celery Queue застревает
Я использую Celery/RabbitMQ для выполнения асинхронных задач с моим приложением django. Я только начал работать с сельдереем.
Задачи выполняются, и все работает отлично, как только я запускаю рабочий.
Проблема в том, что выполнение задач останавливается через некоторое время. Через пару часов, день или иногда пару дней. Я осознаю это только из-за последствий незавершенных задач. Затем я перезапускаю сельдерей, и все отложенные задачи выполняются, и все возвращается к нормальной жизни.
Мои вопросы:
- Как я могу отладить (с чего начать поиск), чтобы выяснить, в чем проблема?
- Как я могу создать механизм, который будет уведомлять меня сразу после начала проблемы?
Мой стек: Django 1.4.8 Celery 3.1.16 RabbitMQ Supervisord
Спасибо энди
1 ответ
(1) Если ваш сельдерей иногда застревает, вы можете использовать strace & lsof
чтобы узнать, по какому системному вызову он застрял.
Например:
$ strace -p 10268 -s 10000
Process 10268 attached - interrupt to quit
recvfrom(5,
10268 - пиджак из сельдерея, recvfrom(5
означает, что рабочий останавливается на получении данных из файлового дескриптора.
Тогда вы можете использовать lsof
чтобы проверить что 5
в этом рабочем процессе.
lsof -p 10268
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
......
celery 10268 root 5u IPv4 828871825 0t0 TCP 172.16.201.40:36162->10.13.244.205:wap-wsp (ESTABLISHED)
......
Это указывает на то, что работник застрял в TCP-соединении (вы можете увидеть 5u
в FD
колонка).
Некоторые пакеты Python, такие как requests
блокирует ожидание данных от однорангового узла, это может вызвать зависание работника сельдерея, если вы используете requests
пожалуйста, не забудьте установить timeout
аргумент.
(2) вы можете отслеживать размер очереди задач сельдерея в RabbitMQ, если она будет увеличиваться в течение длительного времени, возможно, работник сельдерея бастует.
Вы видели эту страницу:
https://www.caktusgroup.com/blog/2013/10/30/using-strace-debug-stuck-celery-tasks/