PostgreSQL 常用性能优化配置文档
文档说明:本文档整理PostgreSQL(12+ 版本)生产环境常用优化配置,参数推荐值基于通用服务器配置(CPU、内存、磁盘)划分,可根据实际硬件性能、业务场景(Web应用、读写密集、写入密集等)微调,所有配置均适配现代PG版本,废弃旧版无效参数。
一、核心配置(必调参数)
1. 内存配置(影响缓存效率,最核心)
| 参数名称 |
参数说明 |
推荐配置(按服务器内存划分) |
注意事项 |
| shared_buffers |
PG用于缓存数据和索引的共享内存区域,直接影响查询性能 |
16G内存:8GB;32G内存:16GB;64G内存:32GB~48GB |
现代PG无需限制8GB,建议设为系统内存的50%~75%,越大缓存效果越好 |
| effective_cache_size |
PG估计的操作系统文件系统缓存大小,用于优化查询计划 |
16G内存:12GB;32G内存:24GB;64G内存:48GB |
建议设为系统内存的75%,无需超过实际内存 |
| work_mem |
单个查询操作(排序、聚合等)可使用的内存量,超出则落盘 |
16G内存(100连接):16MB;32G内存(200连接):32MB;64G内存(300连接):64MB |
计算公式:work_mem = 机器内存 / max_connections × 0.1~0.2,避免过大导致内存溢出 |
| maintenance_work_mem |
用于维护操作(VACUUM、CREATE INDEX、ALTER TABLE等)的内存量 |
16G内存:1GB;32G内存:2GB;64G内存:4GB |
内存充足时可适当增大,加速维护操作,避免过小导致维护缓慢 |
2. 连接与并发配置(避免连接瓶颈)
| 参数名称 |
参数说明 |
推荐配置(按CPU核心划分) |
注意事项 |
| max_connections |
允许同时连接到数据库的最大连接数,PG为进程模型,连接过多会导致上下文切换频繁 |
8核CPU:100;16核CPU:200;32核CPU:300~400 |
建议设为CPU核心数×10,结合应用侧连接池大小(应用连接池≈CPU核心数×2) |
| idle_in_transaction_session_timeout |
自动清理长时间处于空闲状态的事务会话,避免占用连接 |
300000(单位:毫秒,即5分钟) |
防止长事务占用连接,导致连接池打满 |
3. WAL写入配置(提升写入性能,避免抖动)
| 参数名称 |
参数说明 |
推荐配置 |
注意事项 |
| wal_buffers |
用于写入WAL(预写日志)的内存缓冲区,减少磁盘IO |
16MB~64MB |
内存充足时设为64MB,提升写入效率 |
| max_wal_size |
替代旧版checkpoint_segments,控制WAL日志最大容量,决定检查点频率 |
8GB~16GB |
增大可减少检查点频率,提升性能,但会增加数据库恢复时间 |
| min_wal_size |
WAL日志最小保留容量,避免频繁创建和删除WAL文件 |
4GB |
与max_wal_size配合使用,保持WAL文件稳定 |
| wal_compression |
启用WAL日志压缩,减少磁盘占用和IO压力 |
on(开启) |
SSD磁盘启用后性能提升明显,几乎不影响CPU开销 |
| checkpoint_completion_target |
控制检查点完成时间占两次检查点间隔的比例,平滑检查点过程 |
0.9 |
避免检查点期间IO突增,导致服务抖动 |
二、基础优化配置(推荐开启)
1. 磁盘IO优化(适配SSD/HDD)
| 参数名称 |
参数说明 |
推荐配置(按磁盘类型) |
| random_page_cost |
PG估计随机访问磁盘的成本,影响查询计划选择 |
SSD:1.1~1.5;HDD:4.0~5.0 |
| effective_io_concurrency |
控制PG可同时发起的IO请求数,提升磁盘IO吞吐量 |
SSD:200;HDD:10~20 |
2. 并行查询优化(多核CPU必开)
| 参数名称 |
参数说明 |
推荐配置(按CPU核心划分) |
| max_parallel_workers |
全局最大并行工作线程数 |
8核:8;16核:16;32核:32 |
| max_parallel_workers_per_gather |
单个查询可使用的最大并行工作线程数 |
8核:4;16核:8;32核:16 |
| max_parallel_maintenance_workers |
维护操作(如VACUUM、CREATE INDEX)可使用的并行线程数 |
8核:2;16核:4;32核:8 |
3. 自动清理(VACUUM)配置(避免数据膨胀)
| 参数名称 |
参数说明 |
推荐配置 |
| autovacuum |
启用自动清理功能,回收无用数据、更新统计信息 |
on(开启) |
| autovacuum_max_workers |
同时运行的自动清理工作线程数 |
4~8(根据CPU核心数调整) |
| autovacuum_naptime |
自动清理进程的休眠间隔,缩短间隔可及时清理 |
1s(高并发场景);5s(普通场景) |
| autovacuum_vacuum_scale_factor |
触发自动清理的脏数据比例阈值 |
0.02(即2%,高写入场景可设为0.01) |
4. 日志与慢查询配置(便于问题排查)
| 参数名称 |
参数说明 |
推荐配置 |
| log_min_duration_statement |
记录执行时间超过该值的SQL语句,用于定位慢查询 |
100ms(高并发场景可设为50ms) |
| log_checkpoints |
记录检查点相关信息,便于排查IO抖动问题 |
on(开启) |
| log_lock_waits |
记录锁等待超时的信息,排查锁竞争问题 |
on(开启) |
| log_temp_files |
记录临时文件生成情况,排查查询落盘问题 |
0(记录所有临时文件) |
三、补充配置(按需调整)
| 参数名称 |
参数说明 |
推荐配置 |
适用场景 |
| huge_pages |
启用大页内存,减少内存页表开销,提升缓存效率 |
on(开启) |
内存≥16GB的服务器 |
| bgwriter_delay |
后台写入进程的休眠间隔,控制脏页写入频率 |
10ms |
高写入场景,减少IO堆积 |
| temp_buffers |
单个会话用于临时表的内存缓冲区 |
8MB~16MB |
频繁使用临时表的业务场景 |
四、配置说明与注意事项
所有配置均适用于PostgreSQL 12及以上版本,旧版本(≤9.4)需调整(如替换废弃参数)。
配置修改后,需重启PostgreSQL服务生效(部分参数可通过pg_reload_conf()在线重载)。
推荐值仅为通用参考,实际配置需结合:服务器硬件(CPU、内存、磁盘)、业务QPS、读写比例、查询复杂度调整。
避免盲目增大参数(如max_connections、work_mem),否则可能导致内存溢出、CPU负载过高。
配置后需监控数据库性能(如连接数、缓存命中率、慢查询、IO使用率),根据监控结果微调。
五、其他
- 在线工具:可以使用PGTune在线生成配置,输入服务器参数和业务场景,获取推荐配置。
- 参考文档:PostgreSQL官方文档提供了详细的参数说明和调优建议,建议结合官方文档进行深入理解和调整。