Настройка профилирования и трассировки для устранения неполадок Grafana
Вы можете настроить процесс grafana-server на включение определённых диагностических функций при запуске. Это может быть полезно
при исследовании определённых проблем производительности. Не рекомендуется держать их включёнными по умолчанию.
Включение профилирования и сбор профилей
grafana-server можно запустить с параметром командной строки -profile для включения профилирования, -profile-addr для переопределения HTTP-адреса по умолчанию (localhost) и
-profile-port для переопределения HTTP-порта по умолчанию (6060), где доступны конечные точки отладки pprof. Кроме того, -profile-block-rate управляет долей событий блокировки горутин, которые сообщаются в профиле блокировок, по умолчанию 1 (то есть отслеживать каждое событие) по причинам обратной совместимости, а -profile-mutex-rate управляет долей событий конкуренции мьютексов, которые сообщаются в профиле мьютексов, по умолчанию 0 (то есть не отслеживать события). Чем выше доля (то есть чем меньше это значение), тем больше накладных расходов это добавляет к обычным операциям.
Запуск Grafana с включённым профилированием и без включённого профилирования блокировок и мьютексов должен добавлять лишь долю накладных расходов и подходит для непрерывного профилирования. Добавление небольшой доли профилирования блокировок и мьютексов, например 10-5 (10%-20%), в целом должно быть нормальным.
Включите профилирование:
./grafana server -profile -profile-addr=0.0.0.0 -profile-port=8080
Включите профилирование с профилированием блокировок и мьютексов с долей 20%:
./grafana server -profile -profile-addr=0.0.0.0 -profile-port=8080 -profile-block-rate=5 -profile-mutex-rate=5
Обратите внимание, что конечные точки отладки pprof обслуживаются на другом порту, чем HTTP-сервер Grafana. Проверьте, какие конечные точки отладки доступны, открыв http://<profile-addr><profile-port>/debug/pprof.
Есть некоторые дополнительные конечные точки godeltaprof, которые более подходят в сценарии непрерывного профилирования. Эти конечные точки: /debug/pprof/delta_heap, /debug/pprof/delta_block, /debug/pprof/delta_mutex.
Вы можете настроить или переопределить настройки профилирования с помощью переменных среды:
export GF_DIAGNOSTICS_PROFILING_ENABLED=true
export GF_DIAGNOSTICS_PROFILING_ADDR=0.0.0.0
export GF_DIAGNOSTICS_PROFILING_PORT=8080
export GF_DIAGNOSTICS_PROFILING_BLOCK_RATE=5
export GF_DIAGNOSTICS_PROFILING_MUTEX_RATE=5
В целом, вы используете команду Go pprof как для сбора, так и для анализа данных профилирования. Вы также можете использовать curl или подобное для сбора профилей, что может быть удобно в средах, где у вас нет доступной команды Go/pprof. Далее приведены некоторые примеры использования curl и pprof для сбора и анализа профилей памяти и ЦП.
Анализ высокого использования памяти/утечек памяти:
При столкновении с высоким использованием памяти или потенциальными утечками памяти полезно собрать несколько профилей кучи и позже при анализе сравнить их. Хорошей идеей является подождать некоторое время, например 30 секунд, между сбором каждого профиля, чтобы позволить потреблению памяти вырасти.
curl http://<profile-addr>:<profile-port>/debug/pprof/heap > heap1.pprof
sleep 30
curl http://<profile-addr>:<profile-port>/debug/pprof/heap > heap2.pprof
Затем вы можете использовать инструмент pprof для сравнения двух профилей кучи:
go tool pprof -http=localhost:8081 --base heap1.pprof heap2.pprof
Анализ высокого использования ЦП:
При столкновении с высоким использованием ЦП предлагается собирать профили ЦП в течение определённого периода времени, например 30 секунд.
curl 'http://<profile-addr>:<profile-port>/debug/pprof/profile?seconds=30' > profile.pprof
Затем вы можете использовать инструмент pprof для анализа собранного профиля ЦП:
go tool pprof -http=localhost:8081 profile.pprof
Использование трассировки
grafana-server можно запустить с аргументами -tracing для включения трассировки и -tracing-file для переопределения файла трассировки по умолчанию (trace.out), куда записывается результат трассировки. Например:
./grafana server -tracing -tracing-file=/tmp/trace.out
Вы можете настроить или переопределить настройки профилирования с помощью переменных среды:
export GF_DIAGNOSTICS_TRACING_ENABLED=true
export GF_DIAGNOSTICS_TRACING_FILE=/tmp/trace.out
Просмотрите трассировку в веб-браузере (требуется установленный Go):
go tool trace <trace file>
2019/11/24 22:20:42 Parsing trace...
2019/11/24 22:20:42 Splitting trace...
2019/11/24 22:20:42 Opening browser. Trace viewer is listening on http://127.0.0.1:39735
Дополнительную информацию о том, как анализировать файлы трассировки, см. в разделе Команда Go trace.
Экспорт трассировок в файл
Grafana может записывать свои собственные распределённые трассировки в локальный файл в формате JSON OpenTelemetry Protocol (OTLP), без коллектора или серверной части трассировки. Это помогает получить трассировки для отладки без настройки серверной части: включите экспортёр, воспроизведите проблему, затем соберите и поделитесь файлом.
Note
Не используйте этот экспортёр как постоянную конфигурацию. Используйте его для устранения неполадок в Grafana, затем выключите.
Это отличается от параметра -tracing в предыдущем разделе. Тот параметр записывает низкоуровневую трассировку выполнения среды выполнения Go для go tool trace, тогда как файловый экспортёр выдаёт те же спаны OpenTelemetry, которые Grafana отправляет в Jaeger или конечные точки OTLP, описывающие, как запросы проходят через Grafana.
Чтобы включить его, установите path в разделе [tracing.opentelemetry.file]. Grafana использует этот экспортёр только когда вы не настроили конечную точку tracing.opentelemetry.jaeger или tracing.opentelemetry.otlp. Grafana ограничивает каждый захват по размеру файла и длительности, чтобы защитить дисковое пространство.
[tracing.opentelemetry.file]
path = /var/lib/grafana/traces/capture.json
Доступные параметры см. в разделе [tracing.opentelemetry.file] справочника по конфигурации.
Чтобы просмотреть захваченный файл, откройте Grafana, перейдите в Explore, выберите источник данных Tempo и выберите Import trace.