Мониторинг и анализ
Неплохой мониторинг из коробки может предоставить заббикс: https://www.zabbix.com/integrations/postgresql
Много каких-то умных графиков, в которых я нихрена не понимаю
https://sematext.com/blog/postgresql-performance-tuning/
Как вообще работает постгря?
Важно партиционирование и индексы. Надо нарезать большие таблицы на более мелкие (партиционировать их) и создавать индексы для столбцов, которые чаще всего используются. Но не стоит переусердствовать с индексами.
Куда смотреть на мониторинге? Как мониторить? Что мониторить?
Понятное дело, надо мониторить саму железку. Сеть, проц, озу, нагрузку на диски. Советую настроить мониторинг тем же заббиксом, там из коробки мониторится много полезных параметров.
Мониторим запросы, таблицы, индексы
Можно накостылять такой скриптец и поместить его в крон:
#!/bin/bash
result=$(sudo -u postgres psql -c "select query_start, state, query from pg_stat_activity where (state = 'idle in transaction') and xact_start is not null and (now() - pg_stat_activity.query_start) > interval '1 minutes';")
echo $result | grep '0 rows' && exit
echo ok
echo $result >> /root/log
Лучше будет включить логгирование медленных запросов (src)
log_min_duration_statement = 1000 # миллисекунды
logging_collector = on
log_directory = 'pg_log'
Обязателен перезапуск базы, pg_reload_conf()
не поможет. На лету можно только длительность запроса менять. Если нельзя перезапускать, то придется жить с костылем.
Посмотрим еще размер таблиц:
SELECT
table_name,
pg_size_pretty( pg_total_relation_size(quote_ident(table_name))),
pg_total_relation_size(quote_ident(table_name))
FROM
information_schema.tables
WHERE
table_schema = 'public' and table_catalog = 'URDATABASE'
ORDER BY
pg_total_relation_size(quote_ident(table_name)) DESC;
Если есть что-то сильно жирное - надо партиционировать.
Смотрим индексы
\d table
\di+
Смотрим всякие значения
- Cache Hit Rate
Будет прекрасно, если hit rate будет около 99%. Смотреть вот так (предварительно зайти в нужную базу):
SELECT
sum(heap_blks_read) as heap_read,
sum(heap_blks_hit) as heap_hit,
sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio
FROM
pg_statio_user_tables;
- Index Usage
SELECT
relname,
100 * idx_scan / (seq_scan + idx_scan) percent_of_times_index_used,
n_live_tup rows_in_table
FROM
pg_stat_user_tables
WHERE
seq_scan + idx_scan > 0
ORDER BY
n_live_tup DESC;