PostgreSQL上激进的Autovacuum

前端之家收集整理的这篇文章主要介绍了PostgreSQL上激进的Autovacuum前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图让Postgresql积极地自动清空我的数据库.我目前配置自动真空如下:

> autovacuum_vacuum_cost_delay = 0#关闭基于成本的真空
> autovacuum_vacuum_cost_limit = 10000 #Max值
> autovacuum_vacuum_threshold = 50 #Default值
> autovacuum_vacuum_scale_factor = 0.2 #Default值

我注意到,当数据库没有负载时,自动真空只会启动,因此我会遇到死元组比实时元组多得多的情况.请参阅附带的屏幕截图以获取示例.其中一个表有23个实时元组,但有16845个死元组等待真空.那太疯狂了!

当测试运行完成并且数据库服务器空闲时,自动真空启动,这不是我想要的,因为每当死元组的数量超过20%的实时元组50时,我希望自动真空启动,因为数据库已经配置.服务器空闲时的自动真空对我来说是无用的,因为生产服务器预计会在一段持续时间内达到1000次更新/秒,这就是为什么即使服务器负载也需要自动真空运行的原因.

有什么我想念的吗?在服务器负载很重的情况下,如何强制自动真空运行?

更新

这可能是锁定问题吗?有问题的表是汇总表,通过后插入触发器填充.这些表在SHARE ROW EXCLUSIVE模式下被锁定,以防止并发写入同一行.

Eelke几乎肯定是正确的,你的锁定阻止autovacuum. Autovacuum旨在故意让位于用户活动.如果这些表被锁定,autovacuum无法对它们进行真空吸尘.

然而,对于后代,我想给出超级激进的autovacuum的一组示例设置,因为你提供的设置并不完全如此.但请注意,使autovacuum更具攻击性不太可能解决您的问题.另请注意,默认的autovacuum设置基于使用DBT2运行超过200次测试运行,寻求最佳的设置组合,因此默认值应该被认为是好的,除非你有充分的理由不这么认为,或者除非你的数据库明显在外面OLTP数据库的主流(例如,每秒获得10K更新的小型数据库,或3TB数据仓库).

首先,打开日志记录,以便检查autovacuum是否正在执行您认为的操作:

log_autovacuum_min_duration = 0

然后让我们制作更多autovac工作者并让他们更频繁地检查表格:

autovacuum_max_workers = 6
autovacuum_naptime = 15s

让我们降低自动真空和自动分析的阈值,以便更快触发:

autovacuum_vacuum_threshold = 25
autovacuum_vacuum_scale_factor = 0.1

autovacuum_analyze_threshold = 10
autovacuum_analyze_scale_factor = 0.05

然后让我们使autovacuum更容易中断,因此它的完成速度更快,但代价是对并发用户活动产生更大的影响:

autovacuum_vacuum_cost_delay = 10ms
autovacuum_vacuum_cost_limit = 1000

这是针对一般攻击性autovacuum的完整程序,这可能适用于小型数据库获得非常高的更新率,但可能对并发用户活动产生太大影响.

另外,请注意autovacuum parameters can be adjusted per table,这对于需要调整autovacuum的行为几乎总是更好的答案.

但是,再一次,它不太可能解决您的真正问题.

猜你在找的Postgre SQL相关文章