Мы сталкиваемся с проблемой с Pineton Celery (который использует многопроцессорность), где большие периодические (запланированные) задачи потребляют огромное количество памяти для коротких всплесков времени, но поскольку рабочий процесс живет в течение всего жизненного цикла пула (MAX_TASKS_PER_CHILD=None
), память не является сборкой мусора (то есть, она является «высокой водой»).Многопроцессорность: нижняя часть вилки?
(Эта проблема еще больше усугубляется Heroku, который видит большую, постоянное количество выделенной памяти и превращает его в своп, что снижает производительность.)
Мы обнаружили, что, установив MAX_TASKS_PER_CHILD=1
, мы раскошелиться новый процесс (экземпляр работника сельдерея) после каждой задачи, а память - правильно собранный мусор. Милая!
Однако есть много статей, которые предлагают одно и то же решение, но я не определил никаких недостатков. Каковы потенциальные недостатки в открытии нового процесса после каждой задачи?
Моих догадки будут:
1. накладные расходы CPU (но, вероятно, крошечных количество)
2. Потенциальные ошибки при разветвлении (но я не могу найти никакой документации по этому вопросу)