checkpoints相关参数:
checkpoint_segments:
WAL log的最大数量,系统默认值是3。该值越大,在执行介质恢复时处理的数据量也越大,时间相对越长。
checkpoint_timeout:
系统自动执行checkpoint之间的最大时间间隔,同样间隔越大介质恢复的时间越长。系统默认值是5分钟。不建议频繁执行检查点。否则XLOG会产生很多的FULL PAGE WRITE(when full_page_writes=on)
checkpoint_completion_target:
该参数表示checkpoint的完成目标,系统默认值是0.5,也就是说每个checkpoint需要在checkpoints间隔时间的50%内完成。比如checkpoint_timeout为30min,那么checkpoint要在50*0.5=25分钟内完成检查点
checkpoint_warning:
系统默认值是30秒,如果checkpoints的实际发生间隔小于该参数,将会在server log中写入写入一条相关信息。可以通过设置为0禁用信息写入。
checkpoint执行控制:
1,数据量达到checkpoint_segments*16M时,系统自动触发;
2,时间间隔达到checkpoint_timeout参数值时;
3,用户发出checkpoint命令时。
建议设置
由于业务上还需要读写磁盘,同时PG目前的版本还需要垃圾回收,FREEZE等会产生IO的操作。因此不能让计算得到的峰值与磁盘实际IO能力相当,应该有所保留。
1、磁盘IOPS指标,写吞吐。(假设给25%用作 刷脏离散写、WAL顺序写)
2、如果按经验参数,评估出来磁盘能力不足(检查点实际需要的IO能力,与磁盘厂商给出的IO能力的25%不匹配),怎么办?
首先调大checkpoint_timeout参数,如果到最大值(1 DAY),依旧无法满足,则需要降低shared_buffers,以及相应的max_wal_size。
3、建议设置 log_checkpoints=on , 可以评估checkpoint的统计信息,用于帮助修正以上参数。
操作系统刷脏页设置
大内存机器,LINUX可能会遇到IO HANG的问题,原因也是刷脏页的配置不正确。
LINUX也有刷脏页的内核配置,默认是一个百分比,10%的脏页,后台进程开始刷脏页。如果产生脏页过快,到达20%时,用户进程也会帮助刷脏页。
因此如果内存越大,这个阈值就越大,而如果磁盘能力没有跟上,可能一次性会刷几十GB的脏页,导致磁盘的IO能力打爆,影响正常业务。
相关参数
1、os 内核参数
vm.dirty_background_bytes = 409600000
vm.dirty_background_ratio = 0
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 95
vm.dirty_writeback_centisecs = 100
2、数据库参数
shared_buffers = 8GB # min 128kB
# (change requires restart)
# - Checkpoints -
#checkpoint_timeout = 5min # range 30s-1d
#max_wal_size = 1GB
#min_wal_size = 80MB
#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0
#checkpoint_flush_after = 256kB # measured in pages, 0 disables
#checkpoint_warning = 30s # 0 disables