背景
根据之前月报的分析,PostgreSQL中的MVCC机制(详见月报)同时存储新旧版本的元组,对于经常更新的表来说,会造成表膨胀的情况。为了解决这个问题,PostgreSQL 引入了VACUUM和ANALYZE命令,并且引入了AutoVacuum自动清理。
在PostgreSQL中,AutoVacuum自动清理操作包括:
- 删除或重用无效元组的磁盘空间
- 更新数据统计信息,保证执行计划更优
- 更新visibility map,加速index-only scans (详见文档)
- 避免XID 回卷造成的数据丢失(详见文档)
为了实现自动清理,PostgreSQL引入了两种类型的辅助进程:
- autovacuum launcher
- autovacuum worker
本文主要分析autovacuum launcher进程相关操作,autovacuum worker比较复杂和重要,我们将在下期月报详细分析。
autovacuum launcher
autovacuum launcher 进程可以理解为AutoVacuum机制的守护进程,周期性地调度autovacuum worker进程。
我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。
相关参数
autovacuum launcher 进程在postgresql.conf文件中的相关配置参数(支持对每个表单独配置参数,方法见文档)如下:
- track_counts:是否开启统计信息收集功能。
- autovacuum:是否启动系统自动清理功能,默认值为on。
- autovacuum_max_workers:设置系统自动清理工作进程的最大数量。
- autovacuum_naptime:设置两次系统自动清理操作之间的间隔时间。
- autovacuum_vacuum_cost_limit:声明将在自动VACUUM操作里使用的开销限制数值。
- autovacuum_vacuum_cost_delay :声明如果超过了上面的开销限制,则需要延迟清理的时间。
- autovacuum_freeze_max_age:设置需要强制对数据库进行清理的XID上限值。
- autovacuum_multixact_freeze_max_age:设置需要强制对数据库进行清理的multi XID上限值。
因为AutoVacuum依赖于统计信息,所以只有track_counts=on 且 autovacuum=on 时,PostgreSQL才启动autovacuum launcher 进程。
autovacuum launcher 进程会周期性地创建autovacuum worker 进程,最多能够创建autovacuum_max_workers个autovacuum worker 进程。我们将会从下面二个方面来分析autovacuum launcher:
- 执行周期,即autovacuum launcher进程的休眠时间
- autovacuum worker 调度管理
执行周期
上文的参数autovacuum_naptime决定了autovacuum launcher 的基本执行周期。在PostgreSQL中,理想状态是在autovacuum_naptime的时间内对所有的数据库进行一次清理,即每个数据库希望能够分配到autovacuum_naptime/(数据库的个数) 的时间片去创建一个autovacuum worker进行自动清理。这就要求autovacuum launcher 进程每经过autovacuum_naptime/(数据库的个数) 的时间就要被唤醒,并启动对应的autovacuum worker 进程。
基于此设计思想,autovacuum launcher 进程中维护了一个数据库列表DatabaseList,其中维护了各个database的期望AutoVacuum时间等信息,具体的元素结构如下: