Прогнозирование инцидента производительности СУБД PostgreSQL с использованием цепи Маркова
Взято с основного технического канала Postgres DBA (Возможны исправления в исходной статье).
Подробная интерпретация результатов прогнозов цепи Маркова
1. Структура выходных данных всех прогнозных функций
Все функции (mchain_predict_risk_1min, mchain_predict_risk_k, обёртки для 15, 30, 60 минут) возвращают набор из четырёх полей:
risk (REAL)
Вероятность аварии (попадания в аварийное состояние) на заданном горизонте. Значение от 0.0 до 1.0.
curr_situation (TEXT)
Код ситуации, объясняющий, как был получен риск. Возможные значения:
'unknown_state'
'no_risk'
'risk_calculated'
curr_transitions_to_risk (INT)
Количество прямых переходов из текущего состояния в любое аварийное состояние, зафиксированных в обученной матрице вероятностей.
curr_total_transitions_known (INT)
Общее число различных целевых состояний, в которые можно перейти из текущего состояния (согласно модели).
2. Интерпретация поля risk
Числовой смысл
risk – это оценка условной вероятности того, что за указанное количество минут (1, 15, 30, 60) система хотя бы один раз окажется в аварийном состоянии.
Для mchain_predict_risk_1min – вероятность перехода на следующей минуте.
Для mchain_predict_risk_k – вероятность хотя бы одного попадания в аварию за k шагов (минут), вычисленная через поглощающую цепь Маркова.
Диапазон значений
0.0 – согласно модели, авария невозможна (нет переходов в аварийные состояния).
0.05 – используется как априорная вероятность в случае, когда текущее состояние модели неизвестно (ситуация unknown_state).
>0.0 – модель оценивает ненулевой риск.
Практическая интерпретация (уровни риска)
< 0.01 (<1%) – риск крайне низкий, система стабильна.
0.01 – 0.10 (1%–10%) – умеренный риск, рекомендуется мониторинг.
0.10 – 0.30 (10%–30%) – значительный риск, желательно принять превентивные меры.
> 0.30 (>30%) – высокий риск, требуется немедленное вмешательство.
Важно: Прогнозы зависят от обученной модели и могут быть недостоверны, если модель имеет низкий рейтинг достоверности (см. раздел 6).
3. Интерпретация поля curr_situation
Поле даёт контекст вычисления риска и помогает диагностировать, почему модель выдала то или иное значение.
3.1 'unknown_state'
Когда возникает
Текущие метрики производительности (current_correlation, os_trend, wait_trend) отсутствуют (например, таблица cluster_stat_median пуста).
Или текущее состояние не найдено в справочнике state_descriptions (практически невозможно, если заполнены все 189 комбинаций).
Или в таблице markov_probabilities нет записей для данного состояния (состояние ни разу не встречалось в обучении).
Что означает
Модель не знает, как ведёт себя система из данного состояния. Возвращается априорная вероятность 0.05 (1–(0.95)^k для многошагового прогноза). Прогноз недостоверен.
Что делать
Дождаться, пока через mchain_train_step накопятся переходы из этого состояния. Если состояние появляется часто, но модель его не узнаёт – проверить, вызывается ли fill_state_descriptions() и не сброшены ли таблицы частот.
3.2 'no_risk'
Когда возникает
Текущее состояние известно, но в матрице вероятностей markov_probabilities нет ни одного перехода из него в аварийные состояния. То есть curr_transitions_to_risk = 0.
Что означает
Согласно накопленным данным (с учётом забывания), из текущего состояния никогда не было прямого перехода в аварию. risk возвращается как 0.0 (даже для многошагового прогноза, потому что поглощающая матрица при отсутствии исходных переходов даст нулевую вероятность).
Степень уверенности
Высокая, но только если модель достаточно обучена (рейтинг достоверности ≥3). При малом объёме данных может быть ложным (авария возможна, но ещё не встречалась).
3.3 'risk_calculated'
Когда возникает
Текущее состояние известно, и в модели есть хотя бы один переход из него в аварийное состояние (curr_transitions_to_risk > 0). Риск вычислен на основе вероятностей из markov_probabilities (для 1 минуты) или через поглощающую цепь (для k шагов).
Что означает
Модель сформировала оценку на основе реально наблюдавшейся статистики. Это основной рабочий режим.
4. Интерпретация полей curr_transitions_to_risk и curr_total_transitions_known
Эти поля помогают оценить, насколько статистически обеспечен прогноз.
curr_transitions_to_risk
Сколько различных аварийных состояний достижимо из текущего состояния за один шаг.
Чем больше это число, тем выше разнообразие сценариев аварии.
Не следует путать с вероятностью: даже если curr_transitions_to_risk = 10, но каждая из этих веток имеет очень малую вероятность, итоговый risk может быть низким.
curr_total_transitions_known
Общее число целевых состояний, в которые можно перейти из текущего состояния (включая неаварийные).
Если это число мало (например, 1–3), модель имеет бедное представление о поведении системы из данного состояния – прогноз может быть неточным.
Если число велико (близко к 189), значит состояние часто встречалось и из него наблюдалось много разнообразных переходов – прогноз более надёжен.
Рекомендация: Следить за ситуациями, когда curr_total_transitions_known меньше 5–10 – в таких случаях к прогнозу стоит относиться с осторожностью, даже если curr_situation = 'risk_calculated'.
5. Особенности многошаговых прогнозов (15, 30, 60 минут)
Как работают: Функции mchain_predict_risk_15min и т.д. вызывают mchain_predict_risk_k(k) с соответствующим k.
Математически: Используется поглощающая цепь Маркова, где все аварийные состояния сделаны поглощающими (из них нельзя выйти, вероятность остаться = 1). Риск за k шагов – это вероятность оказаться в любом поглощающем состоянии после k переходов.
Интерпретация по горизонтам
15 минут – краткосрочная опасность, полезен для немедленных реакций.
30 минут – среднесрочный тренд.
1 час – показывает, насколько система склонна к аварии в принципе (стационарное поведение).
Важное свойство:
Для многошагового прогноза риск не обязан монотонно расти с k, потому что модель может иметь возвратные неаварийные состояния. Однако в большинстве реальных случаев риск с горизонтом растёт, но может насыщаться.
6. Как учитывать достоверность прогнозов (рейтинг надёжности)
Функция mchain_forecast_reliability() возвращает рейтинг от 0 до 5. Интерпретация:
0 – Модель не обучена (менее 100 переходов). Прогнозы не использовать.
1 – Очень мало данных (100–499). Прогнозы практически случайны.
2 – Недостаточно данных (500–4999). Прогнозы нестабильны, можно смотреть только тренд.
3 – Минимально достаточно, но возможны дрейфы. Прогнозы можно использовать с осторожностью, особенно при низких рисках.
4 – Хорошая достоверность. Прогнозам можно доверять в большинстве ситуаций.
5 – Отличная достоверность. Прогнозы максимально надёжны.
Рекомендуемый порог для принятия решений: рейтинг ≥ 3. При рейтинге 0–2 любые прогнозы следует воспринимать как экспериментальные.
7. Влияние адаптивного забывания на интерпретацию
Что такое забывание: Частоты переходов периодически умножаются на коэффициент (1 - alpha), где alpha может быть фиксированным или адаптивным (зависит от времени, прошедшего с последнего инцидента).
Как это сказывается на прогнозах
Модель забывает старые наблюдения. Прогноз отражает только недавнюю историю (последние дни–недели, в зависимости от alpha и интервала забывания).
Если инцидентов давно не было, alpha снижается до min_alpha (например, 0.01) – забывание замедляется, модель сохраняет более длинную память.
После инцидента alpha временно повышается – модель быстро «забывает» поведение, предшествовавшее инциденту, и адаптируется к новым условиям.
Интерпретация при активном забывании
Прогноз риска – это текущая тенденция, а не усреднённая статистика за всё время. Если система кардинально изменилась (например, после обновления ПО), адаптивное забывание позволит прогнозам отразить новую реальность в течение нескольких дней.
8. Полный пример практической интерпретации
Допустим, вызов mchain_predict_risk_15min() вернул:
risk = 0.23
curr_situation = 'risk_calculated'
curr_transitions_to_risk = 4
curr_total_transitions_known = 32
Расшифровка:
risk = 0.23 – вероятность аварии в ближайшие 15 минут составляет 23%. Это значительный риск.
ситуация risk_calculated – прогноз построен на реальных данных из модели.
4 аварийных перехода – из текущего состояния есть 4 разных варианта попасть в аварию за 1 минуту. Это говорит о разнообразии путей к аварии.
известно 32 целевых состояния – модель достаточно хорошо изучила поведение из текущего состояния (богатая статистика).
рейтинг достоверности (отдельный вызов mchain_forecast_reliability) предположим равен 4 – прогнозу можно доверять.
Вывод: Система находится в состоянии с реальной и хорошо обоснованной угрозой аварии. Следует предпринять действия по стабилизации производительности.
9. Рекомендации по мониторингу
Интегрируйте mchain_health_check() в вашу систему мониторинга. Она вернёт статус OK, WARNING или CRITICAL с пояснением, если что-то не так (нет переходов, забывание не работает, высокий рост аварий).
Периодически запрашивайте mchain_reliability_report() для оценки качества модели.
Следите за ситуацией unknown_state – если она возникает часто, это указывает на проблемы со сбором метрик или на появление новых, ранее не виденных комбинаций корреляции/трендов.
Используйте прогнозы как индикатор раннего предупреждения, но решения о переключении режимов работы или автоматическом вмешательстве принимайте с учётом рейтинга достоверности и дополнительных правил (например, только если риск > 0.2 и рейтинг ≥ 3).
ℹ️Таким образом, предоставленная реализация даёт не просто число, а полноценный диагностический пакет, позволяющий оператору или автоматической системе понять, насколько можно доверять прогнозу и каковы его статистические основания.

Postgres DBA
274 поста64 подписчика
Правила сообщества
Пока действуют стандартные правила Пикабу.