Показаны сообщения с ярлыком Профилирование в Golang. Показать все сообщения
Показаны сообщения с ярлыком Профилирование в Golang. Показать все сообщения

четверг, 27 августа 2020 г.

Пакет pprof в Golang

Пакет pprof обслуживает данные профилирования среды выполнения HTTP-сервера в формате, ожидаемом инструментом визуализации pprof.

Пакет обычно импортируется только из-за побочного эффекта регистрации его обработчиков HTTP. Все обрабатываемые пути начинаются с /debug/pprof/.

Чтобы использовать pprof, свяжите этот пакет со своей программой:

import _ "net/http/pprof"

Если ваше приложение еще не запустило http-сервер, вам необходимо запустить его. Добавьте "net/http" и "log" к вашему импорту и следующий код к вашей main функции:

go func() {
    log.Println(http.ListenAndServe("localhost:6060", nil))
}()

Если вы не используете DefaultServeMux, вам нужно будет зарегистрировать обработчики в используемом мультиплексоре (mux). Например:

package main

import (
    "log"
    "net/http"
    "net/http/pprof"
)

func main() {
    mux := http.NewServeMux()

    // Здесь можно указать свой путь
    mux.HandleFunc("/debug/pprof/profile", pprof.Profile)

    log.Fatal(http.ListenAndServe(":6060", mux))
}

Затем используйте инструмент pprof, чтобы посмотреть профиль кучи (heap profile):

go tool pprof http://localhost:6060/debug/pprof/heap

Или посмотреть 30-секундный профиль процессора:

go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30

Или посмотреть профиль блокировки goroutine после вызова runtime.SetBlockProfileRate в вашей программе:

go tool pprof http://localhost:6060/debug/pprof/block

Или посмотреть на держателей конкурирующих мьютексов после вызова runtime.SetMutexProfileFraction в вашей программе:

go tool pprof http://localhost:6060/debug/pprof/mutex

Пакет также экспортирует обработчик, который обслуживает данные трассировки выполнения для команды "go tool trace". Чтобы собрать 5-секундную трассировку выполнения:

wget -O trace.out http://localhost:6060/debug/pprof/trace?seconds=5
go tool trace trace.out

Чтобы просмотреть все доступные профили, откройте в браузере http://localhost:6060/debug/pprof/.

Функция Cmdline

func Cmdline(w http.ResponseWriter, r *http.Request)

Cmdline отвечает командной строкой запущенной программы с аргументами, разделенными NUL байтами. Инициализация пакета регистрирует его как /debug/pprof/cmdline.

Функция Handler

func Handler(name string) http.Handler

Handler возвращает обработчик HTTP, который обслуживает именованный профиль.

Функция Index

func Index(w http.ResponseWriter, r *http.Request)

Index отвечает профилем в формате pprof, указанным в запросе. Например, "/debug/pprof/heap" обслуживает профиль "heap". Index отвечает на запрос "/debug/pprof/" HTML-страницей со списком доступных профилей.

Функция Profile

func Profile(w http.ResponseWriter, r *http.Request)

Profile отвечает профилем процессора в формате pprof. Профилирование длится в течение времени, указанного в параметре GET в секундах, или 30 секунд, если не указано иное. Инициализация пакета регистрирует его как /debug/pprof/profile.

Функция Symbol

func Symbol(w http.ResponseWriter, r *http.Request)

Symbol ищет программные счетчики, перечисленные в запросе, отвечая таблицей, отображающей программные счетчики на имена функций. Инициализация пакета регистрирует его как /debug/pprof/symbol.

Функция Trace

func Trace(w http.ResponseWriter, r *http.Request)

Trace отвечает трассировкой выполнения в двоичной форме. Трассировка длится в течение времени, указанного в параметре GET в секундах, или в течение 1 секунды, если не указано иное. Инициализация пакета регистрирует его как /debug/pprof/trace.


Читайте также:


четверг, 9 апреля 2020 г.

Настройка профилирования в Golang

Ограничено ли профилирование только встроенными профилями?

В дополнение к тому, что предоставляется runtime/pprof, пользователи Go могут создавать свои собственные профили через pprof.Profile и использовать существующие инструменты для их изучения.

Возможно ли обслуживать обработчики профилировщика (/debug/pprof/...) по другому пути и порту?

Да. Пакет net/http/pprof по умолчанию регистрирует свои обработчики в mux по умолчанию, но вы также можете зарегистрировать их самостоятельно, используя обработчики, экспортированные из пакета.

Например, следующий пример будет обслуживать обработчик pprof.Profile на порту :7777 в /custom_debug_path/profile:

package main

import (
 "log"
 "net/http"
 "net/http/pprof"
)

func main() {
 mux := http.NewServeMux()
 mux.HandleFunc("/custom_debug_path/profile", pprof.Profile)
 log.Fatal(http.ListenAndServe(":7777", mux))
}


Читайте также:


среда, 8 апреля 2020 г.

Способы визуализации данных профилирования в Golang

Инструменты Go обеспечивают визуализацию данных профиля с помощью text, graph и callgrind визуализации с помощью go tool pprof.

Распечатка самых дорогих вызовов в виде text.


Визуализация самых дорогих вызовов в виде graph.


Представление веб-списка (weblist) отображает дорогие части исходного кода построчно на странице HTML. В следующем примере 530мс тратится в runtime.concatstrings, а стоимость каждой строки представлена в листинге.

Визуализация самых дорогих звонков в виде веб-списка (weblist).


Другим способом визуализации данных профиля является flame graph (график пламени). flame graph позволяют вам перемещаться по определенному пути предков, так что вы можете увеличивать/уменьшать отдельные участки кода. В upstream pprof есть поддержка flame graph.

flame graph предлагают визуализацию для определения самых дорогих путей кода.



Читайте также:


вторник, 7 апреля 2020 г.

Профилирование в Golang, использование в производственной среде

Какие другие профилировщики (не pprof) можно использовать для профилирования программ Go?

В Linux инструменты perf могут использоваться для профилирования программ Go. Perf может профилировать и раскручивать код cgo/SWIG и kernel, поэтому может быть полезно получить представление об узких местах производительности native/kernel. На macOS, Instruments Suite можно использовать для профилирования программы Go.

Можно ли профилировать сервисы в производственной среде?

Да. Безопасно профилировать программы в производственной среде (production), но включение некоторых профилей (например, профиля cpu) увеличивает стоимость. Вы должны ожидать снижения производительности. Нарушение производительности можно оценить путем измерения накладных расходов профилировщика перед его включением в производственной среде.

Вы можете периодически профилировать свои сервисы в производственной среде. Особенно в системе с множеством реплик одного процесса, периодический выбор случайной реплики является безопасным вариантом. Выберите производственный процесс, профилируйте его X секунд для каждых Y секунд и сохраняйте результаты для визуализации и анализа; затем периодически повторяйте. Результаты могут быть вручную и/или автоматически просмотрены, чтобы найти проблемы. Сбор профилей может мешать друг другу, поэтому рекомендуется собирать только один профиль за раз.


Читайте также:


Профилирование в Golang, профили runtime/pprof

Профилирование полезно для определения дорогих или часто вызываемых разделов кода. Среда выполнения Go предоставляет данные профилирования в формате, ожидаемом инструментом визуализации pprof. Данные профилирования могут быть собраны во время тестирования с помощью go test или конечных точек, доступных из пакета net/http/pprof. Пользователи должны собирать данные профилирования и использовать инструменты pprof для фильтрации и визуализации основных путей кода.

Предопределенные профили, предоставляемые пакетом runtime/pprof:

  • cpu: профиль ЦП определяет, где программа тратит свое время, активно потребляя циклы ЦП (в отличие от сна или ожидания ввода-вывода).
  • heap: профиль кучи сообщает о распределении памяти; используется для мониторинга текущего и исторического использования памяти, а также для проверки утечек памяти.
  • threadcreate: профиль создания потока сообщает о разделах программы, которые ведут создание новых потоков ОС.
  • goroutine: профиль goroutine сообщает о следах стека (stack traces) всех текущих goroutines.
  • block: профиль block показывает, где блокирующиеся программы ожидают примитивы синхронизации (включая каналы таймера). Профиль block не включен по умолчанию; используйте runtime.SetBlockProfileRate, чтобы включить его.
  • mutex: профиль mutex сообщает о блокировках. Если вы считаете, что ваш процессор не используется полностью из-за мьютекса, используйте этот профиль. Профиль mutex не включен по умолчанию, используйте Runtime.SetMutexProfileFraction, чтобы включить его.

Читайте также: