PostgreSQL 18 配置参数详解
系统梳理 PostgreSQL 18 的核心配置参数,覆盖内存、连接、WAL、检查点、查询规划、并行、日志与 autovacuum 等维度。每个参数给出默认值(实测)、作用说明与生产环境调优建议,为参数调优提供参考手册
PostgreSQL 18 配置参数详解
目标:系统梳理 PostgreSQL 18 的核心配置参数,覆盖内存、连接、WAL、检查点、查询规划、并行、日志与 autovacuum 等维度。每个参数给出默认值(实测)、作用说明与生产环境调优建议,为参数调优提供参考手册。
环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- 系统架构:x86_64
- PostgreSQL 版本:18.6-1.pgdg22.04+2
- 主配置文件:
/etc/postgresql/18/main/postgresql.conf - 数据目录:
/var/lib/postgresql/18/main
💡 说明:下表中"默认值(实测)"均来自 PostgreSQL 18.6 全新初始化集群(无任何自定义配置)的
SHOW查询结果,"单位"为该默认值对应的pg_settings.unit。
参数总览
| 分类 | 参数名称 | 默认值(实测) | 是否需要重启 | 说明 |
|---|---|---|---|---|
| 内存 | shared_buffers | 128MB | 是 | 共享缓冲区大小,缓存数据页 |
| 内存 | effective_cache_size | 4GB | 否 | 规划器评估操作系统+数据库缓存总量 |
| 内存 | work_mem | 4MB | 否 | 单次排序/哈希操作的内存上限 |
| 内存 | maintenance_work_mem | 64MB | 否 | 维护操作(VACUUM/CREATE INDEX)内存 |
| 内存 | wal_buffers | 4MB(512×8kB) | 是 | WAL 写入缓冲 |
| 内存 | temp_buffers | 8MB(1024×8kB) | 否 | 每个会话的临时表缓存 |
| 内存 | huge_pages | try | 是 | 大页内存使用策略 |
| 连接 | max_connections | 100 | 是 | 最大并发连接数 |
| 连接 | tcp_keepalives_idle | 0 | 否 | TCP keepalive 空闲时间(0=用系统默认) |
| 连接 | idle_in_transaction_session_timeout | 0 | 否 | 空闲事务超时(0=禁用) |
| 连接 | statement_timeout | 0 | 否 | 单条语句执行超时(0=禁用) |
| 连接 | lock_timeout | 0 | 否 | 等待锁超时(0=禁用) |
| 连接 | max_locks_per_transaction | 64 | 是 | 单事务可持有的锁数量 |
| 连接 | max_prepared_transactions | 0 | 是 | 两阶段提交预备事务数(0=禁用) |
| WAL | wal_level | replica | 是 | WAL 记录级别 |
| WAL | synchronous_commit | on | 否 | 同步提交级别 |
| WAL | fsync | on | 是 | 是否强制刷盘(保证持久性) |
| WAL | full_page_writes | on | 是 | 检查点后首次修改是否写整页 |
| WAL | max_wal_size | 1GB | 否 | 触发自动检查点的 WAL 上限 |
| WAL | min_wal_size | 80MB | 否 | WAL 回收目标下限 |
| WAL | wal_keep_size | 0 | 是 | 为备库保留的 WAL 量(0=不额外保留) |
| WAL | max_wal_senders | 10 | 是 | 最大 WAL 发送进程数(流复制) |
| 检查点 | checkpoint_timeout | 300s(5min) | 否 | 检查点触发时间间隔 |
| 检查点 | checkpoint_completion_target | 0.9 | 否 | 检查点完成的分散比例 |
| 查询规划 | seq_page_cost | 1 | 否 | 顺序页读取成本(相对值) |
| 查询规划 | random_page_cost | 4 | 否 | 随机页读取成本(相对值) |
| 查询规划 | default_statistics_target | 100 | 否 | 统计信息采样目标 |
| 并行 | max_worker_processes | 8 | 是 | 后台 worker 进程总数上限 |
| 并行 | max_parallel_workers | 8 | 是 | 并行查询可用 worker 上限 |
| 并行 | max_parallel_workers_per_gather | 2 | 否 | 单个 Gather 节点的 worker 数 |
| 并行 | max_parallel_maintenance_workers | 2 | 否 | 维护操作并行 worker 数 |
| 日志 | logging_collector | off | 否 | 是否启用日志收集进程 |
| 日志 | log_min_duration_statement | -1 | 否 | 慢查询阈值(-1=禁用) |
| 日志 | log_line_prefix | %m [%p] %q%u@%d | 否 | 日志行前缀格式 |
| autovacuum | autovacuum | on | 否 | 是否启用自动清理 |
| autovacuum | autovacuum_max_workers | 3 | 是 | 自动清理并发 worker 数 |
| autovacuum | autovacuum_naptime | 60s | 否 | 自动清理休眠间隔 |
| autovacuum | autovacuum_vacuum_scale_factor | 0.2 | 否 | 触发 VACUUM 的死亡行比例 |
| autovacuum | autovacuum_analyze_scale_factor | 0.1 | 否 | 触发 ANALYZE 的行变更比例 |
| 其他 | jit | on | 否 | JIT 编译(LLVM)开关 |
| 其他 | dynamic_shared_memory_type | posix | 是 | 动态共享内存实现方式 |
一、内存相关参数
1. shared_buffers(共享缓冲区)
- 默认值:128MB
- 单位:8kB 块(实测
16384 × 8kB = 128MB) - 是否需要重启:是
- 作用:PostgreSQL 用于缓存表和索引数据页的共享内存区域,是所有后端进程共享的核心缓存。
SHOW shared_buffers;
-- 128MB
💡 调优建议:一般设置为物理内存的 25% 左右(PostgreSQL 官方推荐)。例如 32GB 内存的服务器可设为 8GB。过大会占用操作系统页缓存,反而可能降低性能;过小则频繁触发磁盘 I/O。
2. effective_cache_size(有效缓存大小)
- 默认值:4GB
- 单位:8kB 块(实测
524288 × 8kB = 4GB) - 是否需要重启:否
- 作用:向查询规划器提示操作系统页缓存 +
shared_buffers的总缓存量估计值。它不实际分配内存,只影响规划器对索引扫描/顺序扫描的成本判断。
SHOW effective_cache_size;
-- 4GB
💡 调优建议:设置为操作系统可用内存的大约 50%~75%(含
shared_buffers)。该值越高,规划器越倾向于使用索引扫描。
3. work_mem(工作内存)
- 默认值:4MB
- 单位:kB(实测
4096 kB) - 是否需要重启:否
- 作用:每个查询操作(排序、哈希表、哈希 join 等)在写入临时磁盘文件前可使用的内存上限。注意是按每个操作、而非每个查询分配,复杂查询可能同时占用多个
work_mem。
SHOW work_mem;
-- 4MB
⚠️ 风险提示:
work_mem会被多个并发操作同时消耗。若设置过大(如 1GB),在大量并发排序场景下可能迅速耗尽服务器内存导致 OOM。
💡 调优建议:从小值开始(如 8~64MB),通过
EXPLAIN ANALYZE观察排序是否溢出到磁盘(Sort Method: external merge)来逐步调整。
4. maintenance_work_mem(维护工作内存)
- 默认值:64MB
- 单位:kB(实测
65536 kB) - 是否需要重启:否
- 作用:用于维护操作(
VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)的最大内存。
SHOW maintenance_work_mem;
-- 64MB
💡 调优建议:可设置较大(如 512MB~1GB),因为维护操作通常串行执行且不常发生,增大可显著加速大表索引创建。
5. wal_buffers(WAL 缓冲)
- 默认值:4MB(实测
512 × 8kB) - 单位:8kB 块
- 是否需要重启:是
- 作用:尚未写入 WAL 文件、暂存于内存的 WAL 记录缓冲区。
SHOW wal_buffers;
-- 512kB (此处显示为 -1 之外的块数换算;SHOW 默认显示 512kB 或等效值,实际按块分配)
💡 调优建议:默认值对多数场景足够。大量并发写入时可适当增加到 16MB,但需重启生效。
6. temp_buffers(临时缓冲)
- 默认值:8MB(实测
1024 × 8kB) - 单位:8kB 块
- 是否需要重启:否
- 作用:每个会话用于临时表的缓存。此内存在首次使用临时表时才按需从会话分配。
💡 调优建议:默认值通常足够,除非应用大量使用临时表。
二、连接相关参数
7. max_connections(最大连接数)
- 默认值:100
- 是否需要重启:是
- 作用:允许同时连接的最大客户端数量。
SHOW max_connections;
-- 100
⚠️ 风险提示:增大该值会同时增大
shared_buffers之外的内存开销(每连接约数 MB 的私有内存),需同步评估shared_buffers与work_mem。
💡 调优建议:生产环境常配合连接池(PgBouncer)使用,将并发连接收敛到数百以内。
8. 超时类参数(idle / statement / lock timeout)
| 参数 | 默认值 | 作用 |
|---|---|---|
idle_in_transaction_session_timeout | 0(禁用) | 事务开启后空闲超过该时长则终止会话 |
statement_timeout | 0(禁用) | 单条 SQL 执行超过该时长则终止 |
lock_timeout | 0(禁用) | 等待行/表锁超过该时长则报错退出 |
SHOW idle_in_transaction_session_timeout; -- 0
SHOW statement_timeout; -- 0
SHOW lock_timeout; -- 0
💡 调优建议:
idle_in_transaction_session_timeout建议设置(如 5min),防止"空闲事务"长期持有锁与连接、阻塞 VACUUM。statement_timeout面向 OLTP 可设 30s~5min,防止慢查询拖垮系统。lock_timeout建议设置(如 10s),让等待锁的语句快速失败而非无限等待。
9. max_locks_per_transaction(单事务锁上限)
- 默认值:64
- 是否需要重启:是
- 作用:单个事务可持有的锁对象数量上限(共享锁表按
max_connections × max_locks_per_transaction预分配)。
💡 调优建议:默认值足够。遇到
out of shared memory锁相关错误时再增加。
10. tcp_keepalives_idle(TCP keepalive)
- 默认值:0(使用系统默认)
- 是否需要重启:否
- 作用:TCP 连接空闲多久后发送 keepalive 探测包。用于探测断开的连接。
💡 调优建议:在有 NAT/防火墙断连的环境下,可设置为 60 秒以避免半开连接积压。
三、WAL(预写日志)相关参数
11. wal_level(WAL 级别)
- 默认值:replica
- 是否需要重启:是
- 作用:控制 WAL 中记录信息的详细程度。可选
minimal/replica/logical。
SHOW wal_level;
-- replica
💡 说明:
replica支持流复制与 PITR(时间点恢复);logical额外支持逻辑复制与逻辑解码(CDC)。需要逻辑复制时改为logical,需重启。
12. fsync(强制刷盘)
- 默认值:on
- 是否需要重启:是
- 作用:确保事务提交时 WAL 真正写入磁盘,是崩溃后数据不丢失(持久性)的关键保障。
⚠️ 风险提示:关闭
fsync可显著提升写入性能,但崩溃或断电可能导致数据丢失。生产环境严禁关闭,仅在可接受数据丢失的批处理测试中考虑。
13. synchronous_commit(同步提交)
- 默认值:on
- 是否需要重启:否
- 作用:控制在返回客户端"提交成功"前,是否等待 WAL 刷盘。
SHOW synchronous_commit;
-- on
💡 调优建议:
on最安全;remote_write/local/off可提升吞吐但降低持久性保证。普通 OLTP 建议保持on。
14. full_page_writes(整页写入)
- 默认值:on
- 是否需要重启:是
- 作用:检查点之后第一次修改某页时,将整页写入 WAL,防止部分页写入(torn page)损坏。
💡 调优建议:保持开启。使用支持原子写/
data checksums的存储时可评估关闭,但通常收益有限、风险较高。
15. max_wal_size / min_wal_size(WAL 大小边界)
| 参数 | 默认值 | 作用 |
|---|---|---|
max_wal_size | 1GB | WAL 增长到该量时触发自动检查点 |
min_wal_size | 80MB | 检查点后 WAL 回收的目标下限 |
SHOW max_wal_size; -- 1GB
SHOW min_wal_size; -- 80MB
💡 调优建议:增大
max_wal_size可减少检查点频率、提升写入稳定性,但会增大崩溃恢复时间和磁盘占用;min_wal_size通常设为max_wal_size的约 1/8~1/4。
16. max_wal_senders / wal_keep_size(流复制)
| 参数 | 默认值 | 作用 |
|---|---|---|
max_wal_senders | 10 | 允许的 WAL 发送进程数(流复制备库数上限) |
wal_keep_size | 0 | 为备库保留的旧 WAL 量(0=不额外保留) |
💡 调优建议:搭建主从复制时,
max_wal_senders至少设为备库数 + 少量余量(如 2~5 倍备库数)。未配置复制槽时建议设置wal_keep_size为适当值(如 1GB)防止备库落后时主库已删除所需 WAL。
四、检查点(Checkpoint)相关参数
17. checkpoint_timeout(检查点超时)
- 默认值:300s(5min)
- 单位:s(实测
300 s) - 是否需要重启:否
- 作用:距离上次检查点超过该时间后触发检查点(与
max_wal_size先到者为准)。
SHOW checkpoint_timeout;
-- 5min
💡 调优建议:可增大到 15~30min 以减少检查点频率,配合
max_wal_size使用。
18. checkpoint_completion_target(检查点完成分散比例)
- 默认值:0.9
- 是否需要重启:否
- 作用:检查点写入工作应在检查点间隔的该比例时间内完成,避免瞬时写盘风暴。
💡 调优建议:默认 0.9 即可;追求更平缓的 I/O 可设为接近 0.9~0.95。
五、查询规划相关参数
19. random_page_cost(随机页成本)
- 默认值:4
- 是否需要重启:否
- 作用:随机磁盘页读取的相对成本(相对于
seq_page_cost)。值越高,规划器越倾向顺序扫描。
SHOW random_page_cost; -- 4
SHOW seq_page_cost; -- 1
💡 调优建议:在 SSD 存储上,随机读与顺序读差异小,可将
random_page_cost调低到 1.0~1.5,使规划器更准确选择索引扫描。机械硬盘保持默认 4。
20. default_statistics_target(统计采样目标)
- 默认值:100
- 是否需要重启:否
- 作用:
ANALYZE收集列统计信息时的采样目标,影响规划器对数据分布(MCV、直方图)的精度。
💡 调优建议:默认值对多数场景足够;对数据倾斜严重的大表,可针对特定列用
ALTER TABLE ... ALTER COLUMN ... SET STATISTICS调高。
六、并行查询相关参数
21. max_worker_processes / max_parallel_workers
| 参数 | 默认值 | 是否需要重启 | 作用 |
|---|---|---|---|
max_worker_processes | 8 | 是 | 后台 worker 进程总数上限 |
max_parallel_workers | 8 | 是 | 所有并行查询可用的 worker 总数 |
22. max_parallel_workers_per_gather / max_parallel_maintenance_workers
| 参数 | 默认值 | 是否需要重启 | 作用 |
|---|---|---|---|
max_parallel_workers_per_gather | 2 | 否 | 单个 Gather 节点可用的 worker 数 |
max_parallel_maintenance_workers | 2 | 否 | 并行 CREATE INDEX / VACUUM 的 worker 数 |
SHOW max_worker_processes; -- 8
SHOW max_parallel_workers; -- 8
SHOW max_parallel_workers_per_gather; -- 2
SHOW max_parallel_maintenance_workers; -- 2
💡 调优建议:并行度主要受 CPU 核心数约束。一般
max_worker_processes=max_parallel_workers= CPU 核心数;max_parallel_workers_per_gather可按核心数的 1/4~1/2 设置。
七、日志相关参数
23. logging_collector(日志收集进程)
- 默认值:off
- 是否需要重启:否
- 作用:是否启动独立日志收集进程,将日志写入文件。
SHOW logging_collector;
-- off
💡 调优建议:生产环境建议开启(
on),并配合log_directory、log_filename配置日志轮转。
24. log_min_duration_statement(慢查询阈值)
- 默认值:-1(禁用)
- 单位:ms
- 是否需要重启:否
- 作用:执行时间超过该阈值的语句会记录到日志(
-1表示不记录)。
SHOW log_min_duration_statement;
-- -1
💡 调优建议:生产环境建议设为 1000(即 1 秒),用于捕获慢查询并优化。
25. log_line_prefix(日志行前缀)
- 默认值:
%m [%p] %q%u@%d - 是否需要重启:否
- 作用:定义每行日志的前缀格式。
💡 说明:
%m时间戳、%p进程号、%q会话序号(不产生输出时为%q空)、%u用户名、%d数据库名。常用前缀%m [%p] %q%u@%d便于定位问题。
八、autovacuum 相关参数
26. autovacuum(自动清理)
- 默认值:on
- 是否需要重启:否
- 作用:是否启用自动清理(VACUUM/ANALYZE)。它是回收死元组、更新统计信息、防止表/事务 ID 回卷的关键机制,强烈建议保持开启。
27. autovacuum_max_workers / autovacuum_naptime
| 参数 | 默认值 | 是否需要重启 | 作用 |
|---|---|---|---|
autovacuum_max_workers | 3 | 是 | 并发执行 autovacuum 的 worker 数 |
autovacuum_naptime | 60s | 否 | 每轮 autovacuum 之间的休眠间隔 |
28. autovacuum_vacuum_scale_factor / autovacuum_analyze_scale_factor
| 参数 | 默认值 | 作用 |
|---|---|---|
autovacuum_vacuum_scale_factor | 0.2 | 表死亡元组占比超过 20% 时触发 VACUUM |
autovacuum_analyze_scale_factor | 0.1 | 表变更行数占比超过 10% 时触发 ANALYZE |
SHOW autovacuum; -- on
SHOW autovacuum_max_workers; -- 3
SHOW autovacuum_naptime; -- 60s
SHOW autovacuum_vacuum_scale_factor; -- 0.2
SHOW autovacuum_analyze_scale_factor; -- 0.1
💡 调优建议:
- 大表(数亿行)场景下,按比例触发(scale_factor)会因阈值过大而迟迟不触发 VACUUM,建议配合使用
autovacuum_vacuum_threshold/autovacuum_vacuum_insert_threshold(固定阈值)或针对大表单独参数化。- 高写入场景可适当增加
autovacuum_max_workers(如 6),并调低autovacuum_naptime。
九、其他重要参数
29. jit(JIT 编译)
- 默认值:on
- 是否需要重启:否
- 作用:是否启用 LLVM JIT 编译,加速复杂表达式与查询的 CPU 密集部分。
💡 调优建议:对长时间运行的复杂分析查询有益;对大量短小的 OLTP 查询,JIT 的编译开销可能大于收益,可设
jit = off。
30. dynamic_shared_memory_type(动态共享内存)
- 默认值:posix
- 是否需要重启:是
- 作用:并行查询等使用的动态共享内存实现方式(
posix/sysv/mmap)。
💡 调优建议:默认
posix即可,无需修改。
配置修改与生效方式
- 需要重启的参数:修改
postgresql.conf后执行sudo systemctl restart postgresql(或pg_ctlcluster 18 main restart)。 - 无需重启的参数:可在会话内执行
SET命令临时生效,或修改配置后执行SELECT pg_reload_conf();全局重载。
# 重载配置(仅对"无需重启"的参数生效)
sudo -u postgres psql -c "SELECT pg_reload_conf();"
# 重启集群(使"需重启"的参数生效)
sudo systemctl restart postgresql
注意事项
- 修改
shared_buffers、max_connections、wal_level、fsync等需重启的参数后,务必重启服务,否则不生效。 work_mem与max_connections存在内存乘数关系,同时调高可能引发 OOM,需整体评估。- 本表默认值基于全新初始化集群,若使用包管理器(PGDG)或镜像自带配置,可能存在差异,请以
SHOW或pg_settings实际值为准。 - 生产环境调参应遵循"一次只改一个参数 + 压测验证 + 记录回滚值"的原则,避免盲目堆参数。
常见问题
问题 1:修改配置后不生效
原因: 修改了需要重启的参数但只执行了 pg_reload_conf()。
解决: 用 pg_settings.context 判断参数生效级别:
SELECT name, context FROM pg_settings WHERE name IN ('shared_buffers','work_mem');
context = postmaster 表示需重启;user / sighup 可重载或会话级生效。
问题 2:out of shared memory 错误
原因: 共享内存不足,常见于 max_locks_per_transaction 或 shared_buffers 设置冲突。
解决: 适当降低 shared_buffers 或增大 max_locks_per_transaction 后重启。
问题 3:排序操作频繁写磁盘(Sort Method: external merge)
原因: work_mem 过小,排序无法在内存完成。
解决: 逐步增大 work_mem(如 16MB/32MB),并通过 EXPLAIN ANALYZE 验证排序改为 Sort Method: quicksort Memory。
参考链接
- PostgreSQL 18 运行配置文档(内存)
- PostgreSQL 18 运行配置文档(WAL)
- PostgreSQL 18 运行配置文档(查询规划)
- PostgreSQL 18 autovacuum 文档
本文档由 www.quzuo.net 平台开发