首先,我知道依赖于应用程序层的手动真空是很奇怪的,但这就是我们决定运行它的方式。我有以下堆栈:
中
现在问题就在这里。当我们用autovacuum=off全新的桌子开始的时候,手动吸尘器工作得很好。我可以看到dead_tuples的数量增长到阈值,然后返回到0。这些表是在并行连接中大量更新的(也使用了HOT)。在某种程度上,死行数就像100 k跳到阈值,然后返回到100 k。n_dead_tuples慢慢地爬上来。
现在最糟糕的是,当您从pg控制台发出真空时,所有死元组都会被清除,但奇怪的是,当应用程序发出真空时,它是成功的,但部分地清除了“记录的阈值量”,但不是全部?现在,我非常肯定以下几点:
auto-vacuum
从控制台发出带有vs JDBC的自动提交的真空有什么区别?为什么从控制台发出的真空是清洁所有的管,而来自JDBC的真空只清理它的一部分?JDBC真空是在池的新连接中运行的,是默认的隔离级别,是的,有些更新是并行进行的,但这与从控制台执行真空时相同。
来自池的连接是否已损坏,无法看到更新?与世隔绝是问题吗?可见地图腐败?引用旧元组的索引?
旁注:我观察到,同样的行为与自动真空和通过屋顶的成本限制一样,4000-8000,阈值违约+ 5%。一开始n_dead_tuples在4到5个小时内接近0.第二天,这张桌子上有86毫升的死元组。其他桌子都是吸尘器。
PS:我将尝试在JDBC中记录vac的详细内容。PS2:因为我们在AWS中运行,会不会是一个备份导致它停止清理?
PS3:当提到真空时,我指的是简单的真空,而不是全真空。我们不会发出完全真空。
发布于 2021-06-15 20:16:29
主要问题是真空由另一个用户运行。我所看到的真空是运行在数据上的热更新+选择,导致页面处于真空状态。
下一步:在所有模式和表中长期运行事务会影响空分。是的,所有的架构和表。更改为正确的用户修复了真空,但如果在任何其他open_in_transaction中存在schema.table,则会忽略它。
工作维护内存有帮助,但最终当系统在沉重的负荷下,所有的真空暂停。
因此,我们对DB的资源进行了一些升级,并添加了一个监视器,以帮助我们解决任何问题。
https://stackoverflow.com/questions/66357988
复制相似问题