在 Debian 上 PostgreSQL 占用资源(CPU / 内存 / 磁盘 I/O)过高,通常不是 PostgreSQL 本身“有 bug”,而是配置、负载或环境导致的。下面按最常见原因 → 排查方法 → 解决建议来系统说明。
PostgreSQL 默认配置偏向“小机器”,但 Debian 上如果直接用于生产,很容易出问题。
关键参数:
shared_bufferswork_memmaintenance_work_memeffective_cache_size典型问题:
shared_buffers 设太大 → 系统内存被占满work_mem 设太大 → 并发查询时内存爆炸work_mem = 内存爆炸✅ 建议:
shared_buffers = 25% 内存
work_mem = 4MB~16MB
maintenance_work_mem = 512MB~1GB
effective_cache_size = 50%~75% 内存
PostgreSQL 是进程模型(一个连接 = 一个进程)。
现象:
ps aux | grep postgres 一堆进程✅ 排查:
SELECT count(*) FROM pg_stat_activity;
✅ 解决:
max_connections这是 CPU 和 I/O 高的最大元凶之一。
✅ 查慢查询:
SELECT * FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
(需启用 pg_stat_statements)
✅ 解决:
SELECT *LIKE '%xx%'表膨胀 → 扫描变慢 → CPU/IO 高。
✅ 检查:
SELECT relname, n_dead_tup, last_autovacuum
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
✅ 解决:
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.02
Debian + PostgreSQL 在:
容易 I/O wait 高。
✅ 排查:
iostat -x 1
✅ 解决:
checkpoint_timeoutlog_min_duration_statement = 0 或 debug 日志会拖死性能。
✅ 检查:
logging_collector = on
log_min_duration_statement = 1000
✅ 建议:
free -h
swapon --show
# 查看 PostgreSQL 进程
ps aux | grep postgres
# 查看实时负载
top -p $(pgrep -d',' postgres)
# 查看慢查询
SELECT pid, query, state, now()-query_start AS dur
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY dur DESC;
你可以补充:
psql --version)cat /etc/os-release)我可以直接帮你看配置 + 给一份优化方案。