PPROF. Профайлинг Golang приложений.
Установка
Go Tools содержат набор отличных инструментов прямо из коробки. Сегодня мы поговорим об одном из низ. Pprof - встроеный инструмент для профилирования приложений. Есть несколько способов его использования. Мы рассмотрим самый простой.
Исходный код примера вы можете найти здесь
Для начала нам нужно подключить стандарные http обработчики:
import (
_ "net/http/pprof"
)
Если вы не используете http в своем приложнии, вы можете запустить http отдельно:
package main
import (
"net/http"
_ "net/http/pprof"
)
func main () {
http.ListenAndServe(":8081", nil)
}
net/http/pprof
содержит init
функцию которая регистрирует стандартные обрабочики которые предоставляют основную
информацию о времени исполенения приложения.
func init() {
http.HandleFunc("/debug/pprof/", Index)
http.HandleFunc("/debug/pprof/cmdline", Cmdline)
http.HandleFunc("/debug/pprof/profile", Profile)
http.HandleFunc("/debug/pprof/symbol", Symbol)
http.HandleFunc("/debug/pprof/trace", Trace)
}
Давайте посмотрим главную страницу. Откройте 127.0.0.1:8081/debug/pprof/
в вашем браузере. Этот раздел описывает
другие страницы и их предназначение. Нас интересует profile
и heap
.
- profile - CPU Profile
- head - Memory Allocation Profile
Сейчас вы можете запустить pprof на определенный период времени и посмотреть чем занимается ваше приложение в это время. Давайте запустим профилирование на 30 секунд.
go tool pprof -http=":9090" -seconds=30 http://localhost:8081/debug/pprof/profile
Каждый блок выглядит примерно так main generateRandomText 0.01s (0.17%) of 1.92s (32.49%)
где
- main - имя пакета
- generateRandomText - имя функции
- 0.01s (0.17%) - сколько времени функция работала (не учитывая время работы вызываемых внутри функций)
- 1.92s (32.49%) - сколько времени функция рабтала в целом
Есть и другой способ отображения (мой любимый) - Flame graph. Ось X показывает как долго функция выполнялась, а ось-Y показывает позицию в стеке.
Заключение
Это только вершина айсберга. Pprof мощьный инструмент для профилирования ваших golang (и не только) приложений, который позволит найти легко узкие места в вашем приложении.
P.S.
Если вы используете Goland от JetBrains, у вас есть возможность использавать профилирование прямо из самой IDE. Посмотрите на сколько это удобно.