Skip to content

PostgreSQL 核心参数

PostgreSQL核心参数配置是数据库性能优化的重要组成部分,合理的参数配置可以显著提高数据库的性能和可靠性。本文档介绍PostgreSQL核心参数的详细说明、默认值、推荐值和适用场景,帮助DBA在生产环境中进行参数调优。

连接和认证参数

连接和认证参数控制PostgreSQL的网络连接和用户认证,是数据库安全和可用性的基础。

参数名称默认值单位说明生产环境推荐值适用场景
listen_addresseslocalhost-监听地址'*'允许远程连接
port5432-监听端口保持默认或自定义根据安全策略调整
max_connections100-最大连接数100-1000根据业务需求和硬件资源调整
superuser_reserved_connections3-保留给超级用户的连接数3-5确保超级用户始终能连接
unix_socket_directories/tmp-Unix套接字目录保持默认或自定义根据系统安全策略调整
password_encryptionscram-sha-256-密码加密方式scram-sha-256生产环境必须使用强加密
ssloff-SSL连接on生产环境建议开启
ssl_cert_fileserver.crt-SSL证书文件保持默认根据SSL配置调整
ssl_key_fileserver.key-SSL私钥文件保持默认根据SSL配置调整
ssl_ca_file''-SSL CA文件配置可信CA文件生产环境建议配置

内存配置参数

内存配置是PostgreSQL性能优化的核心,合理的内存配置可以显著提高数据库的查询性能和并发处理能力。

参数名称默认值单位说明生产环境推荐值适用场景
shared_buffers128MB-共享缓冲区大小系统内存的25%直接影响数据库缓存性能
effective_cache_size4GB-优化器预期的可用缓存大小系统内存的75%帮助优化器生成更好的执行计划
work_mem4MB-每个操作的工作内存4MB-64MB影响排序、哈希等操作的性能
maintenance_work_mem64MB-维护操作的内存大小1GB-4GB影响VACUUM、CREATE INDEX等操作的性能
autovacuum_work_mem-1-自动VACUUM的内存大小256MB-1GB独立控制自动VACUUM的内存使用
dynamic_shared_memory_typeposix-动态共享内存类型保持默认或根据操作系统调整根据操作系统支持调整
max_files_per_process1000-每个进程的最大文件数1000-4000大量表或索引时增加

优化器参数

优化器参数控制PostgreSQL查询优化器的行为,影响执行计划的生成。

参数名称默认值单位说明生产环境推荐值适用场景
random_page_cost4.0-随机页面访问成本1.1-2.0(SSD)或4.0(HDD)根据存储类型调整
seq_page_cost1.0-顺序页面访问成本保持默认一般无需调整
effective_io_concurrency1-有效IO并发度200-400(SSD)或10-20(HDD)根据存储类型和IO能力调整
default_statistics_target100-默认统计目标100-500影响统计信息的详细程度
enable_seqscanon-是否允许顺序扫描on一般无需关闭
enable_indexscanon-是否允许索引扫描on一般无需关闭
enable_bitmapscanon-是否允许位图扫描on一般无需关闭

WAL配置参数

WAL(Write-Ahead Log)配置是PostgreSQL可靠性和性能的关键,影响数据库的崩溃恢复能力和写入性能。

参数名称默认值单位说明生产环境推荐值适用场景
wal_levelreplica-WAL日志级别replicalogical根据复制需求调整
synchronous_commiton-同步提交级别onremote_writeoff根据可靠性需求调整
wal_sync_methodfsync-WAL同步方法保持默认或根据操作系统调整根据存储和操作系统调整
checkpoint_timeout5min-检查点超时时间15min-30min影响WAL生成速率和恢复时间
max_wal_size1GB-最大WAL大小4GB-16GB影响检查点频率和磁盘使用
min_wal_size80MB-最小WAL大小1GB-4GB防止频繁的WAL删除和创建
checkpoint_completion_target0.5-检查点完成目标0.9控制检查点的持续时间
wal_compressionoff-WAL压缩onPostgreSQL 9.5+支持,减少WAL磁盘使用
wal_buffers-1-WAL缓冲区大小32MB-128MB影响WAL写入性能

检查点参数

检查点参数控制PostgreSQL检查点的行为,影响数据库的写入性能和恢复时间。

参数名称默认值单位说明生产环境推荐值适用场景
checkpoint_timeout5min-检查点超时时间15min-30min同上,已在WAL配置中说明
max_wal_size1GB-最大WAL大小同上,已在WAL配置中说明
min_wal_size80MB-最小WAL大小同上,已在WAL配置中说明
checkpoint_completion_target0.5-检查点完成目标同上,已在WAL配置中说明
checkpoint_warning30s-检查点警告时间30s检查点时间过长时发出警告
log_checkpointsoff-是否记录检查点信息on生产环境建议开启,便于性能分析

后台写入器参数

后台写入器参数控制PostgreSQL后台写入器的行为,影响数据库的写入性能和IO负载。

参数名称默认值单位说明生产环境推荐值适用场景
bgwriter_delay200ms-后台写入器延迟200ms控制后台写入器的运行频率
bgwriter_lru_maxpages100-后台写入器每次写入的最大页数100-200控制后台写入器的写入量
bgwriter_lru_multiplier2.0-后台写入器LRU乘数2.0-4.0控制后台写入器的写入策略
bgwriter_flush_after0-后台写入器刷新阈值512KB-2MB控制后台写入器的刷新行为

并行查询参数

并行查询参数控制PostgreSQL并行查询的行为,影响数据库的查询性能。

参数名称默认值单位说明生产环境推荐值适用场景
max_worker_processes8-最大工作进程数CPU核心数控制并行查询和其他后台进程的最大数量
max_parallel_workers_per_gather2-每个Gather节点的最大并行工作进程数CPU核心数的一半控制单个查询的并行度
max_parallel_workers8-最大并行工作进程数CPU核心数控制全局并行工作进程的最大数量
parallel_tuple_cost0.1-并行元组成本保持默认影响并行查询的成本估算
parallel_setup_cost1000.0-并行设置成本保持默认影响并行查询的成本估算

锁参数

锁参数控制PostgreSQL锁的行为,影响数据库的并发处理能力。

参数名称默认值单位说明生产环境推荐值适用场景
max_locks_per_transaction64-每个事务的最大锁数128-512影响事务可以持有的锁数量
deadlock_timeout1s-死锁检测超时时间1s-10s控制死锁检测的频率
lock_timeout0-锁等待超时时间0或30s-300s控制语句等待锁的最长时间

统计信息参数

统计信息参数控制PostgreSQL统计信息的收集和使用,影响查询优化器的执行计划生成。

参数名称默认值单位说明生产环境推荐值适用场景
autovacuumon-是否启用自动VACUUMon生产环境必须启用
autovacuum_max_workers3-自动VACUUM的最大工作进程数3-8影响自动VACUUM的并行处理能力
autovacuum_naptime1min-自动VACUUM的休眠时间1min-5min控制自动VACUUM的运行频率
autovacuum_vacuum_threshold50-自动VACUUM的阈值50影响自动VACUUM的触发条件
autovacuum_vacuum_scale_factor0.2-自动VACUUM的比例因子0.02-0.05影响自动VACUUM的触发条件
autovacuum_analyze_threshold50-自动ANALYZE的阈值50影响自动ANALYZE的触发条件
autovacuum_analyze_scale_factor0.1-自动ANALYZE的比例因子0.01-0.025影响自动ANALYZE的触发条件
autovacuum_vacuum_cost_delay2ms-自动VACUUM的成本延迟0ms-20ms控制自动VACUUM的IO影响
autovacuum_vacuum_cost_limit-1-自动VACUUM的成本限制200-1000控制自动VACUUM的IO影响

日志参数

日志参数控制PostgreSQL日志的收集和输出,是故障排查和性能分析的重要依据。

参数名称默认值单位说明生产环境推荐值适用场景
log_destinationstderr-日志目标csvlogsyslog生产环境建议使用csvlog
logging_collectoroff-日志收集器on生产环境必须开启
log_directorylog-日志目录保持默认或根据系统配置调整根据系统配置调整
log_filenamepostgresql-%Y-%m-%d_%H%M%S.log-日志文件名格式保持默认便于日志管理和归档
log_rotation_age1d-日志轮换年龄1d控制日志文件的大小和数量
log_rotation_size0-日志轮换大小100MB-1GB控制日志文件的大小和数量
log_truncate_on_rotationoff-日志轮换时截断on防止日志文件无限增长
log_min_messageswarning-日志消息级别warning控制日志消息的详细程度
log_min_error_statementerror-错误语句日志级别error控制记录错误语句的级别
log_min_duration_statement-1毫秒慢查询日志阈值5000ms记录执行时间超过阈值的查询
log_checkpointsoff-记录检查点信息on便于性能分析
log_connectionsoff-记录连接信息on便于安全审计
log_disconnectionsoff-记录断开连接信息on便于安全审计
log_durationoff-记录所有语句执行时间off生产环境不建议开启,使用log_min_duration_statement
log_statementnone-记录语句类型noneddl生产环境建议使用ddl

参数配置示例

小型服务器(4GB内存,2-4核CPU)

bash
# 连接和认证
listen_addresses = '*'
port = 5432
max_connections = 100
password_encryption = scram-sha-256

# 内存配置
shared_buffers = 1GB
effective_cache_size = 3GB
work_mem = 4MB
maintenance_work_mem = 256MB

# WAL配置
wal_level = replica
synchronous_commit = remote_write
checkpoint_timeout = 15min
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9
wal_compression = on

# 并行查询
max_worker_processes = 4
max_parallel_workers_per_gather = 2
max_parallel_workers = 4

# 自动VACUUM
autovacuum = on
autovacuum_max_workers = 3
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.025

# 日志配置
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_truncate_on_rotation = on
log_min_messages = warning
log_min_error_statement = error
log_min_duration_statement = 5000
log_checkpoints = on
log_connections = on
log_disconnections = on
log_statement = 'ddl'

中型服务器(16GB内存,8核CPU)

bash
# 连接和认证
listen_addresses = '*'
port = 5432
max_connections = 200
password_encryption = scram-sha-256

# 内存配置
shared_buffers = 4GB
effective_cache_size = 12GB
work_mem = 8MB
maintenance_work_mem = 1GB

# WAL配置
wal_level = replica
synchronous_commit = remote_write
checkpoint_timeout = 30min
max_wal_size = 8GB
min_wal_size = 2GB
checkpoint_completion_target = 0.9
wal_compression = on

# 并行查询
max_worker_processes = 8
max_parallel_workers_per_gather = 4
max_parallel_workers = 8

# 自动VACUUM
autovacuum = on
autovacuum_max_workers = 5
autovacuum_vacuum_scale_factor = 0.02
autovacuum_analyze_scale_factor = 0.01

# 日志配置
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 200MB
log_truncate_on_rotation = on
log_min_messages = warning
log_min_error_statement = error
log_min_duration_statement = 5000
log_checkpoints = on
log_connections = on
log_disconnections = on
log_statement = 'ddl'

大型服务器(64GB内存,16-32核CPU)

bash
# 连接和认证
listen_addresses = '*'
port = 5432
max_connections = 500
password_encryption = scram-sha-256

# 内存配置
shared_buffers = 16GB
effective_cache_size = 48GB
work_mem = 16MB
maintenance_work_mem = 2GB

# WAL配置
wal_level = replica
synchronous_commit = on
checkpoint_timeout = 30min
max_wal_size = 16GB
min_wal_size = 4GB
checkpoint_completion_target = 0.9
wal_compression = on

# 并行查询
max_worker_processes = 16
max_parallel_workers_per_gather = 8
max_parallel_workers = 16

# 自动VACUUM
autovacuum = on
autovacuum_max_workers = 8
autovacuum_vacuum_scale_factor = 0.02
autovacuum_analyze_scale_factor = 0.01
autovacuum_vacuum_cost_delay = 5ms
autovacuum_vacuum_cost_limit = 1000

# 日志配置
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 500MB
log_truncate_on_rotation = on
log_min_messages = warning
log_min_error_statement = error
log_min_duration_statement = 5000
log_checkpoints = on
log_connections = on
log_disconnections = on
log_statement = 'ddl'

参数调整最佳实践

  1. 从小开始,逐步调整:不要一次性修改多个参数,建议每次修改1-2个参数,观察效果后再进行其他调整。

  2. 根据实际负载调整:参数配置应根据服务器硬件和实际工作负载进行调整,没有适用于所有场景的通用配置。

  3. 监控调整效果:使用pg_stat_statements、pg_stat_bgwriter、pg_stat_archiver等视图监控参数调整效果,根据监控数据进行进一步优化。

  4. 测试环境验证:在测试环境验证参数调整效果,确保不会对生产环境造成负面影响。

  5. 记录调整历史:记录每次参数调整的原因、调整值和效果,便于后续分析和回滚。

  6. 定期审查配置:定期审查参数配置,根据业务发展和硬件升级进行调整。

  7. 关注PostgreSQL版本变化:不同版本的PostgreSQL默认参数和推荐配置可能不同,升级后应重新审查参数配置。

  8. 考虑系统资源限制:参数配置不应超过系统的硬件资源限制,如内存、CPU、磁盘IO等。

  9. 平衡性能和可靠性:在调整参数时,需要平衡数据库的性能和可靠性,如synchronous_commit参数。

  10. 使用自动化工具:可以使用pg_tune等工具生成初始配置,然后根据实际情况进行调整。

总结

PostgreSQL核心参数配置是数据库性能优化的重要组成部分,合理的参数配置可以显著提高数据库的性能和可靠性。本文档介绍了连接和认证、内存配置、优化器、WAL、检查点、后台写入器、并行查询、锁、统计信息等方面的核心参数,包括参数的默认值、说明、推荐值和适用场景。

在实际配置中,DBA应根据服务器硬件、工作负载类型和业务需求进行调整,同时结合监控工具进行验证和优化。通过持续的参数调整和优化,可以确保PostgreSQL数据库在不同场景下都能发挥最佳性能。