Утечки горутин
Вопрос
Что такое утечка горутин, откуда она берётся и как вы её находите и предотвращаете?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Горутина, которая никогда не завершится, держит стек и всё, на что ссылается
Причины: блокировка на канале без читателя/писателя, range по незакрытому каналу, нет отмены
Каждая горутина должна иметь понятный способ остановки: ctx, закрытие канала
Буферизованный канал на 1 для «ответа, который могут не забрать»
Поиск: рост runtime.NumGoroutine в метриках, pprof goroutine, goleak в тестах
Что могут спросить следом
- Как написать тест, который ловит утечку горутин?
- Почему time.After в select в цикле раньше считался проблемой?
Разбор
Утечка горутин это горутина, которая заблокировалась навсегда: она держит стек и всё, на что ссылается, и GC её не соберёт. Типичные причины: отправка в канал, из которого уже никто не будет читать (например, вызывающий ушёл по таймауту), range по каналу, который никто не закроет, бесконечный цикл без проверки ctx.Done(), забытый resp.Body.Close, который держит горутины транспорта. Правило: запуская горутину, я сразу знаю, как она закончится. Передаю context, закрываю каналы со стороны отправителя, для ответа «который могут не забрать» делаю буфер 1. Находить: метрика числа горутин в Prometheus (go_goroutines), которая растёт и не падает, затем pprof профиль goroutine с debug=2 показывает, где висят тысячи одинаковых стеков. В тестах goleak.VerifyNone(t) проверяет, что после теста не осталось лишних горутин.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.