Анализ производительности кластера
Оцените hit ratio (коэффициент попаданий в кэш) ^psql-DML-hit-ratio
- показывающая, насколько часто запрашиваемые данные находятся в кэше, а не приходится читать их с более медленного носителя (например, с диска).
SELECT
datname,
blks_read,
blks_hit,
round(blks_hit::numeric / (blks_hit + blks_read) * 100, 2) AS hit_ratio_percent
FROM pg_stat_database
WHERE datname NOT IN ('template0', 'template1')
ORDER BY datname;- > 99% — отличный результат, кэш работает эффективно.
- 95–99% — приемлемо.
Активные сессии ^psql-DML-ActiveSessions
SELECT * FROM pg_stat_activity;Количество сессий, в которых создана хотя бы одна временная таблица ^psql-DML-getSession-withTMPTabs
SELECT COUNT(DISTINCT a.pid) AS sessions_with_temp_tables
FROM pg_stat_activity a
JOIN pg_class c
ON c.relowner = a.usesysid
AND c.relnamespace IN (
SELECT oid
FROM pg_namespace
WHERE nspname LIKE 'pg_temp_%'
)
WHERE a.backend_type = 'client backend'
AND c.relpersistence = 't';Сколько временных файлов создаётся ^psql-DML-Create-tmpFiles
SELECT
datname,
temp_files,
pg_size_pretty(temp_bytes) AS temp_bytes_pretty
FROM pg_stat_database
WHERE datname NOT IN ('template0', 'template1');- Если
temp_files > 0и растёт — возможно, не хватаетwork_mem, а неtemp_buffers. temp_buffersвлияет только на буферизацию страниц временных таблиц, но не на сортировки/хеши.
Анализ размеров временных таблиц ^psql-DML-tmpTabsize
-- Показать все временные таблицы в текущей сессии
SELECT
n.nspname AS schema,
c.relname AS table_name,
pg_size_pretty(pg_total_relation_size(c.oid)) AS size,
pg_total_relation_size(c.oid) AS size_bytes
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relpersistence = 't'
AND n.nspname LIKE 'pg_temp_%';-- Вне сеанса придется анализировать косвенноТак же через OS FS
# Найти временные файлы PostgreSQL
ls -lh $PGDATA/base/*/pgsql_tmp/
# - Отсутствие файлов в `pgsql_tmp` не означает, что временных таблиц нет.
# - Наличие больших файлов — сигнал, что `temp_buffers` может быть слишком мал.Физическое использование диска и памяти на уровне ОС ^psql-DML-phuse-disk-and-ram
SELECT
query,
reads, -- чтение с диска (блоков)
writes, -- запись на диск
user_time,
system_time
FROM pg_stat_kcache
WHERE query ILIKE '%create%temp%table%';- Высокие
writesмогут указывать на то, что данные не помещаются в память (возможно, малtemp_buffersилиwork_mem).
Проверить, что VACUUM работает ^psql-DML-checkVacuum
-- Статистика по таблицам
SELECT schemaname, tablename,
n_tup_ins, n_tup_upd, n_tup_del,
n_dead_tup,
last_autovacuum
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
-- Прогресс выполнения VACUUM
SELECT * FROM pg_stat_progress_vacuum;