К тренажеру
ВопросMediumproduction-backendРеальный собес

Оптимизация медленного Python-сервиса

Backend-сервис на Python стал медленным под нагрузкой. Как бы ты локализовал bottleneck и понял, что именно оптимизировать?

Короткий ответ

Сначала фиксируем симптом и SLO, затем смотрим метрики/логи/traces, локализуем слой: API, serialization, DB, queue, network или CPU. После этого воспроизводим локально и проверяем гипотезу измерением.

Полный разбор

Хороший ответ начинается не с "переписать на Go", а с вопроса: какой именно SLO нарушен и где это видно. Нужно посмотреть latency, error rate, throughput, saturation, очереди, пул соединений и ресурсы процесса. Дальше раскладываем путь запроса: API handler, serialization, внешние сервисы, база, очередь, CPU-bound код.

Если подозрение на базу, надо смотреть slow query log, EXPLAIN/EXPLAIN ANALYZE, индексы, selectivity, connection pool и объем результата. Если CPU-bound код, пригодятся профилировщик и проверка горячих функций. Если проблема в долгой фоновой задаче, можно выделить producer/consumer, batch size, backpressure и шардирование работы.

Важно закрывать цикл измерением: было N секунд, стало M секунд, не сломали correctness и не ухудшили другие метрики.

Теория

Production performance debugging - это цикл observe -> localize -> reproduce -> change -> measure. Без измерения оптимизация легко превращается в случайный refactor.

Типичные ошибки

  • Оптимизировать без SLO и baseline.
  • Сразу винить Python runtime, не проверив базу и внешние зависимости.
  • Не воспроизводить проблему и не проверять эффект изменения.

Как отвечать на собеседовании

  • Назови observability, EXPLAIN ANALYZE, profiling и connection pool.
  • Раздели CPU-bound, IO-bound и database-bound сценарии.