Postgresql autovacuum 6 为什么大表不进行autovacuum 的原因 (非事务,复制槽原因)...

的确是,最近一直在研究和写autovacuum的事情,但造化弄人,阴沟翻船的事情也是不少预见了,这次就遇到了。(让你前5篇嘚瑟)

先简化的说一下事情,因为要调整参数,找到怎么快速激发autovacuum工作的方法,在参数的调试中,掉入了黑洞。

1 环境:PG  11.7   CPU 2 core   内存  16G   磁盘普通SATA

2  参数配置  SB 4G  autovacuum_mem 1G  maintanence_work_mem 1G

3  通过pgbench 灌入大表数据

2bfd1466ddaebd339610876276e69e67.png

46adb3e1cb37ee29208963db042a6d10.png

对数据库产生数据压力,80客户端 每个客户端10个进程  不间断的进行DML操作

4c99c3fda5c33fd4f8f5a9809c2f07af.png

通过系统表可以看到,这里的测试表的小表的 autovacuum 很快就进行清理了。

下面系统表展示了表的活的tuple , 死的tuple 以及 死的tuple 占整体的总行的百分比。最后面是autovacuum 最后一次的时间。

5794d2c8fbe43c0818478d6aed65892d.png

下图可以看到只有1 亿的大表的 autovacuum last 的时间没有动,和其他表相比,上一次autovacuum 的时间在 7 个小时前。 

c158226d2251f92022de7337edf58c4f.png

基本上每秒死行在这个表上增加 200行左右。

c26c82033814bfdc5b2639a737447184.png

根据前几篇写的,有的同学可能会提到,调整的参数  

autovacuum_vacuum_threshold   和  autovacuum_vacuum_scale_factor 这两个参数,可以看到已经调整过了,实际上针对大表应该单独进行调整,这里就偷懒了。具体如何进行单表调整,看第三篇即可。

2f6613e0397db1a3963cc46be2fb7b2e.png

但是调整成这样系统大表 pgbench_accounts 还是没有进行 autovacuum

9eddd5f39155b404173545a3f0ad33a9.png

随即苦恼了一天,继续测试找问题,

此时估计有同学会提出,三个应该 autovacuum 的工作的原因

1   长事务影响,导致 autovacuum 不能进行工作

2   有复制槽影响,并且复制停止了,导致autovacuum 不能工作

3   因为autovacuum 的cost 过大导致不能进行 autovacuum的工作

这里可以排除以上三个原因,这边没有长事务,单机,并且相关的 cost 已经调整(具体 cost调整 看第四篇)

所以autovacuum 不工作,或者无法更好的工作的原因还有其他的,并且网上我没有找到描述这方面的原因。

原因  1    autovacuum  对大表操作时间过长,通过观察系统中的活动的进程,可以发现实际上autovacuum 在工作中,只是工作的时间较长。

ab3efd0cca9ad8a6cdae7aecff53dcd0.png

其他的表本身在进行autovacuum 很快就完成了工作。

f43710feec7544f84ce012ea99755013.png

所以第一个原因并不是autovacuum没有工作,而是工作的时间太长。

从另一个角度可以证明,对于大表的参数应该是单独调整,不应该在整体的参数进行配置, 对于大表的autovacuum 应该控制频度。频度太低和太高都对大表的vacuum操作无益处。

原因2  众所周知,在autovacuum 操作中,会带有两个操作 1 vacuum  2  analyze,  在autovacuum 操作完毕后,需要进行 analyze 的操作, 而大表的vacuum analyze 也不是很快的,所以有些时间 autovacuum 不操作的原因也有 analyze的因素,长时间无法完成 analyze ,自然会影响 autovacuum的 真空操作。

d7e099989aa987a5adcece0068af5bd6.png

所以以上两个原因都是针对大表的很长时间没有进行autovacuum操作的奇葩原因。

遇到上面的问题主要要考虑

1   是否需要对表进行分区处理,单表无法进行并发的autovacuum 的操作,将表分区可以提高针对表的vacuum 的速度

2  存储大表的数据磁盘,替换为SSD 磁盘

3  通过降低autovacuum_analyze_scale_factor 参数的,减少对大表的 analyze时时间过长,阻碍 autovacuum vacuum 。

4  定期晚上进行手动的 vacuum 对于大表 ,在手动vacuum 时会autovacuum针对这个表的操作会停止。

8dd329091a91f57785c68206a58800d0.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值