Как запустить в celery множество параллельных тасков и не умереть?
Есть сервис мониторинга на Django. Он что-то там проверяет по расписанию. Проверки запускаются через celery. Проблема возникает в моменты, когда многие цели одновременно зависают. У задач celery есть таймаут 30 секунд. При проверках раз в пять минут достаточно десятка зависших тасков, чтобы забить всю очередь.
Запускать много воркеров celery мы не можем, т.к. система с пятью воркерами уже не влезает на виртуалку с 1 ГБ памяти.
Как можно решить эту проблему? Как-то радикально снизить потребление памяти воркерами?
Не получится. Это же мониторинг состояния сайтов. При сетевых проблемах сайты перестают отвечать — всё, таски зависли. Таймаут 30 секунд — это перебор, конечно, но не хотелось бы его делать меньше 10 секунд, иначе при малейших проблемах будет множество ложных срабатываний.
1) Таймаут в 30 секунд кажется лишним.
Ну реально, какой пользователь будет ждать 25 секунд пока грузится сайт? О_о
Срезаем до 10 секунд таймаут
2) Отрезаем ложные срабатывания
Как вариант - немного уменьшить чувствительность мониторинга - например сигнализировать если провалились последние две проверки. Это позволит не дергаться, если проблемы временные и решились быстро.
3) Самое логичное - вынести воркеров на отдельную виртуалку.
Вообще вся эта тема очень хорошо ложится не на celery, а на что-то типа tornado или aio, либо async/await в Python >= 3.6. Там нету зависания "заданий" на уровне IO (запроса к сайту с целью промониторить).