您的位置:首页 > 数据库

PgSQL · 源码分析 · AutoVacuum机制之autovacuum launcher

2018-02-05 14:05 260 查看


背景

根据之前月报的分析,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时间等信息,具体的元素结构如下:

原文链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: