Профилирование производительности 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_PARAMETER—512000. ВHEAPPROFILEпередается путь к файлу профиля.
Профилирование CPU при использовании Reindexer в варианте Standalone
Для получения профиля CPU выполните команду с указанием HTTP-адреса сервера вида:
go tool pprof http://localhost:9088/pprof/profile?seconds=40
Где seconds — время, в течение которого будет выполняться профилирование.
По завершению сбора профиля CPU профилировщик перейдет в интерактивный режим, в котором с помощью команд (для получения списка доступных введите help) можно получить различную информацию из файла с профилем CPU:

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

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