Пакет net/http/pprof
Пакет net/http/pprof предоставляет HTTP-обработчики для профилирования Go-приложений. Он добавляет эндпоинты к вашему HTTP-серверу, через которые можно получить данные о работе программы: профили CPU, памяти, горутин, блокировок и другие. Пакет автоматически регистрирует обработчики для стандартных путей профилирования.
Подключение пакета
Для использования пакета его нужно импортировать с побочным эффектом, чтобы зарегистрировать обработчики:
import _ "net/http/pprof"
После этого обработчики будут доступны по стандартным путям, таким как /debug/pprof/, /debug/pprof/profile и другим.
Синтаксис
import _ "net/http/pprof"
Для запуска профилирования необходимо запустить HTTP-сервер с зарегистрированными обработчиками:
import (
"net/http"
_ "net/http/pprof"
)
func main() {
http.ListenAndServe(":8080", nil)
}
Доступные эндпоинты
После подключения пакета становятся доступны следующие HTTP-эндпоинты:
/debug/pprof/- главная страница со списком доступных профилей/debug/pprof/cmdline- командная строка запуска программы/debug/pprof/profile- профиль CPU (по умолчанию 30 секунд)/debug/pprof/symbol- таблица символов/debug/pprof/trace- трассировка выполнения/debug/pprof/heap- профиль кучи (выделения памяти)/debug/pprof/goroutine- профиль горутин/debug/pprof/block- профиль блокировок/debug/pprof/mutex- профиль мьютексов/debug/pprof/threadcreate- профиль создания потоков/debug/pprof/allocs- профиль выделений памяти
Пример
Создадим простой HTTP-сервер с профилированием:
package 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:
curl -o cpu.prof http://localhost:8080/debug/pprof/profile
Результат выполнения команды:
"% 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:
curl -o heap.prof http://localhost:8080/debug/pprof/heap
Результат выполнения команды:
"% 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:
go tool pprof -http=:8081 cpu.prof
Результат выполнения команды:
"Serving web UI on http://localhost:8081"
Смотрите также
-
пакет
runtime/pprof,
который предоставляет низкоуровневый API для профилирования -
функцию
pprof.StartCPUProfile,
которая запускает запись CPU-профиля в файл -
функцию
pprof.StopCPUProfile,
которая останавливает запись CPU-профиля -
функцию
pprof.Lookup,
которая возвращает профиль по имени