Платформа API-безопасности · 2025–2026
Утечка памяти в Go-компоненте
Проблема
Компонент распределённой инсталляции в Kubernetes неограниченно рос по памяти под нагрузкой и получал OOM kill по достижении лимита. Воспроизвести можно было только в кластере: развернуть многокомпонентный стенд, подать нагрузку, ждать. Цикл проверки — часы, поэтому гипотезы разработки проверялись медленно и по одной.
Анализ
Свернул кластерную инсталляцию в локальный docker-compose, сохранив то, что влияет на поведение памяти: лимиты контейнеров и переменные окружения аллокатора. Критерий воспроизведения задал измеримо и заранее — превышение лимита за считанные минуты под нагрузкой, а не «вроде растёт». Нагрузку подал профилем с крупными телами запросов, на них утечка и проявлялась. Дальше профили кучи через pprof, снятые в динамике и сопоставленные между собой: так отделяется «компонент много аллоцирует» от «компонент не отдаёт».
Решения
Свёл профиль к конкретному месту в коде и отдал владельцу компонента отчёт с точечными рекомендациями по этому месту, а не «поищите утечку». Правку вносил владелец кода — это правильное разделение: воспроизведение, локализация и подтверждение мои.
Проверка
Ретест на том же стенде тем же профилем, сравнение до и после по тому же критерию. Цикл проверки гипотез сократился с часов на кластере до минут на ноутбуке, а репро-стенд остался активом: регрессию по этому месту можно проверить в любой момент.