Оптимизация медленного 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 сценарии.