在 CentOS 下监控 PostgreSQL 性能,可以从 系统层 + 数据库层 + 第三方工具 三个维度来做。下面按实用程度给你一个完整方案。
top
htop # 推荐,需安装
vmstat 1
iostat -x 1
关注点:
%iowait 是否高iostat -x 1
重点看:
await(IO 等待)svctm%utilSELECT * FROM pg_stat_activity;
常用字段:
state(active / idle)queryquery_startwait_event查看慢查询:
SELECT pid, now() - query_start, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY 2 DESC;
SELECT * FROM pg_stat_user_tables;
关注:
seq_scan / idx_scann_tup_ins / n_tup_upd / n_tup_del索引使用情况:
SELECT * FROM pg_stat_user_indexes;
SELECT * FROM pg_stat_database;
重点:
numbackends(连接数)tup_returnedtup_fetchedblks_read / blks_hit(缓存命中率)yum install pg_top
pg_top -h localhost -p 5432 -U postgres
可看到:
编辑 postgresql.conf:
log_min_duration_statement = 500 # 超过 500ms 记录
logging_collector = on
log_directory = 'pg_log'
重启 PostgreSQL:
systemctl restart postgresql
yum install pgbadger
pgbadger /var/lib/pgsql/13/data/pg_log/*.log -o report.html
功能:
组件:
postgres_exporter可监控:
✅ 连接数是否过多
✅ 是否有慢 SQL
✅ 是否有大量 seq_scan
✅ 缓存命中率是否 > 99%
✅ IO 是否瓶颈
✅ 是否有死锁或等待事件
-- 当前活动 SQL
SELECT * FROM pg_stat_activity;
-- 表扫描情况
SELECT relname, seq_scan, idx_scan FROM pg_stat_user_tables;
-- 缓存命中率
SELECT blks_hit::float / (blks_hit + blks_read) FROM pg_stat_database;
-- 当前锁
SELECT * FROM pg_locks;
如果你愿意,我可以:
你现在是在 生产环境 还是 测试环境?