Ответ вслух Middle Горутины и планировщик GMP обновлено

Утечки горутин

Вопрос

Что такое утечка горутин, откуда она берётся и как вы её находите и предотвращаете?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Утечка горутин это горутина, которая заблокировалась навсегда: она держит стек и всё, на что ссылается, и GC её не соберёт.

Что должно прозвучать в ответе

  • Горутина, которая никогда не завершится, держит стек и всё, на что ссылается

  • Причины: блокировка на канале без читателя/писателя, 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 ошибок.