Профилирование производительности Reindexer при помощи pprof

В Reindexer для профилирования используется go-профилировщик pprof. С его помощью возможно профилирование в вариантах использования Standalone, Built-in server и Built-in (Embedded). Go-профилировщик в Reindexer позволяет получать профили CPU и кучи (heap).

Профилирование при использовании Reindexer в варианте Standalone

Чтобы включить возможность профилирования Standalone сервера Reindexer, его требуется запустить с флагом --pprof (подробнее — в разделе «Структура файла конфигурации, настройки и соответствующие им аргументы командной строки »).

Для профилирования С++-части используется профилировщик из состава gperftools.

Для возможности профилирования кучи требуется передача одной из переменных окружения TCMALLOC_SAMPLE_PARAMETER (устанавливает периодичность съема сэмпла) или HEAPPROFILE при запуске сервера. Рекомендованное значение для TCMALLOC_SAMPLE_PARAMETER512000. В HEAPPROFILE передается путь к файлу профиля.

Профилирование CPU при использовании Reindexer в варианте Standalone

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

go tool pprof http://localhost:9088/pprof/profile?seconds=40

Где seconds — время, в течение которого будет выполняться профилирование.

По завершению сбора профиля CPU профилировщик перейдет в интерактивный режим, в котором с помощью команд (для получения списка доступных введите help) можно получить различную информацию из файла с профилем CPU:

Приглашение к работе с pprof в интерактивном режиме

Приглашение к работе с pprof в интерактивном режиме

Например, для вывода информации в графическом виде воспользуйтесь командой web. В результате профиль CPU отобразиться в браузере.

Пример:

Профиль CPU Reindexer

Профиль CPU Reindexer

Для использования этой опции в системе должна быть установлена утилита graphviz.

Профилирование кучи при использовании Reindexer в варианте Standalone

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

go tool pprof http://localhost:9088/pprof/heap

После этого профилировщик перейдет в интерактивный режим и с ним можно будет взаимодействовать, как и при профилировании CPU.

Профилирование при использовании Reindexer в вариантах Built-in server и Built-in

Из-за специфики Golang не рекомендуется пытаться получить профили CPU и кучи одновременно. Это может привести к блокировкам внутри профилировщика.

Профилирование кучи при использовании Reindexer в вариантах Built-in server и Built-in

Из-за того, что ядро Reindexer написано на C++, обращения к нему и потребление этими обращениями памяти не видны go-профилировщику. Для профилирования кучи Reindexer в вариантах Built-in server и Built-in используется внутренний Сgo-профилировщик. Это — часть Reindexer, которая может также использоваться с любым другим Cgo кодом.

Чтобы получить профиль кучи при использовании при использовании Reindexer в варианте Built-in server или Built-in:

  1. Импортируйте в свое приложение пакет Сgo-профилировщика:
import _ "github.com/restream/reindexer/pprof"
  1. Убедитесь, что у вас уже запускается http-сервер из стандартной библиотеки GO (net/http). Если стандартный http-сервер не запускается, добавьте net/http и log в импорт и следующий код в функцию main:
go func() {
	log.Println(http.ListenAndServe("localhost:6060", nil))
}()
  1. Запустите приложение с переменной окружения HEAPPROFILE=/tmp/pprof.
  2. Запустите утилиту pprof для получения профиля CPU:
go tool pprof -symbolize remote http://localhost:6060/debug/cgo/pprof/heap

Профилирование CPU при использовании Reindexer в вариантах Built-in server и Built-in

Чтобы получить профиль CPU при использовании при использовании Reindexer в варианте Built-in server или Built-in:

  1. Импортируйте в свое приложение пакет net/http/pprof :
import _ "net/http/pprof"
  1. Убедитесь, что у вас уже запускается http-сервер из стандартной библиотеки GO (net/http). Если стандартный http-сервер не запускается, добавьте net/http и log в импорт и следующий код в функцию main:
go func() {
	log.Println(http.ListenAndServe("localhost:6060", nil))
}()
  1. Запустите приложение с переменной окружения REINDEXER_CGOBACKTRACE=1.
  2. Запустите утилиту pprof для получения профиля CPU:
go tool pprof -symbolize remote http://localhost:6060/debug/pprof/profile?seconds=10