Производительность
Горячие пути: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает решение, которое ты принимаешь посреди инцидента с открытым профилем — не определение для заучивания, а диагноз, на котором надо остановиться прежде, чем потратить спринт на неверный фикс.
Убедись, что связываешь юнит воедино: читаешь широкий лист как симптом, классифицируешь его в одну из форм, находишь место фикса по цепочкам parent/child и учитываешь ограничения, которые добавляет production — счётчики, хвостовую задержку и security-гейт.
Flame graph показывает renderTemplate с 28% self-time. Профиль аллокаций затем показывает внутри fmt.Sprintf на 62% байт аллокаций. Два инженера хотят сменить шаблонизатор. Как читать правильно?
Два широких листа выглядят одинаково на flame graph. perf stat показывает лист A с IPC 3.0 и cache-miss rate 1%, а лист B с IPC 0.4 и cache-miss rate 18%. Чем различаются фиксы?
json.Marshal на 28% CPU. В одном сервисе у него один доминирующий родитель (логгер запросов); в другом — двадцать тонких родителей (хендлеры). Куда относится фикс в каждом случае?
Lock-free массив счётчиков использует atomic add с пер-тред индексами, но под нагрузкой IPC падает до 0.42, cache-miss rate достигает 76%, а пропускная способность ухудшается с ростом числа потоков. Диагноз и фикс?
Node flame graph показывает доминирующие фреймы InterpreterCallStub в функции, которая должна быть горячей, и всплески задержки, не коррелирующие с трафиком. После переписывания на 'лучший алгоритм' ничего не улучшается. Почему и каков настоящий фикс?
Инженер ускоряет горячий путь сравнения токена в 3 раза, добавив early-exit ветку на первом несовпавшем байте. Фрейм сузился, p50 улучшился. Почему это всё равно неправильно?
Юнит — это одно дерево решений: широкий лист называет симптом, а не причину; классифицируй его в форму (CPU, аллокация, кеш, лок, syscall, JIT-деопт или случаи, видимые только через железо — false sharing, native-bridge); находи место фикса по parent chain (один вызывающий против многих) и child chain (работа здесь против на уровень ниже); тянись к аппаратным счётчикам и TMA, когда CPU-bound и memory-bound выглядят одинаково; и проводи любое изменение constant-time или security-чувствительных путей через ревью. Сначала диагноз, потом фикс одной вещи, докажи его diff’ом профиля — и следи за хвостовой задержкой, а не только за средним.