Расчет оценки здоровья экземпляра

Оценка здоровья экземпляра помогает быстро оценить состояние экземпляра. Диагностика экземпляра включает оценку:

  • кэш-эффективности,

  • медленных запросов,

  • мертвых строк и раздувания,

  • заполненности диска,

  • возраста транзакций и свежести VACUUM,

  • отставания и доступности реплик.

Здоровье экземпляра рассчитывается по формуле health score = 100 - Σ(penalty * weight), где:

  • 100 — максимальный показатель здоровья экземпляра;

  • penalty — штраф — стоимость нарушения в баллах;

  • weight — вес — коэффициент важности нарушения.

Штрафы начисляются по категориям, у каждой из которых собственный вес:

  • Performance — вес 0.25. Оцениваются следующие показатели: коэффициент попадания в кэш и медленные запросы. После расчета берется наибольшее штрафное значение.

    • Коэффициент попадания в кэш рассчитывается по формуле cache_hit_ratio = blks_hit / (blks_hit + blks_read), где:

      • blks_hit — количество чтений из оперативной памяти;

      • blks_read — количество чтений с диска.

    Штрафы начисляются, если коэффициент ниже 0,99:

    • >= 0.95 — штраф 30 баллов;

    • >= 0.90 — штраф 60 баллов;

    • в ином случае штраф 100 баллов.

    • Медленные запросы рассчитываются по формуле SELECT count(*) FROM pg_stat_statements WHERE mean_exec_time > 1000, где mean_exec_time — среднее время выполнения запроса — дольше 1 секунды (>1000). Считается количество таких запросов.

    Штрафы начисляются, если количество запросов ненулевое:

    • 1-5 — штраф 30 баллов;

    • 6-20 — штраф 60 баллов;

    • больше 20 — штраф 100 баллов.

  • Connections — вес 0.20. Оцениваются следующие показатели: коэффициент попадания в кэш и медленные запросы. После расчета берется наибольшее штрафное значение.

    • Заполнение пула соединений рассчитывается по следующей формуле:

    current_connections = SELECT count(*) FROM pg_stat_activity
    max_connections = SELECT setting::int FROM pg_settings WHERE name = 'max_connections'
    usage_pct = current_connections / max_connections * 100
    
    • current_connections — текущее количество подключений;

    • max_connections — максимальное число одновременных подключений;

    • usage_pct — заполненность пула в процентах.

    Штрафы начисляются, если заполненность пула больше 70%:

    • 70-79 — 20 баллов;

    • 80-89 — 50 баллов;

    • 90-94 — 80 баллов;

    • 95 и больше — 100 баллов.

    • Зависшие транзакции рассчитываются по следующей формуле:

    idle_in_tx = SELECT count(*) FROM pg_stat_activity
    WHERE state = 'idle in transaction'
    AND now() - state_change > interval '30 seconds'
    
    • state_change — время, когда соединение перешло в состояние idle.

    Штрафы начисляются, если количество зависших транзакций ненулевое:

    • 1-3 — 30 баллов;

    • 4-10 — 60 баллов;

    • больше 10 — 100 баллов.

  • Storage — вес 0.20. Оцениваются следующие показатели: мертвые строки, раздувание таблиц и заполненность диска. После расчета берется наибольшее штрафное значение.

    • Доля мертвых строк оценивается по следующей формуле:

    dead_ratio = SELECT max(n_dead_tup::float / nullif(n_live_tup + n_dead_tup, 0))
    FROM pg_stat_user_tables
    WHERE pg_total_relation_size(relid) > 10 * 1024 * 1024
    
    • n_live_tup — количество живых строк в таблице;

    • n_dead_tup — количество мертвых строк в таблице;

    • для расчета берутся таблицы, вес которых больше 10 Мб.

    Штрафы начисляются, если доля мертвых строк больше 0,05:

    • 0,05-0,09 — 30 баллов;

    • 0,1-0,19 — 60 баллов;

    • 0,2 и больше — 100 баллов.

    • Раздувание таблиц. Штрафы начисляются, если коэффициент раздутия больше 19:

      • 20-39 — 30 баллов;

      • 40-59 — 60 баллов;

      • 60 и больше — 100 баллов.

    • Заполненность диска. Информация о заполненности диска берется из log_info. Штрафы начисляются, если заполненность диска больше 69%:

      • 70-79 — 30 баллов;

      • 80-89 — 70 баллов;

      • 90 и больше — 100 баллов.

  • Maintenance — вес 0.20. Оцениваются следующие показатели: возраст транзакций и давность последнего VACUUM. После расчета берется наибольшее штрафное значение.

    • Возраст транзакций рассчитываются по формуле xid_age = SELECT max(age(datfrozenxid)) FROM pg_database, где age(datfrozenxid) — разница между текущим и самым старым XID.

Штрафы начисляются, если возраст транзакций больше 500 млн:

  • 500 млн-1 млрд — 30 баллов;

  • 1 млрд-1,5 млрд — 60 баллов;

  • 1,5 млрд и больше — 100 баллов.

  • Давность последнего VACUUM рассчитывается по следующей формуле:

    last_vacuum_hours = SELECT max(EXTRACT(EPOCH FROM (now() - greatest(last_vacuum, last_autovacuum))) / 3600)
    FROM pg_stat_user_tables
    WHERE pg_total_relation_size(relid) > 10 * 1024 * 1024
    

    Штрафы начисляются, если последний VACUUM выполнялся больше 24 часов назад:

    • 24-71 — 20 баллов;

    • 72-167 — 50 баллов;

    • 168 часов и больше — 100 баллов.

  • Replication — вес 0.15. Оцениваются следующие показатели: отставание реплик и доступность реплик. После расчета берется наибольшее штрафное значение.

    • Отставание реплик рассчитывается по двум показателям:

      • max_lag_seconds — максимальный replay_lag среди реплик — временная задержка применения WAL на реплике;

      • max_lag_bytes — максимальный pending_lag среди реплик — объем не примененных данных.

    Штрафы начисляются, если max_lag_seconds > 1с и max_lag_bytes > 1MB:

    • max_lag_seconds < 5с и max_lag_bytes < 10MB — 30 баллов;

    • max_lag_seconds < 30с и max_lag_bytes < 100MB — 30 баллов;

    • max_lag_seconds > 30с и max_lag_bytes > 100MB — 100 баллов

    • Доступность рассчитывается по количеству реплик с state != „streaming“. Штраф начисляется, если есть хоть одна такая реплика — 80 баллов.

Итоговый расчет будет выглядеть следующим образом:

100 - (штраф за Performance*0.25 + штраф за Connections*0.20 + штраф за Storage*0.20 + штраф за Maintenance*0.20 + штраф за Replication*0.15).

После расчета по формуле получается здоровье экземпляра в оценке по шкале от 1 до 100:

  • 0-34 — критическое состояние;

  • 35-59 — есть серьезные проблемы;

  • 60-74 — есть проблемы;

  • 75-84 — есть незначительные проблемы;

  • 85-100 — все хорошо.