Сколько воркеров ставить и почему
Вопрос
Как вы выбираете число воркеров и тип воркеров для Python-сервиса?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Характер нагрузки: CPU, ожидание I/O, длительность запросов
Sync-воркеры: отправная точка 2*CPU+1, ограничение памятью
Потоки (gthread) или async при большом ожидании I/O
Нагрузочный тест и метрики: латентность, очередь, CPU, память
Таймауты, max_requests против утечек, graceful shutdown
Горизонтальное масштабирование инстансами
Что могут спросить следом
- Что такое
max_requestsиmax_requests_jitter? - Чем ограничено число воркеров сверху?
Разбор
Образцовый ответ: «Сначала смотрю, на что уходит время запроса. Если это короткая работа с базой и немного CPU, беру sync-воркеры gunicorn, отправная точка 2 * CPU + 1, и ограничиваю сверху памятью: каждый воркер это отдельный процесс с копией приложения. Если запросы долго ждут внешние сервисы, процессов понадобится слишком много, тогда беру потоки (gthread) или асинхронный стек на uvicorn, где один процесс держит много ожиданий; для uvicorn процессов обычно около числа ядер. Потом подтверждаю выбор нагрузочным тестом: смотрю p95 латентности, загрузку CPU, память, растёт ли очередь соединений. Обязательно ставлю таймауты на воркер и на все внешние вызовы, max_requests с джиттером для защиты от утечек памяти, корректное завершение при деплое. Дальше масштабирую горизонтально: больше подов или инстансов за балансировщиком».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.