Применение комплекса pg_expecto и цепи Маркова для анализа производительности СУБД PostgreSQL
Оригинал — на основном техническом канале (Возможны правки и дополнения).
Цепь Маркова как мост от метрик производительности к прогнозу инцидентов.
Аннотация.
Рассматривается применение программного комплекса pg_expecto, реализующего сбор статистики производительности PostgreSQL и построение цепи Маркова для прогнозирования инцидентов.
Проведён анализ сводного отчёта за 30 дней (октябрь–ноябрь 2026 г.). Показано, что сигнал SICPP обеспечивает покрытие 93,5% инцидентов при precision эпизодов 28,3%, сигнал C-only – покрытие 79,6% при 22 непокрытых инцидентах, преимущественно в зонах восстановления и пересечения с инцидентами. Калибровка вероятностей снижает Brier score на 11,9% без существенного изменения ROC-AUC. Выявлены артефакты агрегации (доли активности сигналов >100%) и расхождения в недельной динамике. Обоснована необходимость углублённого анализа выделенных переходных периодов с привлечением ожиданий, метрик ОС и активности фоновых процессов.
Ключевые слова: PostgreSQL, мониторинг производительности, цепь Маркова, SICPP, C-only, JS-дивергенция, калибровка вероятностей, performance engineering.
Введение.
Задача оперативного обнаружения деградации СУБД требует совместного анализа метрик производительности, ожиданий и профилей нагрузки. Комплекс pg_expecto собирает поминутные данные о скорости, ожиданиях, чтении/записи разделяемых блоков, метриках ОС и параметрах autovacuum. На их основе цепь Маркова формирует дискретное состояние (корреляция скорость–ожидания, тренды скорости и ожиданий), а модуль профилирования сравнивает текущий профиль с эталонным по JS-дивергенции. Сигналы SICPP и C-only предназначены для предупреждения инцидентов.
Цель работы
На примере сводного отчёта за 30 дней оценить эффективность сигналов, качество прогнозов и ограничения текущей реализации.
Методика.
Состояние цепи Маркова определяется как комбинация округлённой корреляции Пирсона (шаг 0,1) и знаков углов наклона линий регрессии для операционной скорости и ожиданий. Переходы фиксируются в transition_log, частоты накапливаются в markov_frequencies с адаптивным забыванием. Критические состояния отбираются по эмпирическому риску инцидента и хранятся в critical_states.
Сигнал SICPP вычисляется по окну window_minutes с порогами js_threshold и risk_threshold; покрытие инцидента определяется пересечением эпизода SICPP с инцидентом, lead time – от episode_started_at до начала инцидента.
Сигнал C-only (операционный индикатор) вычисляется по формуле risk_p90 >= c_p90_min AND js_avg >= c_js_min AND W_score >= c_w_min в окне 20 минут. W_score рассчитывается как (risk_avg / risk_threshold) * weight_risk + (js_avg / js_threshold) * weight_js.
Калибровка вероятностей выполняется по изотонической регрессии с сохранением карты в mchain_calibration_map; для дашбордов рекомендуется calibrated_risk, для алертов – raw (predicted_risk).
Результаты анализа сводного отчёта.
Период анализа: 2026-10-14 10:38 – 2026-11-13 10:37 (+03)
Длительность 30 дней.
Зафиксировано 108 инцидентов;
Покрытие SICPP: 101 инцидент (93,5%).
Покрытие C-only: 86 инцидентов (79,6%); не покрыто 22.
Распределение последних статусов перед инцидентами: CRITICAL – 59, WARNING – 24, NORMAL – 0, INCIDENT – 13, NO_BASELINE – 0.
Качество прогнозов: ROC-AUC raw 0,8854, calibrated 0,8848; Brier raw 0,131183, calibrated 0,115541 (улучшение на 11,9%).
SICPP с lead time: из 101 покрытого инцидента 92 имели lead ≥60 мин (91,1% покрытых; 85,2% от всех инцидентов); средний raw lead – 129,6 мин; 27 инцидентов имели raw lead >180 мин.
Precision эпизодов SICPP: 28,3% (233 эпизода, 66 TP, 167 FP).
Непокрытие C-only: in_recovery – 11, profile_incident – 10, threshold_fail – 1 (ID 52); остальные подавлены зонами recovery/profile incident.
Операционные флаги: c_only_incident_flag – 73 результирующих эпизода из 155 стартов (47,1%); sicpp_incident_flag – 76 из 190 (40,0%); средняя длительность результирующего эпизода: c_only 130,2 мин, sicpp 177,2 мин.
Профиль производительности нестабилен. Суточная средняя JS-дивергенция изменяется от 0,0542 до 0,1894; суточный максимум JS – от 0,2196 до 0,2551; корреляция за день варьирует от -0,109 до 0,943. В периоде доминируют длительные переходные периоды со статусом CRITICAL, преимущественно типа instability и degradation.
Ключевые переходные периоды:
2026-10-16 00:00–14:00: degradation, CRITICAL, max JS 0,245, 840 мин.
2026-10-19 17:00–2026-10-20 20:00: instability, CRITICAL, max JS 0,255, 1620 мин (самый длительный и максимальный JS).
2026-10-22 09:00–20:00: degradation, CRITICAL, max JS 0,244, 660 мин.
2026-10-29 20:00–2026-10-30 06:00: instability, CRITICAL, max JS 0,228, 600 мин.
2026-10-31 20:00–2026-11-01 10:00: instability, CRITICAL, max JS 0,227, 840 мин.
2026-11-05 05:00–18:00: instability, CRITICAL, max JS 0,222, 780 мин.
2026-11-07 07:00–2026-11-08 03:00: instability, CRITICAL, max JS 0,250, 1200 мин.
2026-11-11 08:00–2026-11-12 07:00: instability, CRITICAL, max JS 0,232, 1380 мин.
2026-11-12 13:00–17:00: degradation, WARNING, max JS 0,199, 240 мин.
В почасовой динамике значения SICPP% и C% местами превышают 100% (201,7%, 296,7%, 325,0%, 451,7%). Это артефакт агрегации: длительность активного интервала относится к часу его начала, поэтому длинный интервал даёт вклад больше 3600 с. В почасовой и ежедневной динамике энтропия, доля критических состояний и число аномалий равны нулю на всём периоде, при этом JS-дивергенция и переходные периоды ненулевые. В недельной динамике для полных недель число переходных периодов указано 0, тогда как в списке переходных периодов за эти же недели периоды присутствуют. Вероятная причина – порядок вызова: build_profile_weekly выполняется до detect_transition_periods, поэтому недельные счётчики могут быть от предыдущего запуска.
Обсуждение.
Высокое покрытие SICPP (93,5%) сочетается с низкой precision эпизодов (28,3%), что указывает на значительную долю ложных срабатываний. C-only имеет более высокую конверсию стартов в результирующие эпизоды (47,1% против 40,0% у sicpp_incident_flag) и меньшую среднюю длительность результирующего эпизода (130,2 мин против 177,2 мин). SICPP обеспечивает большее покрытие и больший lead time, но и больше FP. Калибровка улучшает Brier score на 11,9%, ROC-AUC практически не меняется (−0,1%), что согласуется с сохранением дискриминационной способности при коррекции систематического смещения вероятностей.
Ограничения анализа: точные причины переходных периодов не установлены, поскольку в предоставленных отчётах отсутствуют wait_event_type по инцидентам, планы запросов, метрики ОС vmstat/iostat, настройки shared_buffers, work_mem, random_page_cost, effective_cache_size, события autovacuum. Приоритет инцидентов (priority) недоступен, так как markov_chain_performance_incident не содержит этого столбца. Причины нулевых энтропии, критической доли и аномалий, а также нулевых SICPP TP и C-only Prec в ежедневной динамике не установлены; требуется прямая выборка из profile_aggregated, anomaly_log, sicpp_incident_flag_history, c_only_incident_flag_history.
Рекомендации для дальнейшего анализа.
Для каждого выделенного периода целесообразно собрать:
report_wait_event_type_vmstat и report_vmstat_performance – для связи ожиданий СУБД с метриками ОС.
report_postgresql_wait_event_type и report_postgresql_cluster_performance – для детализации ожиданий и корреляций.
report_shared_buffers – для оценки эффективности кеширования.
report_queryid_for_pareto и pg_stat_statements – для выявления вклада запросов.
autovacuum_log_events – для проверки влияния фоновых процессов.
report_vmstat_iostat и report_iostat – для анализа дисковых задержек и загрузки устройств.
Приоритетные периоды:
2026-10-19 17:00–2026-10-20 20:00 (максимальный JS и длительность),
2026-11-11 08:00–2026-11-12 07:00 (второй по длительности),
2026-10-16 00:00–14:00 и 2026-10-22 09:00–20:00 (длительные деградации),
2026-11-12 13:00–17:00 (свежий период для проверки восстановления).
Заключение.
Комплекс pg_expecto и цепь Маркова обеспечивают воспроизводимый анализ производительности PostgreSQL с разделением на сигналы SICPP и C-only.
Результаты за 30 дней подтверждают высокое покрытие инцидентов SICPP (93,5%) при умеренной precision эпизодов (28,3%) и улучшение калибровки вероятностей (Brier score снижен на 11,9%).
Выявлены артефакты агрегации и расхождения в недельной динамике, требующие корректировки порядка вызовов и проверки заполнения полей энтропии, критической доли и аномалий.
Дальнейший анализ должен быть направлен на сопоставление переходных периодов с ожиданиями, метриками ОС и активностью фоновых процессов для установления причин деградации.












