У меня есть один сервер, на котором запущено приложение Django, обслуживаемое gunicorn, и очередь задач Celery.
Гуникорндокументы предполагают(2 x $num_cores) + 1 — количество рабочих процессов по умолчанию.
Сельдерей документыпокажите, что число рабочих процессов Celery по умолчанию равно 1 x $num_cores.
И оба предлагают экспериментировать, чтобы найти правильное число.
Мой вопрос: какое правило будет хорошим для запуска Gunicorn и Celery на одной машине? На восьмиядерной машине мне следует начать с 17 Gunicorn и 8 Celery worker? Или имеет смысл начать, скажем, с 9 Gunicorn и 4 Celery worker?
Если это поможет, система привязана к процессору.
решение1
Любая настройка производительности часто является скорее успокоением, чем жесткими и быстрыми правилами. Недавно мне пришлось сделать что-то похожее с моим приложением Django, которое кто-то решил использовать не по назначению. Когда вы запускаете Gunicorn и Celery на одной машине, вам в идеале следует начать с более сбалансированного подхода, а не максимизировать рабочие процессы Gunicorn. Вот мой подход:
Рабочие Gunicorn:
- Начните с немного меньшего количества рабочих Gunicorn, используя формулу: 2 * $num_cores + 1
- Для 8-ядерной машины вы можете начать с 8-12 рабочих узлов Gunicorn.
- Причина этого в том, что вы хотите убедиться, что для рабочих процессов Celery еще остались ресурсы ЦП, поскольку задачи Celery могут быть ресурсоемкими.
Работники сельдерея:
- Вы можете использовать «рекомендуемое» количество работников Celery.
- Его можно определить как 1 * $num_cores
- Например, для 8-ядерной машины вы можете начать с 8 рабочих процессов Celery.
Таким образом, на 8-ядерной машине хорошая стартовая конфигурация может выглядеть так:
- Gunicorn: 8-12 рабочих
- Сельдерей: 8 рабочих
Цель состоит в том, чтобы не перегружать рабочие процессы Gunicorn и оставить ресурсы ЦП хотя бы для рабочих процессов Celery.