关于pgsql中的autovacuum
技术 2

autovacuum 介绍

什么是 autovacuum

为了完成数据库的 MVCC 多版本控制,pgsql 每个表中的行会存在多个版本的数据
而在相应事务结束之后,过期版本的数据将不再有作用,被称为死元组(dead tuple)
autovacuum 是一个后台进程,负责移除死元组,防止死元组膨胀
如果不及时的将这些死元组进行清理,会影响磁盘空间的利用和数据库的性能

参数说明

可以通过下面语句查询 autovacuum 的配置参数

select * from pg_settings where name like 'autovacuum%'

IMG_0261.PNG

  • autovacuum
    默认:autovacuum = on (布尔型)
    表示是否开启autovacuum。当需要冻结xid(事务ID)时,尽管此值为off,PG也会进行vacuum。

  • autovacuum_analyze_scale_factor
    默认:autovacuum_analyze_scale_factor = 0.1(数字型)
    表示autovacuum的analyze操作所需的变更量阈值,当这个表的INSERT/update/delete的tuple总数大于(pg_class.reltuples*
    autovacuum_analyze_scale_factor+autovacuum_analyze_threshold)时, 触发analyze操作。

  • autovacuum_analyze_threshold
    默认:autovacuum_analyze_threshold = 50(数字型)
    自动analyze操作的最小行数,有利于对SQL语句进行更精准匹配到最好的执行计划。

  • autovacuum_freeze_max_age
    默认:autovacuum_freeze_max_age = 200000000(数字型)
    某表的pg_class.relfrozenxid的最大值,如果超出此值则重置xid,冻结表的记录。

  • autovacuum_max_workers
    默认:autovacuum_max_workers = 3(数字型)
    autovacuum最大工作清理进程数,CPU核多IO好的情况下,可以增加,但是注意内存消耗,有多少个worker就会有多少倍的autovacuum_work_mem内存使用,会消耗较多内存,重启数据库生效。

  • autovacuum_naptime
    默认:autovacuum_naptime = 1min(分钟)
    两次vacuum启动的时间间隔。

  • autovacuum_vacuum_cost_delay
    默认:autovacuum_vacuum_cost_delay = 20ms (数字型)
    当autovacuum进程执行时,对vacuum执行cost进行评估,如果超过autovacuum_vacuum_cost_limit的值时,则延迟这么长的时间。

  • autovacuum_vacuum_cost_limit
    默认:autovacuum_vacuum_cost_limit = -1 (数字型)
    autovacuum进程的评估阀值,-1表示使用vacuum_cost_limit值,如果在执行
    autovacuum进程期间评估的cost超过autovacuum_vacuum_cost_limit,则autovacuum进程则会休眠。

  • autovacuum_vacuum_scale_factor
    默认:autovacuum_vacuum_scale_factor = 0.2(数字型)
    autovacuum的vacuum操作所需的变更量阈值。

  • autovacuum_vacuum_threshold
    默认:autovacuum_vacuum_threshold = 50(数字型)
    自动vacuum操作的最小行数。

触发条件

  • Autovacuum Vacuum 对死元组进行清理
    autovacuum_vacuum_scale_factor 参数决定了 Vacuum 何时触发
    表中的死元组数 update/delete 超过 (pg_class.reltuples * autovacuum_vacuum_scale_factor + autovacuum_vacuum_threshold) 时触发 vacuum
    建议不要太高频率,否则会因为 vacuum 产生较多的XLOG

  • Autovacuum Analyze 分析重建数据分布统计信息
    autovacuum_analyze_scale_factor 参数决定了 Analyze 何时触发
    表中的元组变动 insert/update/delete 超过 (pg_class.reltuples * autovacuum_analyze_scale_factor + autovacuum_analyze_threshold) 时, 触发 analyze

vacuum的影响

Autovacuum 是一个I/O密集型操作,在短时间内触发多张表的大量数据的 vacuum 会导致数据库服务能力的大幅下降
在一些有大量 update 的批量作业完成后尤其明显

autovacuum 调整

提前手动触发

vacuum 是一个I/O密集型操作,与其让其在未知的业务高峰期触发,不如在业务平缓时提前进行死元组的清理
例如可以在夜间执行定时任务进行 vacuum

vacuum tablename

这种方式适用于表的记录多,更新和删除操作不多,autovacuum 触发不频繁的情况

调整 autovacuum 阈值

面对大表频繁的数据修改,会有更多的死元组,默认配置不适用于此类表
例如:使用默认值时,具有 100 万行的表在 autovacuum 开始之前需要有超过 200050 个死行 ((1000000 x 0.2) + 50)
这意味着 autovacuum 之间的间隔更长,autovacuum 时间越来越长,此时需要积极的进行行数少的 autovacuum
一种方法是使用其中一个参数,将 autovacuum_vacuum_scale_factor 设为0,而将 autovacuum_vacuum_threshold 设为 5000,则当一个表的死行数超过 5000 时,该表将 autovacuum

数据模型优化

设计表结构时应当考虑到 autovacuum 导致的问题,进行冷、热数据分离的设计
很少更新的字段和经常更新的字段尽量不要放到同一张表中,因为他们 autovacuum 周期不一致
强行放在一张表中,vacuum 的很多 I/O 被浪费在了本不需要 vacuum 的冷数据上

关于pgsql中的autovacuum
https://blog.uqaigth.com/archives/guan-yu-pgsqlzhong-de-autovacuum
作者
uqaigth
发布于
更新于
许可