Установка

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 debug page

Сейчас вы можете запустить pprof на определенный период времени и посмотреть чем занимается ваше приложение в это время. Давайте запустим профилирование на 30 секунд.

go tool pprof -http=":9090" -seconds=30 http://localhost:8081/debug/pprof/profile
pprof graph page

Каждый блок выглядит примерно так 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 flame graph page

Заключение

Это только вершина айсберга. Pprof мощьный инструмент для профилирования ваших golang (и не только) приложений, который позволит найти легко узкие места в вашем приложении.

P.S.

Если вы используете Goland от JetBrains, у вас есть возможность использавать профилирование прямо из самой IDE. Посмотрите на сколько это удобно.

Больше чтения