Профилирование производительности 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:
Например, для вывода информации в графическом виде воспользуйтесь командой web
. В результате профиль CPU отобразиться в браузере.
Пример:
Для использования этой опции в системе должна быть установлена утилита 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