在 CentOS 上 PostgreSQL 变慢通常不是单一原因,而是多个环节叠加。下面按最常见 → 容易被忽视的顺序给你一个系统排查思路。
在 CentOS 上最常见的是:
查看命令:
top
free -h
iostat -x 1
重点关注:
swap 是否在使用%util(磁盘)是否接近 100%wa(IO等待)是否很高✅ 建议:
shared_buffersCentOS 默认安装 PostgreSQL 后,参数非常保守。
关键参数(postgresql.conf):
shared_buffers = 25% 内存
work_mem = 16MB~64MB(视并发)
effective_cache_size = 50%~75% 内存
max_connections = 不要太大(100~300)
查看当前配置:
SHOW shared_buffers;
SHOW work_mem;
✅ 改完记得:
systemctl restart postgresql
这是生产环境慢的第一大原因。
查看慢查询:
SELECT * FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
开启慢日志(postgresql.conf):
log_min_duration_statement = 500
✅ 常见 SQL 问题:
LIKE '%xx%'ORDER BY / GROUP BY用 EXPLAIN ANALYZE 看执行计划。
CentOS 默认开启 THP,PostgreSQL 官方明确建议关闭。
查看:
cat /sys/kernel/mm/transparent_hugepage/enabled
关闭:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
(需写入开机脚本)
虽然 SELinux 一般不会直接让 SQL 慢,但:
可临时测试:
setenforce 0
psql 登录卡检查:
getent hosts 主机名
✅ 建议:
pg_hba.conf 用 IPlog_hostname = off
PostgreSQL 的 MVCC 会导致:
检查:
SELECT relname, n_dead_tup
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
解决:
VACUUM ANALYZE;
大表用:
VACUUM (FULL) 表名; -- 会锁表
✅ 建议开启 autovacuum(默认开,但参数可能太弱)
ANALYZE;
top
free -h
iostat -x 1
systemctl status postgresql
psql -c "SELECT * FROM pg_stat_activity WHERE state='active';"
你可以直接贴:
postgresql.conf 关键参数EXPLAIN ANALYZE 结果我可以直接帮你定位到具体原因 + 修改方案。