Материал проходит вычитку — возможны неточности.
Урок 28 из 118

Профиль разовой программы

Профиль сервера был снят, но разовая утилита миграции сотрудников не держала 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 даёт профиль
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Как снять профиль с разовой CLI-утилиты без HTTP-сервера?

Вопрос 2 из 3

Зачем runtime.GC() перед WriteHeapProfile?

Вопрос 3 из 3

Какие три источника профилей есть в Go?

Итоги

Три источника профилей: живой сервер (), разовая программа через runtime/pprof, бенчмарк с -cpuprofile/-memprofile. Один и тот же формат, один инструмент чтения.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки