[БЕЗ_ЗВУКА] Еще один мощный инструмент, который предоставляет метод pprof,
это возможность снять стек-трейс всех горутин, которые есть в программе.
Давайте рассмотрим это на примере утечки горутин.
У нас есть уже знакомая вам структура Post,
есть функция getPost, которая в цикле делает слайс этих
структур и записывает их в канал, который нам приходит извне.
Есть handle, который запускает горутину для получения этих постов.
Но, обратите внимание, он не вычитывает их,
то есть в этом случае горутина начнет бесконечно ожидать,
пока из нее кто-то вычитает, и это может привести к утечке памяти.
В случае, если у вас вдруг программа может начать расти,
и вы подозреваете где-то утечку горутин, например,
у вас есть график, который показывает, что горутины растут,
можно попробовать снять стек-трейс всех горутин и узнать, чего они ждут.
Давайте попробуем это сделать.
Сначала дадим небольшую нагрузку, чтобы у нас натекло.
Итак, запустили.
Отлично!
Теперь я выполняю снятие трейса горутин,
то есть я обращаюсь к URL debug/pprof/goroutine с параметрами
debug=2, чтобы получить полный стек-трейс, и записываю их в файлик goroutines.
Запустили, он быстро все скачал.
Теперь открываем этот файл и смотрим.
Что-то там есть, есть, есть, есть, есть и — пошло,
посмотрите: абсолютно одинаковые записи,
прямо совсем одинаковые и очень много.
Что тут написано?
Горутина номер такой-то ожидает отправки в канал на какой-то строчке.
Это находится на строчке 24 и дальше, 29.
Что находится на строчке 29?
HandleLeak.
На строчке 29 как раз у нас вызов функций наших handleLeak.
А на строчке 24?
А на строчке 24 как раз канал,
как раз запись в канал, на котором эта горутина висит.
То есть используя полный стек-трейс, мы можем найти утечку опять-таки
без синтетической нагрузки, прямо во время реальной боевой нагрузки.