PostgreSQL之BgWriter

最近搞了一个公众号PostgreSQL运维技术,欢迎来踩~

悄悄放一张:

PostgreSQL运维技术 

 

1、bgwriter是什么?

Bgwriter是一个Background Writer进程的简称。

Bgwriter会将缓存中一些已经更改的数据(脏缓冲区)写入到磁盘。

之前我在checkpoint的文章里介绍过,checkpoint也是会将缓存中的脏数据写入到磁盘。

 

2、那么checkpoint与Bgwriter的区别是什么?
 

checkpoint是以特定的时间间隔刷新所有脏页,并创建一个用于数据库恢复用的检查点。

而Bgwriter是在检查点之间刷新一些脏页面,以便始终有足够多的干净页面可以使用。

两者的目的和执行频率都有不同。

 

3、bgwriter的作用是什么?

  • 提高了缓存的替换速度,提高了数据查询性能。因为数据库在进行查询处理时,若发现要读取的数据不在缓冲区要先从磁盘中读入该页,这时如果缓冲区已满,就需要先选择一些缓冲区中的页面替换出去。如果要被替换的页被修改了,则必须先将这个页面读出到磁盘才能替换,这样数据库的查询就会被阻塞在这里。通过bgwriter定期的写出缓冲区的部分页面,就可以为缓冲区腾出空间。就可以防止这一情况。

  • 同时,因为bgwriter预先写出了一些脏页面,可以减少checkpoint时要进行的io操作,使系统的IO负载趋于平稳。( 前面checkpoint的文章中提过checkpoint会引起“IO峰值”)

4、bgwriter会带来的影响?

如果bgwriter设置的不合理,比如间隔时间过多,bgwriter过于积极的将脏页写出,则经常被更新的数据页可能会多次写出到磁盘上,从而导致不必要的额外的IO负载。

 

5、Bgwriter使用的缓存替换算法?

8.1版本之前是用的LRU算法,从8.1版开始,PostgreSQL使用了Clock Sweep(时钟扫描)。


6、什么是Clock Sweep算法?

clock sweep 算法的思想是根据访问次数来判断哪些数据为热点数据。当缓存空间不足,它会优先替换掉访问次数低的缓存。

 

下面具体介绍下:

该部分参考:https://www.interdb.jp/pg/pgsql08.html#_8.4.4.

将缓冲区描述符想象成一个循环列表(参考下图)。

 

图片

nextVictimBuffer表示一个无符号32位整数,总是指向缓冲区描述符之一,并顺时针旋转。

伪代码及算法描述如下:

     WHILE true(1)     Obtain the candidate buffer descriptor pointed by the nextVictimBuffer(2)     IF the candidate descriptor is unpinned THEN(3)         IF the candidate descriptor's usage_count == 0 THEN              BREAK WHILE LOOP  /* the corresponding slot of this descriptor is victim slot. */         ELSE        Decrease the candidate descriptpor's usage_count by 1               END IF         END IF(4)     Advance nextVictimBuffer to the next one      END WHILE (5) RETURN buffer_id of the victim

 

伪代码:

(1)获取nextVictimBuffer的下一个候选缓冲区描述符。

(2)如果缓冲区描述符没有被固定,则执行步骤(3),否则,执行步骤(4)

(3)如果候选描述符的usage_count为0,则选择该描述符对应的槽位作为受害者(需需要被置换的页面),继续步骤(5);否则,将此描述符的usage_count减少1并继续执行步骤(4)。

(4)将nextVictimBuffer推进到下一个描述符(如果在结尾,进行下一次循环)并返回到步骤(1)。重复直到找到受害者。

(5)返回受害者的buffer_id。

每当nextVictimBuffer扫描一个未固定的描述符时,它的usage_count就减少1。因此,如果缓冲池中存在未固定的描述符,此算法总是可以通过旋转nextVictimBuffer找到其usage_count为0的受害者。
 

4、bgwriter相关的配置参数?

参考官网:https://www.postgresql.org/docs/13/runtime-config-resource.html

 

Bgwriter_delay:表示在一次刷脏页面后的睡眠时间。注意bgwriter的休眠时间不是一定是这个值,当缓冲池中没有脏缓冲区时,不管bgwriter_delay是多少,它都会进入更长时间的休眠。

Bgwriter_lru_maxpages:每个写入器在一次bgwriter工作时所允许写出的最大页面数量。

Bgwriter_lru_multiplier:

在每轮中写出的脏缓冲区的数量基于最近几轮中服务器进程需要的新缓冲区的数量。最近的平均需求乘以bgwriter_lru_multiplier,以估计下一轮所需的缓冲区数量。脏缓冲区被写出,直到相应的数量的缓冲区为止。(每轮写入的缓冲区数量不会超过bgwriter_lru_maxpages。)。

因此,1.0的设置表示一个“及时”的策略,即准确地写入预测需要的缓冲区数量。

较大的值可以缓冲需求的峰值,而较小的值有意让服务器进程完成写操作。默认值是2.0。

bgwriter_flush_after:只要后台写入的数据超过这个数量,尝试强制 OS 把这些写发送到底层存储上。这样做将限制内核页缓存中脏数据的量,降低了在检查点末尾发出一个 fsync 时或者 OS 在后台大批量写回数据时卡住的可能性。 那常常会导致大幅度压缩的事务延迟,但是也有一些情况(特别是负载超过shared_buffers但小于 OS 页面高速缓存)的性能会降低。(这个参数后面有机会再展开讲一下)

 

5、怎么监控bgwriter?

通过pg_stat_bgwriter视图。

 

 

 

参考:

https://www.interdb.jp/pg/pgsql08.html#_8.4.4.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值