Был ли опыт оптимизации производительности систем или баз данных
Что проверяют
Умеете ли вы находить узкое место измерением, а не догадкой, и можете ли подтвердить результат цифрами. Следом спрашивают, чем именно мерили и что стало хуже в обмен на ускорение.
Как отвечать
Ответ строится на одном вашем реальном случае, по шагам:
- симптом и базовая линия: что было медленным и насколько, например p95 эндпоинта, время отчёта, загрузка CPU базы. Без исходной цифры результат ничего не значит;
- диагностика: для кода
cProfileилиpy-spy(снимает профиль с живого процесса без перезапуска), для памятиmemrayилиtracemalloc. Для базыEXPLAIN (ANALYZE, BUFFERS)в PostgreSQL, статистикаpg_stat_statements, лог медленных запросов, трассы в APM; - причина: называйте конкретно. Типичные для Python-бэкенда: N+1 в ORM, отсутствующий индекс,
OFFSETна глубоких страницах, построчные вставки вместо пачек, синхронный вызов внутриasync-обработчика, блокирующий event loop; - исправление:
select_relatedиprefetch_relatedв Django илиselectinloadв SQLAlchemy, индекс под конкретный запрос, keyset-пагинация,bulk_createилиCOPY, кэш в Redis с понятной инвалидацией, пул соединений; - результат и цена: цифры до и после тем же способом измерения и что вы отдали взамен: новый индекс замедлил запись, кэш добавил риск устаревших данных.
Цифры берите свои. Если помните только порядок величины, так и скажите: «запрос шёл около 4 секунд, после индекса стал укладываться в 100 мс». Если серьёзной оптимизации в работе не было, расскажите честно про меньший случай: учебный проект, где вы нашли N+1 по логу запросов, или разбор чужого инцидента. Добавьте, с чего бы начали на незнакомой системе. Такой ответ сильнее выдуманной истории, которая разваливается на первом уточнении.
Где спотыкаются
Называют круглое «ускорили на 50%» без базовой линии и метода замера. Интервьюер спрашивает, какой перцентиль и на какой нагрузке, и ответа нет.
Начинают с кэша. Кэш прячет медленный запрос, но добавляет инвалидацию и холодный старт, а причина остаётся.
Оптимизируют по интуиции: переписывают цикл на генератор, когда почти всё время уходит на ожидание базы. Профилировщик показал бы это за минуту.