pprof: профиль сервера
Бенчмарк отвечал за одну функцию, а тормозил весь сервер. Миша подключил pprof к «Полке» и снял профили с живого процесса, не трогая код; Сергей напомнил, что профили раскрывают стеки и имена функций.
профилирование встроено в стандартную библиотеку: пустой импорт net/http/pprof вешает на сервер страницу профилей, а снять CPU- или heap-профиль можно без изменения кода.
Подключение
import (
"net/http"
_ "net/http/pprof"
)
Пустой импорт регистрирует обработчики на дефолтном мультиплексоре. После этого на /debug/pprof/ доступен список профилей: goroutine, heap, allocs, threadcreate, block, mutex и другие. Два главных — CPU и heap.
Снять профиль
$ go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30
$ go tool pprof http://localhost:8080/debug/pprof/heap
CPU-профиль: профилировщик 30 секунд сэмплирует, в какой функции сейчас каждая горутина, и отдаёт профиль. Heap — снимок кучи на момент запроса. Профили блока и мьютекса по умолчанию пустые — их включают заранее через runtime.SetBlockProfileRate и runtime.SetMutexProfileFraction.
Профиль как инструмент
Профиль отвечает на вопрос «где горит» без гадания: выросла задержка — CPU-профиль; растёт память — heap. Профиль всегда показывает, что реально происходит, а не что ты думаешь про свой код — поэтому профилируют до оптимизации, а не после. Помни про приватность: /debug/pprof раскрывает стеки, аллокации и имена функций — не выставляй его публично, вешай на localhost или закрывай авторизацией.
Вы узнаете:
- как включить block и mutex-профили
- как защитить
/debug/pprof - как снять pprof-профиль в CI на нагрузочном тесте
Проверьте себя
Как подключить профилирование к серверу без правки кода?
Почему block/mutex-профили по умолчанию пусты?
Можно ли выставлять /debug/pprof публично?
правильных ответов
net/http/pprof — профили на живом сервере без правки кода: CPU-профиль сэмплируется, heap — снимок. Блок и мьютекс включаются заранее.
10 000 ₽ · 60 минут · онлайн