PostgreSQL autovacuum 优化与调试 (2 autovacuum 进行了什么样的工作)

本文深入剖析PostgreSQL的自动 vacuum 功能,包括 autovacuumlauncher 的作用、autovacuumworker 的执行流程,以及autovacuum 参数的初始化和工作原理。重点讲解了表状态跟踪、并发控制和参数配置细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着上期说,第二个问题 autovacuum 到底做了什么,可以总结为四点

1   删除或重用无效元组的磁盘空间

2   更新数据统计信息,提高执行计划的效率

3   更新visibility map 

4   方式数据库回卷造成数据库进入单机模式

下面我们通过autovacuum launcher 进行切入, autovacuum launcher  是一个postgresql的外部进程,通过他来定期拉起 autovacuum worker 的线程来进行工作。

下面我们对autovacuum.c 源码部分进行简略的阅读, 在阅读之前我们将重点进行罗列方便后面理解

1   autovacuum 本身是通过两个进程来完成的, autovacuum launcher 和 autovacuum worker 组成

2  autovacuum launcher 是守护进程,autovacuum worker 是实际进行工作的进程。

3  autovacuum launcher 本身是寄存在  share buffer 内存结构中的,所以他必须通过postmaster 主进程进行拉起

4  autovacuum worker 本身是通过autovacuum launcher 守护进程拉起的,在worker 完成工作后,会发出sigusr2 信号,同时 launcher 本身也会根据参数来调配 worker的启动时机

5  autovacuum 整体会在工作的过程中将正在整理的表放入share memory中,所以启动多个 worker时不会引起系统的多 worker 整理同一个表的情况,在整理表之前也会查询表中的状态,不会对一个表重复多次的进行整理。

我们从源代码开始看, 一开始代码中会对autovacuum   中的参数进行初始化。

3c36119134c659a128fdd9b9cdf06b31.png

下面是autovacuum 的两个部分 1  launcher  2  worker 

8a54e31d343bcc49483ff9f1f01ce95f.png

在autovacuum 中在整理表之前需要拿到表的状态,同时在表整理之后也需要在重新检查表的状态

824f130ea9dfd8c9cd7c376ce68ed971.png

主要autovacuum 工作的代码

a683e72383592b6f8d09a707cc6265b5.png

其中也可以窥见autovacuum 在工作的过程中,的确是有进行表的  analyze的工作

9f1f3345993e1c0ba7d090b4f860a045.png

这一段代码是postgresql autovacuum 中 launcher 定时拉起autovacuum worker的代码。

8240ec06e589921d92e07a94d9ed3e46.png

下面这些代码是针对表进行vacuum 的源代码

d09677a617efe096a5d468f7c023d8cc.png

从代码中我们可以看到上一篇中提到的

1  autovacuum 本身是通过 launcher 运行并定时拉起 autovacuum worker 来进行工作的。

2  autovacuum 工作会获取数据库的列表以及表的列表,并且根据当前自己有的autvacuum worker的线程进行工作的分配

3   autovacuum 会进行初始化,在整理前获得表的状态,并保存在内存结构体(share buffer), 同时在执行结束后会在此检查表的状态并记录到内存的结构体中。

4   初始化的过程中会对autovacuum的参数进行初始化和读取        

autovacuum_start_daemon = false;       

autovacuum_max_workers;

autovacuum_naptime;

autovacuum_vac_thresh;

autovacuum_vac_scale;

autovacuum_anl_thresh;

autovacuum_anl_scale;

autovacuum_freeze_max_age;

autovacuum_vac_cost_delay;

autovacuum_vac_cost_limit;

Log_autovacuum_min_duration = -1;

上面变粗的格式配置参数是需要重启数据库才能生效的,其他可以在数据库工作中进行 reload 即可生效。

下一篇需要对autovacuum 的参数来进行详细的解释

590c635a10ad90e3ef2998409624b832.png

f518c03a7d405fa4e70e6ff3a95bea4e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值