PosgreSQL参数快速调优

举报
大中华潇湘夜雨 发表于 2021/11/30 16:18:04 2021/11/30
【摘要】 1. 虚机环境CPU: 4 coreMem: 8GOS: CentOS 7.6(64 Bit)PostgreSQL:9.4.52.参数设置基本的性能参数设置可以利用下面这个在线小工具评估。http://pgtune.leopard.in.ua/填入系统信息,并固定最大连接数为300后,选择不同DB Type,这个工具会给出不同的参数。Web applicationsmax_connectio...

1. 虚机环境

CPU: 4 core
Mem: 8G
OS: CentOS 7.6(64 Bit)

PostgreSQL:9.4.5

2.参数设置

基本的性能参数设置可以利用下面这个在线小工具评估。

http://pgtune.leopard.in.ua/

填入系统信息,并固定最大连接数为300后,选择不同DB Type,这个工具会给出不同的参数。

Web applications

max_connections = 300
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 6990kB
maintenance_work_mem = 512MB
checkpoint_segments = 32
checkpoint_completion_target = 0.7
wal_buffers = 16MB
default_statistics_target = 100

Online transaction processing systems

max_connections = 300
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 6990kB
maintenance_work_mem = 512MB
checkpoint_segments = 64
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100

Data warehouses

max_connections = 300
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 3495kB
maintenance_work_mem = 1GB
checkpoint_segments = 128
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 500

上面3种DB Type,越往后写越重,checkpoint的频率也调得越低。由于后面要做OLTP的性能评估,所以选用Online transaction processing systems的设置。

综合考虑log等需求,初步在postgresql.conf中设置参数如下

listen_addresses = '*'
port = 5432
max_connections = 300
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 6990kB
maintenance_work_mem = 512MB
checkpoint_segments = 64
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1440
log_rotation_size = 100000
log_line_prefix='%m %p %x'
wal_level = hot_standby

流复制时需要设置wal_level = hot_standby,单机场景下可以设置其它值以输出更少的WAL日志。

下面这几个参数有些需要在性能和持久性之间平衡,先全部采用默认值。

wal_sync_method = fsync
commit_delay = 0
synchronous_commit = on
full_page_writes = on
fsync = on

3. 测试

4. 参数的优化

压力测试时pg常调参数示例1

max_connections = 300
#根据数据量尽量调大shared_buffer值,把所有数据都放到内存中更好,
#曾经在32G内存的服务器上把shared_buffert调到了26G 
#wal_buffers根据产生的wal日志量也适当设大点
shared_buffers=1200MB 
wal_buffers = 2000kB
#work_mem要适可而止,每个连接都要用这么大的
work_mem = 1024kB
#一般做做检查点的时间长于压力测试的时间,这样性能数据会更好,等压力测试完了再去做检查点吧。
Checkpoint_timeout=120min
 
bgwriter_delay = 10ms  
bgwriter_lru_maxpages = 75
full_page_writes = off
log_min_messages = fatal
#压力测试时由于高并发等锁的时间可以长一些
deadlock_timeout = 3s
 
#平时实践有些应用中把位图扫描和顺序扫描关了性能会更好 
enable_bitmapscan = off
enable_seqscan = off
#如果是只读的压力测试,还可以关掉没事的后台写进程等



压力测试时pg常调参数示例2

shared_buffers = 512MB        # 不需要太大,因为postgresql的不是使用direct io 还依赖系统的page cache来缓存的。
effective_cache_size  = 4GB   # 提示系统可以用来做page cache的内存大小,可以设置为系统内存的75%。只是提示数据库选择合适query plan

checkpoint_segments = 64      # 这两个控制checkpoint的频率和持续的时间。
checkpoint_timeout = 10min    # 跟上面一个类似,不过是时间限制,那个先到达都触发checkpoint操作
checkpoint_completion_target = 0.9   #  checkpoint的持续占总的比例, 可以避免checkpoint的突发io

fsync = on   # 强制等待wal log 写到磁盘才能保证数据的完整性,关闭之后数据完整性就不能保证了,不过性能更好。因为transaction的WAL就不刷数据到磁盘了。
synchronous_commit = on   # 默认强制保证所有的transaction 都等待磁盘操作完才会返回成功。如果关闭了,宕机后可能最最多3个wal_writer_delay 的时间窗口内的transaction的数据就丢失。 如果你能容许少量的事务在crash之后丢失,是可以考虑这个选项试试看。性能会好很多


vacuum_cost_delay = 10ms  #这个值是指vacuum在消耗多少资源后停顿多少时间,以便其他的操作可以使用更多的硬件资源.

log_min_duration_statement = 1000ms # 记录运行超过1秒的SQL到日志中, 一般用于跟踪哪些SQL执行时间长. /var/log/postgres/

log_checkpoints = on # 记录每一次checkpoint到日志中.

# 记录锁等待超过1秒的操作, 一般用于排查业务逻辑上的问题.
log_lock_waits = on
deadlock_timeout = 1s

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。