Debian 上 PostgreSQL “慢”通常不是 PostgreSQL 本身的问题,而是系统配置、资源、参数或 workload 不匹配导致的。下面按常见原因分类说明,并给出排查方法。
Debian 安装 PostgreSQL 后,默认参数适合“小机器”:
| 参数 | Debian 默认值 | 问题 |
|---|---|---|
shared_buffers |
128MB | 太小 |
work_mem |
4MB | 排序/哈希容易落盘 |
effective_cache_size |
4GB(估的) | 优化器误判 |
max_connections |
100 | 高并发时上下文切换多 |
✅ 解决:
shared_buffers = 25% RAM
effective_cache_size = 50–75% RAM
work_mem = 16–64MB(看并发)
maintenance_work_mem = 512MB–2GB
PostgreSQL 是 I/O 密集 + fsync 敏感 的数据库。
常见慢点:
wal 和数据盘混用✅ 检查:
iostat -x 1
看 %util、await
✅ 建议:
如果你是:
可以调:
synchronous_commit = off
⚠️ 生产环境慎用
这是“看起来数据库慢”的真凶。
✅ 检查慢查询:
SELECT * FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
✅ 看执行计划:
EXPLAIN ANALYZE your_query;
常见错误:
LIKE '%xxx%'WHERE lower(col)=...)症状:
✅ 检查:
SELECT relname, n_dead_tup, last_autovacuum
FROM pg_stat_user_tables;
✅ 调优:
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.02
free -h
如果 PostgreSQL 被 swap,性能暴跌。
✅ 减少 swap:
sysctl vm.swappiness=10
PostgreSQL 不建议开启 THP
cat /sys/kernel/mm/transparent_hugepage/enabled
✅ 关闭:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
max_connections=100 + 应用无连接池
→ 大量 idle 连接
✅ 使用:
# CPU / IO
top
iostat -x 1
# PostgreSQL
psql -c "SELECT * FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;"
psql -c "SELECT datname, numbackends FROM pg_stat_database;"
你可以补充:
我可以直接帮你给出针对性调优参数。