TGViewer
Библиотека Go-разработчика | Golang Библиотека Go-разработчика | Golang @goproglib · 24.1K subscribers
Post #7309 2.73K
💻 Про детектор утечек горутин

Горутина утекает, когда блокируется на канале или локе, который никто никогда не освободит, и висит до конца жизни процесса. В Go 1.27 для таких случаев в runtime/pprof добавляют профиль goroutineleak.

Предложение приняли ещё в апреле, родом оно из Uber, оттуда же, откуда и популярная uber-go/goleak.

Главная идея в том, что детектор ездит на сборщике мусора. Горутина считается утёкшей, если канал или лок, на котором она стоит, недостижим ни из одной живой горутины, ни из тех, что живые могли бы разбудить. Разбудить её нечем, и GC помечает её как утечку. Отсюда же её главное отличие от goleak.

Профиль строит доказательство достижимости и работает на живом процессе без ложных срабатываний, тогда как goleak делает снимок на завершении теста и на проде путает реальные утечки с горутинами, которые просто ждут следующего запроса.

API крошечный. Никаких новых типов и функций, только профиль с именем goroutineleak, который читается обычными инструментами pprof.

Снять его можно четырьмя привычными способами:

• прямо из кода через pprof.Lookup("goroutineleak").WriteTo(...)

• в тесте по аналогии с VerifyNone

• по HTTP через net/http/pprof

• через go tool pprof.

Пока что профиль за флагом сборки, запускать нужно с GOEXPERIMENT=goroutineleakprofile, в релизе 1.27 флаг уберут.

Из-за правила «никаких ложных срабатываний» GC не трогает горутину, если её канал или лок всё ещё достижим. Но глобальная переменная или локали живой горутины могут держать этот канал достижимым ещё долго после того, как к нему реально кто-то обратится в последний раз. Такая горутина останется непомеченной. Всё, что профиль показывает, это настоящие утечки. Просто часть настоящих утечек он не покажет.

📍 Навигация: Вакансии • Задачи • Собесы

🐸 Библиотека Go-разработчика

#GoLive
  • 👍 7
  • ❤ 3
More from @goproglib
  1. Sep 26, 2026🔥 В Go 1.27 появился portable SIMD До этого SIMD-оптимизации в Go требовали архитектурног…
  2. Sep 25, 2026🤡🤡 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoGiggle
  3. Sep 25, 2026💡 Код работает. А data race уже есть В Go можно записать значение в одной горутине, прочи…
  4. Sep 23, 2026💥 TCP/IP: что происходит с данными в сети Когда Go-приложение отправляет данные по сети,…
  5. Sep 22, 2026🔴 Встроенные функции len, make, panic — встроенные функции Go, которые можно использовать…
  6. Sep 21, 2026🤩 Go с нуля: серия базовых шпаргалок Собрали путь от Hello, World! до goroutines, channel…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →