Профилирование процессов сервера (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) |