PostgreSQL 18 配置参数详解

系统梳理 PostgreSQL 18 的核心配置参数,覆盖内存、连接、WAL、检查点、查询规划、并行、日志与 autovacuum 等维度。每个参数给出默认值(实测)、作用说明与生产环境调优建议,为参数调优提供参考手册

PostgreSQLPostgreSQL参数调优性能优化2026/09/27

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_buffers128MB是共享缓冲区大小,缓存数据页
内存effective_cache_size4GB否规划器评估操作系统+数据库缓存总量
内存work_mem4MB否单次排序/哈希操作的内存上限
内存maintenance_work_mem64MB否维护操作(VACUUM/CREATE INDEX)内存
内存wal_buffers4MB(512×8kB)是WAL 写入缓冲
内存temp_buffers8MB(1024×8kB)否每个会话的临时表缓存
内存huge_pagestry是大页内存使用策略
连接max_connections100是最大并发连接数
连接tcp_keepalives_idle0否TCP keepalive 空闲时间(0=用系统默认)
连接idle_in_transaction_session_timeout0否空闲事务超时(0=禁用)
连接statement_timeout0否单条语句执行超时(0=禁用)
连接lock_timeout0否等待锁超时(0=禁用)
连接max_locks_per_transaction64是单事务可持有的锁数量
连接max_prepared_transactions0是两阶段提交预备事务数(0=禁用)
WALwal_levelreplica是WAL 记录级别
WALsynchronous_commiton否同步提交级别
WALfsyncon是是否强制刷盘(保证持久性)
WALfull_page_writeson是检查点后首次修改是否写整页
WALmax_wal_size1GB否触发自动检查点的 WAL 上限
WALmin_wal_size80MB否WAL 回收目标下限
WALwal_keep_size0是为备库保留的 WAL 量(0=不额外保留)
WALmax_wal_senders10是最大 WAL 发送进程数(流复制)
检查点checkpoint_timeout300s(5min)否检查点触发时间间隔
检查点checkpoint_completion_target0.9否检查点完成的分散比例
查询规划seq_page_cost1否顺序页读取成本(相对值)
查询规划random_page_cost4否随机页读取成本(相对值)
查询规划default_statistics_target100否统计信息采样目标
并行max_worker_processes8是后台 worker 进程总数上限
并行max_parallel_workers8是并行查询可用 worker 上限
并行max_parallel_workers_per_gather2否单个 Gather 节点的 worker 数
并行max_parallel_maintenance_workers2否维护操作并行 worker 数
日志logging_collectoroff否是否启用日志收集进程
日志log_min_duration_statement-1否慢查询阈值(-1=禁用)
日志log_line_prefix%m [%p] %q%u@%d 否日志行前缀格式
autovacuumautovacuumon否是否启用自动清理
autovacuumautovacuum_max_workers3是自动清理并发 worker 数
autovacuumautovacuum_naptime60s否自动清理休眠间隔
autovacuumautovacuum_vacuum_scale_factor0.2否触发 VACUUM 的死亡行比例
autovacuumautovacuum_analyze_scale_factor0.1否触发 ANALYZE 的行变更比例
其他jiton否JIT 编译(LLVM)开关
其他dynamic_shared_memory_typeposix是动态共享内存实现方式

一、内存相关参数

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_timeout0(禁用)事务开启后空闲超过该时长则终止会话
statement_timeout0(禁用)单条 SQL 执行超过该时长则终止
lock_timeout0(禁用)等待行/表锁超过该时长则报错退出
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_size1GBWAL 增长到该量时触发自动检查点
min_wal_size80MB检查点后 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_senders10允许的 WAL 发送进程数(流复制备库数上限)
wal_keep_size0为备库保留的旧 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_processes8是后台 worker 进程总数上限
max_parallel_workers8是所有并行查询可用的 worker 总数

22. max_parallel_workers_per_gather / max_parallel_maintenance_workers

参数默认值是否需要重启作用
max_parallel_workers_per_gather2否单个 Gather 节点可用的 worker 数
max_parallel_maintenance_workers2否并行 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_workers3是并发执行 autovacuum 的 worker 数
autovacuum_naptime60s否每轮 autovacuum 之间的休眠间隔

28. autovacuum_vacuum_scale_factor / autovacuum_analyze_scale_factor

参数默认值作用
autovacuum_vacuum_scale_factor0.2表死亡元组占比超过 20% 时触发 VACUUM
autovacuum_analyze_scale_factor0.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。

参考链接


本文档由 www.quzuo.net 平台开发