外观
PostgreSQL 核心参数
PostgreSQL核心参数配置是数据库性能优化的重要组成部分,合理的参数配置可以显著提高数据库的性能和可靠性。本文档介绍PostgreSQL核心参数的详细说明、默认值、推荐值和适用场景,帮助DBA在生产环境中进行参数调优。
连接和认证参数
连接和认证参数控制PostgreSQL的网络连接和用户认证,是数据库安全和可用性的基础。
| 参数名称 | 默认值 | 单位 | 说明 | 生产环境推荐值 | 适用场景 |
|---|---|---|---|---|---|
listen_addresses | localhost | - | 监听地址 | '*' | 允许远程连接 |
port | 5432 | - | 监听端口 | 保持默认或自定义 | 根据安全策略调整 |
max_connections | 100 | - | 最大连接数 | 100-1000 | 根据业务需求和硬件资源调整 |
superuser_reserved_connections | 3 | - | 保留给超级用户的连接数 | 3-5 | 确保超级用户始终能连接 |
unix_socket_directories | /tmp | - | Unix套接字目录 | 保持默认或自定义 | 根据系统安全策略调整 |
password_encryption | scram-sha-256 | - | 密码加密方式 | scram-sha-256 | 生产环境必须使用强加密 |
ssl | off | - | SSL连接 | on | 生产环境建议开启 |
ssl_cert_file | server.crt | - | SSL证书文件 | 保持默认 | 根据SSL配置调整 |
ssl_key_file | server.key | - | SSL私钥文件 | 保持默认 | 根据SSL配置调整 |
ssl_ca_file | '' | - | SSL CA文件 | 配置可信CA文件 | 生产环境建议配置 |
内存配置参数
内存配置是PostgreSQL性能优化的核心,合理的内存配置可以显著提高数据库的查询性能和并发处理能力。
| 参数名称 | 默认值 | 单位 | 说明 | 生产环境推荐值 | 适用场景 |
|---|---|---|---|---|---|
shared_buffers | 128MB | - | 共享缓冲区大小 | 系统内存的25% | 直接影响数据库缓存性能 |
effective_cache_size | 4GB | - | 优化器预期的可用缓存大小 | 系统内存的75% | 帮助优化器生成更好的执行计划 |
work_mem | 4MB | - | 每个操作的工作内存 | 4MB-64MB | 影响排序、哈希等操作的性能 |
maintenance_work_mem | 64MB | - | 维护操作的内存大小 | 1GB-4GB | 影响VACUUM、CREATE INDEX等操作的性能 |
autovacuum_work_mem | -1 | - | 自动VACUUM的内存大小 | 256MB-1GB | 独立控制自动VACUUM的内存使用 |
dynamic_shared_memory_type | posix | - | 动态共享内存类型 | 保持默认或根据操作系统调整 | 根据操作系统支持调整 |
max_files_per_process | 1000 | - | 每个进程的最大文件数 | 1000-4000 | 大量表或索引时增加 |
优化器参数
优化器参数控制PostgreSQL查询优化器的行为,影响执行计划的生成。
| 参数名称 | 默认值 | 单位 | 说明 | 生产环境推荐值 | 适用场景 |
|---|---|---|---|---|---|
random_page_cost | 4.0 | - | 随机页面访问成本 | 1.1-2.0(SSD)或4.0(HDD) | 根据存储类型调整 |
seq_page_cost | 1.0 | - | 顺序页面访问成本 | 保持默认 | 一般无需调整 |
effective_io_concurrency | 1 | - | 有效IO并发度 | 200-400(SSD)或10-20(HDD) | 根据存储类型和IO能力调整 |
default_statistics_target | 100 | - | 默认统计目标 | 100-500 | 影响统计信息的详细程度 |
enable_seqscan | on | - | 是否允许顺序扫描 | on | 一般无需关闭 |
enable_indexscan | on | - | 是否允许索引扫描 | on | 一般无需关闭 |
enable_bitmapscan | on | - | 是否允许位图扫描 | on | 一般无需关闭 |
WAL配置参数
WAL(Write-Ahead Log)配置是PostgreSQL可靠性和性能的关键,影响数据库的崩溃恢复能力和写入性能。
| 参数名称 | 默认值 | 单位 | 说明 | 生产环境推荐值 | 适用场景 |
|---|---|---|---|---|---|
wal_level | replica | - | WAL日志级别 | replica 或 logical | 根据复制需求调整 |
synchronous_commit | on | - | 同步提交级别 | on、remote_write 或 off | 根据可靠性需求调整 |
wal_sync_method | fsync | - | WAL同步方法 | 保持默认或根据操作系统调整 | 根据存储和操作系统调整 |
checkpoint_timeout | 5min | - | 检查点超时时间 | 15min-30min | 影响WAL生成速率和恢复时间 |
max_wal_size | 1GB | - | 最大WAL大小 | 4GB-16GB | 影响检查点频率和磁盘使用 |
min_wal_size | 80MB | - | 最小WAL大小 | 1GB-4GB | 防止频繁的WAL删除和创建 |
checkpoint_completion_target | 0.5 | - | 检查点完成目标 | 0.9 | 控制检查点的持续时间 |
wal_compression | off | - | WAL压缩 | on | PostgreSQL 9.5+支持,减少WAL磁盘使用 |
wal_buffers | -1 | - | WAL缓冲区大小 | 32MB-128MB | 影响WAL写入性能 |
检查点参数
检查点参数控制PostgreSQL检查点的行为,影响数据库的写入性能和恢复时间。
| 参数名称 | 默认值 | 单位 | 说明 | 生产环境推荐值 | 适用场景 |
|---|---|---|---|---|---|
checkpoint_timeout | 5min | - | 检查点超时时间 | 15min-30min | 同上,已在WAL配置中说明 |
max_wal_size | 1GB | - | 最大WAL大小 | 同上,已在WAL配置中说明 | |
min_wal_size | 80MB | - | 最小WAL大小 | 同上,已在WAL配置中说明 | |
checkpoint_completion_target | 0.5 | - | 检查点完成目标 | 同上,已在WAL配置中说明 | |
checkpoint_warning | 30s | - | 检查点警告时间 | 30s | 检查点时间过长时发出警告 |
log_checkpoints | off | - | 是否记录检查点信息 | on | 生产环境建议开启,便于性能分析 |
后台写入器参数
后台写入器参数控制PostgreSQL后台写入器的行为,影响数据库的写入性能和IO负载。
| 参数名称 | 默认值 | 单位 | 说明 | 生产环境推荐值 | 适用场景 |
|---|---|---|---|---|---|
bgwriter_delay | 200ms | - | 后台写入器延迟 | 200ms | 控制后台写入器的运行频率 |
bgwriter_lru_maxpages | 100 | - | 后台写入器每次写入的最大页数 | 100-200 | 控制后台写入器的写入量 |
bgwriter_lru_multiplier | 2.0 | - | 后台写入器LRU乘数 | 2.0-4.0 | 控制后台写入器的写入策略 |
bgwriter_flush_after | 0 | - | 后台写入器刷新阈值 | 512KB-2MB | 控制后台写入器的刷新行为 |
并行查询参数
并行查询参数控制PostgreSQL并行查询的行为,影响数据库的查询性能。
| 参数名称 | 默认值 | 单位 | 说明 | 生产环境推荐值 | 适用场景 |
|---|---|---|---|---|---|
max_worker_processes | 8 | - | 最大工作进程数 | CPU核心数 | 控制并行查询和其他后台进程的最大数量 |
max_parallel_workers_per_gather | 2 | - | 每个Gather节点的最大并行工作进程数 | CPU核心数的一半 | 控制单个查询的并行度 |
max_parallel_workers | 8 | - | 最大并行工作进程数 | CPU核心数 | 控制全局并行工作进程的最大数量 |
parallel_tuple_cost | 0.1 | - | 并行元组成本 | 保持默认 | 影响并行查询的成本估算 |
parallel_setup_cost | 1000.0 | - | 并行设置成本 | 保持默认 | 影响并行查询的成本估算 |
锁参数
锁参数控制PostgreSQL锁的行为,影响数据库的并发处理能力。
| 参数名称 | 默认值 | 单位 | 说明 | 生产环境推荐值 | 适用场景 |
|---|---|---|---|---|---|
max_locks_per_transaction | 64 | - | 每个事务的最大锁数 | 128-512 | 影响事务可以持有的锁数量 |
deadlock_timeout | 1s | - | 死锁检测超时时间 | 1s-10s | 控制死锁检测的频率 |
lock_timeout | 0 | - | 锁等待超时时间 | 0或30s-300s | 控制语句等待锁的最长时间 |
统计信息参数
统计信息参数控制PostgreSQL统计信息的收集和使用,影响查询优化器的执行计划生成。
| 参数名称 | 默认值 | 单位 | 说明 | 生产环境推荐值 | 适用场景 |
|---|---|---|---|---|---|
autovacuum | on | - | 是否启用自动VACUUM | on | 生产环境必须启用 |
autovacuum_max_workers | 3 | - | 自动VACUUM的最大工作进程数 | 3-8 | 影响自动VACUUM的并行处理能力 |
autovacuum_naptime | 1min | - | 自动VACUUM的休眠时间 | 1min-5min | 控制自动VACUUM的运行频率 |
autovacuum_vacuum_threshold | 50 | - | 自动VACUUM的阈值 | 50 | 影响自动VACUUM的触发条件 |
autovacuum_vacuum_scale_factor | 0.2 | - | 自动VACUUM的比例因子 | 0.02-0.05 | 影响自动VACUUM的触发条件 |
autovacuum_analyze_threshold | 50 | - | 自动ANALYZE的阈值 | 50 | 影响自动ANALYZE的触发条件 |
autovacuum_analyze_scale_factor | 0.1 | - | 自动ANALYZE的比例因子 | 0.01-0.025 | 影响自动ANALYZE的触发条件 |
autovacuum_vacuum_cost_delay | 2ms | - | 自动VACUUM的成本延迟 | 0ms-20ms | 控制自动VACUUM的IO影响 |
autovacuum_vacuum_cost_limit | -1 | - | 自动VACUUM的成本限制 | 200-1000 | 控制自动VACUUM的IO影响 |
日志参数
日志参数控制PostgreSQL日志的收集和输出,是故障排查和性能分析的重要依据。
| 参数名称 | 默认值 | 单位 | 说明 | 生产环境推荐值 | 适用场景 |
|---|---|---|---|---|---|
log_destination | stderr | - | 日志目标 | csvlog 或 syslog | 生产环境建议使用csvlog |
logging_collector | off | - | 日志收集器 | on | 生产环境必须开启 |
log_directory | log | - | 日志目录 | 保持默认或根据系统配置调整 | 根据系统配置调整 |
log_filename | postgresql-%Y-%m-%d_%H%M%S.log | - | 日志文件名格式 | 保持默认 | 便于日志管理和归档 |
log_rotation_age | 1d | - | 日志轮换年龄 | 1d | 控制日志文件的大小和数量 |
log_rotation_size | 0 | - | 日志轮换大小 | 100MB-1GB | 控制日志文件的大小和数量 |
log_truncate_on_rotation | off | - | 日志轮换时截断 | on | 防止日志文件无限增长 |
log_min_messages | warning | - | 日志消息级别 | warning | 控制日志消息的详细程度 |
log_min_error_statement | error | - | 错误语句日志级别 | error | 控制记录错误语句的级别 |
log_min_duration_statement | -1 | 毫秒 | 慢查询日志阈值 | 5000ms | 记录执行时间超过阈值的查询 |
log_checkpoints | off | - | 记录检查点信息 | on | 便于性能分析 |
log_connections | off | - | 记录连接信息 | on | 便于安全审计 |
log_disconnections | off | - | 记录断开连接信息 | on | 便于安全审计 |
log_duration | off | - | 记录所有语句执行时间 | off | 生产环境不建议开启,使用log_min_duration_statement |
log_statement | none | - | 记录语句类型 | none 或 ddl | 生产环境建议使用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-2个参数,观察效果后再进行其他调整。
根据实际负载调整:参数配置应根据服务器硬件和实际工作负载进行调整,没有适用于所有场景的通用配置。
监控调整效果:使用pg_stat_statements、pg_stat_bgwriter、pg_stat_archiver等视图监控参数调整效果,根据监控数据进行进一步优化。
测试环境验证:在测试环境验证参数调整效果,确保不会对生产环境造成负面影响。
记录调整历史:记录每次参数调整的原因、调整值和效果,便于后续分析和回滚。
定期审查配置:定期审查参数配置,根据业务发展和硬件升级进行调整。
关注PostgreSQL版本变化:不同版本的PostgreSQL默认参数和推荐配置可能不同,升级后应重新审查参数配置。
考虑系统资源限制:参数配置不应超过系统的硬件资源限制,如内存、CPU、磁盘IO等。
平衡性能和可靠性:在调整参数时,需要平衡数据库的性能和可靠性,如synchronous_commit参数。
使用自动化工具:可以使用pg_tune等工具生成初始配置,然后根据实际情况进行调整。
总结
PostgreSQL核心参数配置是数据库性能优化的重要组成部分,合理的参数配置可以显著提高数据库的性能和可靠性。本文档介绍了连接和认证、内存配置、优化器、WAL、检查点、后台写入器、并行查询、锁、统计信息等方面的核心参数,包括参数的默认值、说明、推荐值和适用场景。
在实际配置中,DBA应根据服务器硬件、工作负载类型和业务需求进行调整,同时结合监控工具进行验证和优化。通过持续的参数调整和优化,可以确保PostgreSQL数据库在不同场景下都能发挥最佳性能。
