PostgreSQL数据库的参数设置有哪些

33次阅读
没有评论

共计 3751 个字符,预计需要花费 10 分钟才能阅读完成。

这篇文章主要讲解了“PostgreSQL 数据库的参数设置有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“PostgreSQL 数据库的参数设置有哪些”吧!

假设数据库主机 OS 为 Linux 64bit, 内存为 8G, 存储阵列使用 RAID 5(带宽约为 200MB/s,IOPS 约为 200), 主机没有其他服务。

一、常规部分

listen_addresses

#PG 默认监听本地连接, 如需接受其他 Client 的连接请求, 需修改为 *
listen_addresses =  *

max_connections

# 最大连接数, 默认为 100, 根据业务应用情况和主机配置设置
#由于 PG 使用多进程模式, 如连接数大于一定数量 (与机器配置相关) 时, 会因为进程上下文的频繁切换导致性能降低
#如需要支持数千个连接, 可以考虑使用分库读写分离的方式, 以及使用连接池组件(如 PgBouncer)
max_connections=256

查看当前连接数的 SQL:

testdb=# SELECT sum(numbackends) FROM pg_stat_database;
 sum 
-----
 1
(1 row)

二、内存相关

假设机器内存为 N, 则需满足以下要求:
N max_connections x work_mem + shared_buffers + temp_buffers + maintenance_work_mem + OS 运行最小要求的内存

shared_buffers

# 共享缓冲区, 用于配置可用于 Cache Data(包括 Hot Data/Index 等等)的内存大小
#一般设置为主机内存的 25%-40%
shared_buffers=3G

effective_cache_size

# 剔除操作系统本身和其他应用程序可用的内存后, 期望操作系统和数据库本身可用于缓存数据的内存大小
#该参数仅用于优化的 estimate(评估)阶段, 如果设置有误会影响优化器的判断, 得出不合理的执行计划
#比如在只有 512M 的主机上, 设置该参数为 4G, 查询一张有索引的大表时, 如果访问的索引大小 4G, 那么执行计划有可能会使用该索引, 但实际上主机内存并不支持容纳这么大的索引, 导致实际执行 SQL 时出现性能问题; 同样的, 如果设置的过小, 执行计划可能不会选择用索引.
effective_cache_size=4G

work_mem

# 每个 Session 执行排序和建立散列表等操作时可使用的内存大小, 默认 1M
#如需执行较大 / 复杂的排序或连接操作, 建议增大此参数
#注意: 示例中最大连接数为 256, 如此参数设置为 4M, 那么在满载情况下使用的内存为 4Mx256=1G
work_mem=2M

maintenance_work_mem

#VACUUM, CREATE INDEX, and ALTER TABLE ADD FOREIGN KEY 等操作可使用的内存大小, 默认 64M
#由于这类操作并发数不会很大, 增大此参数相对较为安全, 如希望提升这些操作的性能, 可适当加大此参数
maintenance_work_mem=256M

wal_buffers

# 用于缓存 WAL data, 默认为 -1(约为 shared_buffers 的 1 /32), 最小为 64KB, 最大为 WAL segment 大小(典型为 16MB)
#由于 WAL data 在事务 commit 时写入到日志文件中, 在典型的主机配置下, 假设每次 Buffer 都全满, 写入的延迟约为 wal_buffers/200, 在 0.32ms(64K)至 81.92ms(16M)之间
wal_buffers=4M

三、性能相关

max_wal_size/min_wal_size
wal 日志占用的最大值和最小值, 默认最大为 1G, 最小为 80M, 用以替换先前的参数 checkpoint_segments

checkpoint_segments
在参数在 9.5+ 后已废弃

#1. 该参数定义了写了多少个 WAL Segment 执行一次 checkpoint, 默认为 3(典型的, 即 48M)
#checkpoint 最主要的功能是把缓存中脏数据写入到磁盘中(注意: 这里的写是随机写, 不是 WAL 的顺序写!)
#频繁的 checkpoint 会影响数据库性能, 在常规的场景下, 使用默认值会极大的降低数据库性能
#假设该参数值为 n, 那么粗略上来说, 每间隔 (n*16MB/200MB) 秒就会执行一次 checkpoint
#2. 该参数会影响 Recover, 数值越大, 人出现问题 Recover 的时间可能越长
#假设该参数值为 n, 那么极端情况下在产生 n *16MB 个 WAL segment 时出现宕机, 下次启动时, 粗略来说就需要 n *16MB 个 WAL segment 进行 Recover
checkpoint_segments=32

checkpoint_timeout

#checkpoint 超时时间, 默认为 5 分钟, 最大 1d
#在 checkpoint_completion_target*checkpoint_timeout 超时或者产生的 WAL Segment 超过 checkpoint_segments 时, 执行 checkpoint
#增大此参数, 会减少磁盘 IO 压力, 但会延长 Recover 时间
checkpoint_timeout=8min

checkpoint_completion_target

# 指定 checkpoint 的完成 目标 , 默认值为 0.5, 取值区间为 0.0-1.0
#通过两个 checkpoint 间隔时间的百分比来衡量, 也就是 checkpoint_completion_target*checkpoint_timeout
checkpoint_completion_target=0.9

random_page_cost

# 随机读取 Page 的代价, 以顺序读取为基准, 默认值为 4.0
#该参数会影响优化器选择执行计划, 随机读取数据一般发生在通过 Index 访问数据的时候
#如数据存储在 SSD 这类随机读写友好的设备上, 可以降低至 2.0 甚至更低
random_page_cost=4.0

四、运维相关

autovacuum

# 是否启动自动 vacuum, 默认为 on, 常规情况下设置为 on
#vacuum 的详细解析请参见先前章节, 此处不再累述
autovacuum=on

log_XX

#log_destination: 日志类型, 包括 stderr, csvlog, syslog, eventlog
#建议设置为 csvlog
log_destination= csvlog 
#logging_collector: 如 log_destination 配置为 csvlog, 则该参数要求配置为 on
logging_collector=on
#log_directory: 日志存储路径, 可使用相对路径, 在 $PGDATA 目录下
log_directory= pg_log 
#log_rotation_age: 每个多长时间产生一个日志, 如设置为 1d, 则每隔一天产生一个日志文件  
#logging_collector=on 时生效
log_rotation_age=1d
#log_rotation_size: 单个文件的最大大小, 超过此值, 重新生成日志文件
#logging_collector=on 时生效
log_rotation_size=16MB
#log_min_duration_statement: 记录执行时长 此值定义的 SQL 语句
log_min_duration_statement=1s

五、谨慎使用

synchronous_commit

# 是否等待 WAL 数据写入到磁盘后才返回成功, 可选的值为 on, remote_apply, remote_write, local, off, 默认为 on
#synchronous_commit 设置为 off, 可能会导致虽然成功但实际上没有持久化的事务
synchronous_commit=on

commit_delay/commit_siblings

#commit_delay: 事务提交后,日志写到 wal_buffer 至 wal_buffer 中的内容写入磁盘的时间间隔
#commit_siblings: 触发 commit_delay 等待的并发事务数, 如并发事务数 该值, 则 commit_delay 无用
#这两个参数用于提升在高并发非只读事务的情况下的性能, 可以让 buffer 一次可以刷出较多的事务(Bulk Flush 的效果)
#但同样的, 如果出现极端情况,buffer 来不及持久化的时候出现崩溃, 将会导致数据丢失
commit_delay=0
commit_siblings=5

fsync

# 设置为 on 时,日志缓冲区刷盘时确认已经写入磁盘才会返回;
#设置为 off 时,由 OS 负责调度,能更好利用 OS 的缓存机制,提高 IO 性能。#利用异步写入的机制提升性能, 但同样存在数据丢失的风险
fsync=on

感谢各位的阅读,以上就是“PostgreSQL 数据库的参数设置有哪些”的内容了,经过本文的学习后,相信大家对 PostgreSQL 数据库的参数设置有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计3751字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)