前言
postgresql 有一个后台进程 bgwriter,它会定时刷新缓存到文件系统中。这种机制提高了缓存的替换速度,因为在寻找空闲缓存时,有时需要将脏页刷新到文件中,而刷新操作是比较耗时的。同样它也提高了执行 checkpoint 的完成速度,因为 checkpoint 需要刷新所有的脏页。
监控
BgWriter 的监控只能从 ****视图查看,它只是记录了统计数据
ColumnTypeDescriptionbgwriter 刷新缓存的总数因为达到最大缓存刷新数目,而bgwriter退出的次数用户的可用缓存分配数目
BgWriter 进程
bgwriter 进程的原理很简单,它只是定期的执行缓存刷新。它有两个状态,正常状态和冬眠状态。在正常状态下,bgwriter 在刷新完缓存后,会等待时长(可以在指定,默认值为200ms)。当连续两次都没有要刷新的缓存,那么就会进入冬眠状态,这时的等待时长变为。
执行原理
BgWriter 进程会维护了一些统计数据,这些数据会影响到刷新缓存的执行。在介绍下面内容之前,读者需要了解下 clock sweep 缓存替换算法,可以参考此篇文章。
确认遍历数目和位置
postgresql 的缓存是由一个环形数组来表示,clock sweep 算法会记录上次的遍历结束位置和已遍历的缓存轮数。我们把 clock sweep 算法的遍历位置记为,缓存轮数记为。当然 bgwriter 也会记录上次的遍历结束位置和遍历轮数,分别记为和。
首先确定遍历的缓存数目和起始位置。遍历的方向只能从前往后,并且需要此次 bgwriter 能够遍历到。分为下面三种情况:
1. > 并且 ,那么遍历数目为,否则不需要遍历。
2. == 并且 ,那么遍历数目为
3.其他情况,遍历数目为,起始位置为,更新
预估缓存替换数目
bgwriter 还会使用以往的缓存替换数据,来推断此次 bgwriter 的缓存需求数目和。
计算此次 bgwriter 的缓存需求数目,采用了平滑算法,
其实 已经可以作为此次 bgwriter 到下次期间的缓存需求预估值,但是为了应对请求突然增大的情况,这里会再乘以因子(可以在配置)
因为缓存遍历是从开始向后遍历,直到遇到为止。而从到的这段距离,是有其他进程遍历的,我们需要估算出这部分的可用缓存数量。
通过上次 bgwriter 到此次的统计数据来估算。这里先估算出来找到平均一个可用缓存需要遍历的缓存数目
到这段距离,预估的可用缓存数目
执行完成条件
bgwriter 会从第一步计算出的遍历起始位置,开始遍历。
当它满足下面三个条件之一,就会认为此次 bgwrite 完成。
1.遍历的缓存数目已经达到结束位置(在第一步中确认遍历数目和位置)
2.遍历过程中,
3.刷新的数目超过了(可以在中配置)
局部 sync
注意上面的脏页刷新只是写入到了文件系统的cache里,并不代表着持久化到磁盘,所以它会发送局部 sync 请求。当请求量超过了,就会处理堆积的 sync 请求。注意到这里是局部 sync 请求,它在处理时调用了方法,只是文件中指定的一段内容持久化到磁盘,而不是整个文件。
配置参数
名称含义默认值每次执行bgwriter的间隔时间200ms每次执行bgwriter,刷新缓存的最大数目100在预估需要缓存数目的因子2当局部sync请求达到的最大数,会触发处理512KB
这个配置项比较特殊,如果没有附带单位,那么表示缓存的个数。如果有,表示缓存的容量。
【PGCCC】PostgreSQL培训考试认证中心,国内权威PG培训认证机构,由工业和信息化部教育与考试中心直发证书。咨询【加V:pgccc400】
#PG证书#PG考试#postgresql培训#postgresql考试#postgresql认证
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/76528.html