Что такое goroutine leak в Go и как найти утечку горутин?

Что такое goroutine leak в Go и как найти утечку горутин? Go concurrency goroutine leak — это горутины, которые не завершают работу причина: блокировка на канале, mutex или операции I/O нет механизма завершения через…

Короткий ответ

Что ответить на собеседовании

Что такое goroutine leak в Go и как найти утечку горутин? Go concurrency goroutine leak — это горутины, которые не завершают работу причина: блокировка на канале, mutex или операции I/O нет механизма завершения через context или done-channels рост числа горутин постепенно увеличивает потребление памяти и CPU диагностика: профилирование pprof с получением stack traces горутин контроль числа активных горутин через runtime.NumGoroutine() применение инструментов поиска deadlock и каналов с timeout TOTAL: 7 bullets

Подробный разбор

Ответ с пояснениями

Что такое goroutine leak в Go и как найти утечку горутин? Go concurrency

  • goroutine leak — это горутины, которые не завершают работу
  • причина: блокировка на канале, mutex или операции I/O
  • нет механизма завершения через context или done-channels
  • рост числа горутин постепенно увеличивает потребление памяти и CPU
  • диагностика: профилирование pprof с получением stack traces горутин
  • контроль числа активных горутин через runtime.NumGoroutine()
  • применение инструментов поиска deadlock и каналов с timeout TOTAL: 7 bullets

Подробный ответ

Основной ответ

Goroutine leak в Go возникает тогда, когда горутина продолжает выполняться или "зависает" и не имеет возможности завершиться. В результате количество горутин может постоянно расти, вызывая утечку ресурсов. Обычно проблема связана с блокировками, ожиданием данных в каналах или событиями, которые так и не наступают.

Ключевые моменты

  • Причины утечки: к ним относятся ожидание данных из каналов или внешних ресурсов, которые не будут получены, бесконечные циклы без выхода, не отменённые контексты (context.Context), а также отсутствие обработки ошибок в конкурентном коде.
  • Диагностика: для проверки применяют команды runtime.Stack и инструменты профилирования (pprof), собирающие текущие стэки горутин. По ним можно определить место, в котором выполнение "зависло". В production-среде профили удобно получать через HTTP expose, например /debug/pprof/goroutine, а затем исследовать с использованием go tool pprof.
  • Профилактика: следует применять context.Context с таймаутом или отменой, корректно закрывать каналы и тщательно проектировать синхронизацию. Для ограничения ожидания также используют таймауты или select с default.

Практический контекст

В прикладных системах — например, при выполнении сетевых запросов или работе воркеров — goroutine leak нередко выражается в постепенном увеличении потребления памяти и CPU. Используя pprof и изучая стэки, можно быстро обнаружить участки с "зависшими" горутинами, после чего исправить логику ожидания или добавить timeout. Для Golang 1.18+ это стандартный способ повысить устойчивость сервисов при нагрузке.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку