在 CentOS 上 PostgreSQL 很慢,通常不是单一原因,而是系统配置 + 数据库配置 + 硬件/IO 共同影响。下面按最常见原因 → 排查方法 → 解决建议给你一个系统性的清单。
CentOS 默认安装 PostgreSQL 后,配置是极低性能模式。
shared_buffers 很小(默认 128MB)work_mem 很小(4MB)effective_cache_size 没设置wal_buffers 太小✅ 解决示例(16G 内存服务器):
shared_buffers = 4GB
work_mem = 64MB
maintenance_work_mem = 1GB
effective_cache_size = 12GB
wal_buffers = 16MB
PostgreSQL 对 磁盘随机写 非常敏感。
iostat -x 1
重点看:
%util 接近 100%await 很高(>10ms)✅ 建议
表膨胀会直接导致:
SELECT relname, n_dead_tup
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
✅ 解决
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.05
EXPLAIN ANALYZE your_sql;
如果看到:
✅ 解决
LIKE '%xx'SELinux 会显著拖慢 PostgreSQL 文件访问。
getenforce
✅ 建议(生产可谨慎关闭)
setenforce 0
连接慢 ≠ 查询慢
# postgresql.conf
log_hostname = off
✅ 或 /etc/hosts 加上客户端 IP
PostgreSQL 官方不推荐 THP
cat /sys/kernel/mm/transparent_hugepage/enabled
✅ 关闭
echo never > /sys/kernel/mm/transparent_hugepage/enabled
vm.swappiness = 10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
1. iostat -x 1 # 看磁盘
2. top / htop # 看 CPU
3. free -m # 看内存
4. EXPLAIN ANALYZE # 看 SQL
5. pg_stat_activity # 看锁
你可以补充:
我可以直接帮你给一份 可落地的 postgresql.conf 优化模板。