Пакет net/http/pprof

Пакет net/http/pprof предоставляет HTTP-обработчики для профилирования Go-приложений. Он добавляет эндпоинты к вашему HTTP-серверу, через которые можно получить данные о работе программы: профили CPU, памяти, горутин, блокировок и другие. Пакет автоматически регистрирует обработчики для стандартных путей профилирования.

Подключение пакета

Для использования пакета его нужно импортировать с побочным эффектом, чтобы зарегистрировать обработчики:

goimport _ "net/http/pprof"

После этого обработчики будут доступны по стандартным путям, таким как /debug/pprof/, /debug/pprof/profile и другим.

Синтаксис

goimport _ "net/http/pprof"

Для запуска профилирования необходимо запустить HTTP-сервер с зарегистрированными обработчиками:

goimport (
  "net/http"
  _ "net/http/pprof"
)

func main() {
  http.ListenAndServe(":8080", nil)
}

Доступные эндпоинты

После подключения пакета становятся доступны следующие HTTP-эндпоинты:

Пример

Создадим простой HTTP-сервер с профилированием:

gopackage main

import (
  "fmt"
  "net/http"
  _ "net/http/pprof"
)

func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, World!")
  })

  fmt.Println("Server started at :8080")
  fmt.Println("Profiling available at: http://localhost:8080/debug/pprof/")
  http.ListenAndServe(":8080", nil)
}

Пример

Получим 30-секундный профиль CPU с помощью curl:

gocurl -o cpu.prof http://localhost:8080/debug/pprof/profile

Результат выполнения команды:

go"% Total  % Received % Xferd  Average Speed   Time  Time   Time  Current
                 Dload  Upload   Total   Spent  Left  Speed
100  1234  100  1234  0   0   1234    0  0:00:30 --:--:--  0:00:30  1234"

Пример

Получим профиль кучи (выделения памяти) в формате protobuf:

gocurl -o heap.prof http://localhost:8080/debug/pprof/heap

Результат выполнения команды:

go"% Total  % Received % Xferd  Average Speed   Time  Time   Time  Current
                 Dload  Upload   Total   Spent  Left  Speed
100  1234  100  1234  0   0   1234    0  0:00:30 --:--:--  0:00:30  1234"

Пример

Анализ профиля с помощью инструмента pprof:

gogo tool pprof -http=:8081 cpu.prof

Результат выполнения команды:

go"Serving web UI on http://localhost:8081"

Смотрите также

  • пакет runtime/pprof,
    который предоставляет низкоуровневый API для профилирования
  • функцию pprof.StartCPUProfile,
    которая запускает запись CPU-профиля в файл
  • функцию pprof.StopCPUProfile,
    которая останавливает запись CPU-профиля
  • функцию pprof.Lookup,
    которая возвращает профиль по имени