Skip to content

Профилирование процессов сервера (glb_prof)

Для разбора «узких мест» (history syncer, ожидание блокировок, SQL, value cache и т.п.) в Glaber есть встроенный профайлер glb_prof. По умолчанию он выключен; включается и выключается без перезапуска сервера через runtime control (-R).

Когда профилирование включено, процесс периодически пишет в журнал сервера строки вида === glb_prof history syncer #1 (window …) === с суммарным временем по этапам. Для history syncer дамп обычно идёт примерно раз в 30 секунд.

Команды выполняются от имени пользователя с доступом к socket runtime control (как правило root или пользователь сервиса). Бинарник — glaber_server (в старых установках может быть zabbix_server). При необходимости укажите конфиг: -c /etc/glaber/glaber_server.conf.

См. также общую диагностику проблем.

Включение и выключение

Включить для history syncer №1

glaber_server -R 'prof_enable=history syncer,1'

Выключить

glaber_server -R 'prof_disable=history syncer,1'

Другие примеры

Все history syncer:

glaber_server -R 'prof_enable=history syncer'

По PID процесса:

ps aux | grep '[h]istory syncer'
glaber_server -R 'prof_enable=<pid>'

Все процессы сервера (нагружает логи — только на короткое время диагностики):

glaber_server -R prof_enable
glaber_server -R prof_disable

Снятие результата из журнала

Типичный путь журнала: /var/log/glaber/glaber_server.log (в старых установках — /var/log/zabbix/zabbix_server.log).

grep 'glb_prof' /var/log/glaber/glaber_server.log

или в реальном времени:

tail -f /var/log/glaber/glaber_server.log | grep --line-buffered glb_prof

В issue приложите несколько окон дампа (примерно 1–2 минуты работы под нагрузкой) для нужного процесса. После сбора данных профилирование лучше выключить (prof_disable), чтобы не засорять журнал.

В дампе для каждого активного раздела указываются: суммарное время, доля от окна, число вызовов, среднее и максимум.

Разделы профилирования

Имена в журнале совпадают с колонкой Имя в логе. Не все разделы появятся в каждом процессе — только те, через которые реально прошёл код при включённом профилировании.

Этапы history sync / обработки истории

Имя в логе Описание
ipc_recv Получение порции данных из IPC (очередь -> processing )
config_cache Работа с конфигурационным кэшем при подготовке/обработке значений
prepare_history Подготовка истории перед записью и связанной логикой
state_keeper Обновление состояния через state keeper
trigger_timers Обработка таймеров триггеров
triggers_sql SQL, связанный с обработкой/сохранением триггеров и событий
hist_write Запись истории во внешнее хранилище (например ClickHouse)
trends Расчёт и запись трендов
inventory_sql SQL обновления инвентаря

Proxy poller / preprocessing / IPC

Имя в логе Описание
proxy_process Обработка одного proxy poller цикла (сеть, конфиг, data/tasks). SQL и DC учитываются отдельно через sql_* / locks
preproc_process Обработка батча метрик в glb_preproc_worker
ipc_metrics_wait Ожидание при нехватке IPC-буфера метрик (starvation на отправке в ->preproc или ->processing). Во время ожидания дамп пишется раз в ~30 с

Примеры включения:

glaber_server -R 'prof_enable=proxy poller,1'
glaber_server -R 'prof_enable=glb_preproc_worker,1'

Value cache

Имя в логе Описание
vc_get_local Чтение из локального шарда value cache
vc_get_remote Чтение через удалённый/IPC путь value cache keeper
vc_add_local Запись в локальный шард value cache
vc_add_remote Запись через удалённый/IPC путь value cache keeper

SQL (автоклассификация запросов)

Измеряется время выполнения SQL в слое БД. Тип определяется по началу текста запроса.

Имя в логе Описание
sql_select SELECT / WITH …
sql_insert INSERT
sql_update UPDATE
sql_delete DELETE
sql_begin BEGIN
sql_commit COMMIT
sql_rollback ROLLBACK
sql_other Прочие SQL-запросы

Эти счётчики могут пересекаться по времени с этапными разделами выше (например triggers_sql и sql_update): этап — логический блок кода, sql_* — фактическое время в драйвере БД.

Блокировки

Имя в логе Описание
lock_wait Ожидание до успешного захвата любой профилируемой блокировки (mutex или rwlock)
locked_rd Удержание rwlock в режиме чтения (rdlock)
locked_wr Удержание rwlock в режиме записи (wrlock)
locked_mutex Удержание обычного mutex (всегда эксклюзивно)

lock_wait — время до захвата; locked_* — время после захвата до unlock. Rwlock и mutex различаются типом примитива, не «сильнее/слабее».

Прочее

Имя в логе Описание
idle Простой процесса. Если GLB_PROF_IDLE не измерялся, считается как window − busy (остаток wall-time)