Профиль разовой программы
Профиль сервера был снят, но разовая утилита миграции сотрудников не держала HTTP-сервер — отдать профиль по сети было некому. Миша снял его из кода: CPU — между запуском и остановкой, heap — одним вызовом.
для CLI-утилит и бенчмарков профили снимают из кода через runtime/pprof: CPU — между StartCPUProfile и StopCPUProfile, heap — через WriteHeapProfile, а бенчмарк сам умеет отдавать оба профиля.
CPU-профиль из кода
f, _ := os.Create("cpu.prof")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
runValidation()
Для программы, которая отработала и завершилась, net/http/pprof не годится — сервер некому держать. CPU-профиль снимается между StartCPUProfile и StopCPUProfile.
Heap-профиль
hf, _ := os.Create("heap.prof")
runtime.GC()
pprof.WriteHeapProfile(hf)
hf.Close()
Вызов runtime.GC перед снимком опционален — он убирает свежий мусор, чтобы профиль показывал живые объекты, а не всё, что ещё не собрано (вспомни (forced) из).
В обоих примерах ошибки os.Create, StartCPUProfile и WriteHeapProfile опущены для краткости; в реальном коде их проверяют, а для CPU-профиля StopCPUProfile вызывают до закрытия файла — данные пишутся в файл именно в StopCPUProfile.
Профили из бенчмарков
Третий путь — бенчмарки: go test -bench. -cpuprofile cpu.prof -memprofile mem.prof снимет оба профиля прямо во время прогона. Удобно для изолированных функций, где не нужен весь процесс.
Вы узнаете:
- почему
runtime.GCпередWriteHeapProfile - как
-cpuprofileна обычномgo testдаёт профиль
Проверьте себя
Как снять профиль с разовой CLI-утилиты без HTTP-сервера?
Зачем runtime.GC() перед WriteHeapProfile?
Какие три источника профилей есть в Go?
правильных ответов
Три источника профилей: живой сервер (), разовая программа через runtime/pprof, бенчмарк с -cpuprofile/-memprofile. Один и тот же формат, один инструмент чтения.
10 000 ₽ · 60 минут · онлайн