2013-09-23 1 views
0

TL; DR:сельдерей над Beanstalk брокера: задержки в выполнении задачи

Я выстраиваются в очередь короткие и простые задачи celeryd через beanstalkd брокера, используя task.delay (например myNotifyTask.delay() вместо myNotifyTask()). Несмотря на то, что значение задержки предполагается немедленным, задачи занимают около часа, чтобы выполнить (когда они должны занимать всего несколько секунд).

Из моих наблюдений, кажется, задачи действительно получены в beanstalkd, но остаются в состоянии ready в течение очень долгого времени. Это происходит, несмотря на установку CELERYD_CONCURRENCY = 8. При просмотре журналов beanstalkd я получаю ошибки около read(): Connection reset by peer, но задачи в конечном итоге выполняются.

Любые идеи, почему это может произойти?

Подробнее ниже.


Использование beanstalk версии 1.4.6, сельдерей 3.0.20.

В журнале Beanstalk записи выглядят следующим образом:

/usr/bin/beanstalkd: prot.c:709 in check_err: read(): Connection reset by peer 

При попытке использовать celery для диагностики проблем:

> celery -b "beanstalk://beanstalk_server:11300" status 
Error: No nodes replied within time constraint. 

При подключении к beanstalkd через telnet, я вижу current-jobs-ready: 343, которая предполагает работу застряли в состоянии ready (не delayed). Вот полный выход:

> telnet localhost 11300 
stats 
OK 850 
--- 
current-jobs-urgent: 343 
current-jobs-ready: 343 
current-jobs-reserved: 0 
current-jobs-delayed: 0 
current-jobs-buried: 0 
cmd-put: 2484 
cmd-peek: 0 
cmd-peek-ready: 7 
cmd-peek-delayed: 1 
cmd-peek-buried: 1 
cmd-reserve: 0 
cmd-reserve-with-timeout: 52941 
cmd-delete: 2141 
cmd-release: 0 
cmd-use: 2485 
cmd-watch: 42 
cmd-ignore: 40 
cmd-bury: 0 
cmd-kick: 0 
cmd-touch: 0 
cmd-stats: 497655 
cmd-stats-job: 2141 
cmd-stats-tube: 3 
cmd-list-tubes: 2 
cmd-list-tube-used: 1 
cmd-list-tubes-watched: 52954 
cmd-pause-tube: 0 
job-timeouts: 0 
total-jobs: 2484 
max-job-size: 65535 
current-tubes: 3 
current-connections: 6 
current-producers: 2 
current-workers: 2 
current-waiting: 1 
total-connections: 502958 
pid: 989 
version: 1.4.6 
rusage-utime: 45.778861 
rusage-stime: 56.595537 
uptime: 2489047 
binlog-oldest-index: 0 
binlog-current-index: 0 
binlog-max-size: 10485760 

И вскоре после того, как:

stats-tube celery 
OK 257 
--- 
name: celery 
current-jobs-urgent: 348 
current-jobs-ready: 348 
current-jobs-reserved: 0 
current-jobs-delayed: 0 
current-jobs-buried: 0 
total-jobs: 2739 
current-using: 3 
current-watching: 1 
current-waiting: 0 
cmd-pause-tube: 0 
pause: 0 
pause-time-left: 0 

ответ

0

Оказывается, проблема заключалась в том, что одна задача сельдерей был очень длинный тайм-аут, который вызвал его работника ждать в течение длительного времени. Несмотря на то, что параллелизм был включен, тайм-ауты были слишком длинными, и задачи продолжали накапливаться в beanstalk (без использования сельдерея, поскольку все рабочие в конечном итоге заняты).