PostgreSQL上激进的Autovacuum
我试图让PostgreSQL积极地自动清空我的数据库.我目前配置自动真空如下:
> autovacuum_vacuum_cost_delay = 0#关闭基于成本的真空 我注意到,当数据库没有负载时,自动真空只会启动,因此我会遇到死元组比实时元组多得多的情况.请参阅附带的屏幕截图以获取示例.其中一个表有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的行为几乎总是更好的答案. 但是,再一次,它不太可能解决您的真正问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |