Расчет оценки здоровья экземпляра
Оценка здоровья экземпляра помогает быстро оценить состояние экземпляра. Диагностика экземпляра включает оценку:
кэш-эффективности,
медленных запросов,
мертвых строк и раздувания,
заполненности диска,
возраста транзакций и свежести 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 — все хорошо.