Назад | Перейти на главную страницу

Сельдерей с Upstart - неожиданно умирают процессы

Когда я запускаю Celery с Upstart, через некоторое время дочерние или основные процессы умирают без каких-либо следов.

Я использую сценарий Upstart (/etc/init/celery):

description "celery"

start on runlevel [2345]
stop on runlevel [!2345]

kill timeout 20
# console log
setuid ***
setgid ***

script
chdir /opt/***/project/
exec /opt/***/virtualenvs/***/bin/python manage.py celery worker --settings=settings.staging -B -c 4 -l DEBUG
end script

respawn

При запуске той же команды без выскочки (запуск вручную exec часть) все работает нормально.

С respawn строфа, главный процесс умрет и возродится, пока потерянные дочерние процессы все еще существуют, что приведет к переполнению памяти. Без него процессы просто исчезнут, пока не останутся рабочие.

Celery порождает главный процесс и рабочие процессы (в данном случае 4 из них). Я также пробовал запускать его с eventlet вместо многопроцессорности (1 мастер, 1 дочерний процесс), но результаты аналогичны.

Кто-нибудь сталкивался с таким поведением раньше?


Обновить:


Обновление2:

С помощью except fork казалось, что обработка перестала умирать, но при попытке остановить или перезапустить задание просто зависает.

Решением было не запускать Celery beat вместе с рабочим (удаление -B часть из команды exec).

По-видимому, это был «лишний» процесс, который как-то все испортил.

Вот последний сценарий, который у меня получился:

description "celery"

start on started postgresql
stop on runlevel [!2345]

kill timeout 20
setuid ***
setgid ***
respawn

chdir /opt/***/project/
exec /opt/***/virtualenvs/***/bin/python manage.py celery worker --settings=settings.staging -c 4 -l DEBUG

И бег celery beat по отдельности:

description "celerybeat"

start on started celery
stop on stopped celery

setuid ***
setgid ***
respawn

chdir /opt/***/project/
exec /opt/***/virtualenvs/***/bin/python manage.py celery beat --settings=settings.staging -l DEBUG

С помощью chdir внутри script предложение совершенно неверно, и это означает, что вы не можете понять самую основную идею выскочки (это не оскорбление). (В качестве примечания, exec ключевое слово просто бесполезно, но не вредит).

Это очень важная идея для понимания того, как работает выскочка. Upstart пытается определить, какой процесс из процессов, порожденных script stanza - это фактический демон этой службы. Затем он использует этот процесс, чтобы определить, выполняется ли это задание, остановлено, завершилось неудачно или что-то еще. По этой причине крайне важно убедиться, что процесс идет правильно.

Алгоритм определения процесса очень простой, это зависит от expect строфа. expect fork означает "возьми вторую вилку в script строфа ", expect daemon - то же самое, но третий.

Теперь, используя chdir внутри script означает, что он вызывает фактическое /bin/chdir двоичный, и это считается отдельной вилкой. Что вам нужно сделать, так это переместить его за пределы script строфа и чем играть с expect строфы, пока вы не поймете это правильно. Вы можете проверить, правильно ли вы поняли, сравнив вывод initctl status celery против ps. PID должны совпадать.