Ubuntu下PostgreSQL性能优化实用指南
一 基线与环境准备
psql -U postgres -c "SELECT version();" 验证服务与连通性。为安全与可维护,建议仅在内网开放 5432 端口,并按需配置 listen_addresses 与 pg_hba.conf。二 关键配置参数建议
shared_buffers:建议设为物理内存的 约 25%(上限通常不超过 8GB,视总内存而定)。effective_cache_size:建议设为物理内存的 约 50%,用于成本估计,不占用实际内存;值偏大更易触发 索引扫描。min_wal_size / max_wal_size:建议 1GB / 4GB,在崩溃恢复时间与 WAL 占用间折中。checkpoint_completion_target:建议 0.9,平滑写入、降低 I/O 抖动。wal_buffers:建议 16MB,短事务密集时可适度上调。work_mem:按并发与查询特征调优;经验值为 几十 MB 起,避免过大导致内存压力(总占用≈work_mem×并发排序/哈希操作数)。maintenance_work_mem:建议 2GB 或更高(创建索引、VACUUM 等维护受益明显)。max_connections:默认 100;谨慎增加,优先通过连接池(如 PgBouncer)复用连接,避免连接风暴与内存膨胀。示例(仅示意,需结合实例内存与应用实测微调):
shared_buffers = '4GB' # 约 25% 物理内存示例
effective_cache_size = '8GB' # 约 50% 物理内存示例
work_mem = '32MB' # 结合并发与查询特征调整
maintenance_work_mem = '2GB'
min_wal_size = '1GB'
max_wal_size = '4GB'
checkpoint_completion_target = 0.9
wal_buffers = '16MB'
三 查询与索引优化
EXPLAIN (ANALYZE, BUFFERS) 定位瓶颈;避免 **SELECT ***,仅返回必要列;在合适场景用 JOIN 替代复杂子查询;确保 WHERE/JOIN 条件列有合适索引。ANALYZE 更新统计信息;对高变更表按需 VACUUM/VACUUM FULL 或重建索引(REINDEX);监控 pg_stat_user_indexes.idx_scan 等判断索引利用率。四 Ubuntu与系统层优化
ulimit -n//etc/security/limits.conf)。五 压测与变更流程
pgbench -i -s 20 pgbenchdb 初始化;pgbench -r -j4 -c4 -T60 testdb 运行 60 秒压测;对比 TPS、平均延迟、检查点频率、IOPS 等指标。shared_buffers、work_mem、max_wal_size 等敏感参数尤其需要灰度与回看监控。