开发者社区> 问答> 正文

备机查询冲突

我叫石头 2018-12-02 14:45:22 363

主机update时,会触发页面的整理操作,产生XLOG2_CLEAN操作记录,这个操作和备机的查询长事务相互冲突,导致备机查询失败

清理代码: heap_page_prune_opt

查阅社区,社区上有一个帖子,讨论关闭autovacuum后,反复update,再插入,结果膨胀比例不是成倍增加的情况

https://www.postgresql-archive.org/insert-update-performance-td5883748.html#a5884440
这个清理操作可能不是vacuum产生的,而是由update产生的,理论上查询也有可能会触发(今天遇到一个大量删除某个表中元组后,关联该表查询语句引发IO,导致系统IO突然升高,怀疑和这个类似)
image

这个堆栈是帖子上的,查询引起清理。我遇到的情况是,反复删除后,磁盘IO突然冲高,解析了下xlog,全部是这种清理操作记录,并且查询语句都在等待IO,内核函数显示是在io上

分享到
取消 提交回答
全部回答(1)
  • 我叫石头
    2019-07-17 23:17:58

    这个意思是如果页面上有pd_prune_xid,并且pd_prune_xidimage
    image

    反复update会触发这个清理,导致备机查询冲突。
    从日志看最后都是在做清理,但是之前做的操作一直是删除,突然触发感觉好诡异。不过现象,是系统IO满了,所有select查询语句都处于等待io状态

    应该是autovacuum清理吧,另外生产环境不建议关闭autovacuum,关了会引起表和索引的膨胀

    我前面自己测试了下确实是会清理,这个清理功能是为了hot做的,vacuum成本太高,而且会清理索引,heap_page_prune_opt就是为了清理几个页面做的,是启发式触发的,如果访问这个页面,页面头信息中有pg_prune_xid,并且页面的空闲空间小于fillfactor,可以获得buffer cleanup lock时就会触发这个清理操作,不过这个应该不会引起大量的io,因为这个就是对单个页面进行整理,具体你可以看下/src/backend/access/heap/README.HOT的When can/should we prune or defragment

    问题答疑来自云栖社区-技术进阶[钉钉群],喜爱PostgresSQL的同学扫码进群
    image

    0 0