PostgreSQL之autovacuum

autovacuum 是 postgresql 里非常重要的一个服务端进程,能够自动运行,在一定条件下自动触发对 dead tuples 进行清理并对表进行分析。

autovacuum相关参数:

# 默认为on,表示是否开起autovacuum。默认开起。特别的,当需要冻结xid时,尽管此值为off,PG也会进行vacuum。
autovacuum=on 

# 两次vacuum间隔时间,默认10min。 这个naptime会被vacuum launcher分配到每个DB上。autovacuum_naptime/num of db。 
autovacuum_naptime=1min

# 在规定时长内未完成的vacuum予以记录日志,单位ms,当vacuum动作超过此值时。 "-1"表示不记录。"0"表示每次都记录。 
log_autovacuum_min_duration=500

# 默认值是3。 autovacuum最大线程数,CPU核多,并且IO好的情况下,可多点
autovacuum_max_workers=3

# 每个worker可使用的最大内存数。
autovacuum_work_mem=64MB 

# 当update,delete的tuples数量超过 autovacuum_vacuum_scale_factor * table_size + autovacuum_vacuum_threshold 时,进行vacuum。如果要使vacuum清理频繁,则将以下两个参数改小。 
# 清理阀值,与autovacuum_vacuum_scale_factor配合使用,默认50。 
autovacuum_vacuum_threshold=50
# 清理的缩放系数,默认值为0.2。
autovacuum_vacuum_scale_factor=0.2

# 以下两个参数控制analyze运行,和上面的两个参数配置类似。
#当update,insert,delete的tuples数量超过 autovacuum_analyze_scale_factor * table_size + autovacuum_analyze_threshold时,进行analyze。
# analyze阀值,与autovacuum_analyze_scale_factor配合使用,默认50。 
autovacuum_analyze_threshold=50
# analyze的缩放系数,默认值为0.1。
autovacuum_analyze_scale_factor=0.1

# 设置需要强制对数据库进行清理的XID上限值。
autovacuum_freeze_max_age=200000000
autovacuum_multixact_freeze_max_age=400000000

# 运行一次vacuum的时长,如果超过此值则休眠然后起来接着vacuum(vacuum很好I/O),如果为-1,取vacuum_cost_delay值。 
autovacuum_vacuum_cost_delay=20ms

# 这个值是所有worker的累加值,如果为-1,取vacuum_cost_limit的值
autovacuum_vacuum_cost_limit=200

autovacuum会在两种情况下会被触发:

1、当update,delete的tuples数量超过 autovacuum_vacuum_scale_factor * table_size + autovacuum_vacuum_threshold
2、指定表上事务的最大年龄配置参数autovacuum_freeze_max_age,默认为2亿,达到这个阀值将触发 autovacuum进程,从而避免 wraparound。

建议:

1、autovacuum_max_workers的建议值为CPU核数/3。CPU资源充足,I/O性能较好时,可以适当加大。
2、对于更新频繁的交易系统,如果系统资源充足,可以缩小autovacuum_vacuum_scale_factor 与 autovacuum_vacuum_threshold,让vacuum清理频繁

更改系统autovacuum相关参数

ALTER SYSTEM SET autovacuum_vacuum_scale_factor = 0.03;
ALTER SYSTEM SET autovacuum_analyze_scale_factor = 0.03;
ALTER SYSTEM SET autovacuum_vacuum_threshold = 300;
ALTER SYSTEM SET autovacuum_analyze_threshold = 300;
select pg_reload_conf ();

更改单表autovacuum相关参数

alter table tableA set (autovacuum_vacuum_scale_factor=0.03);

推荐阅读更多精彩内容