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/(数据库的个数) 的时间就要被唤醒,并启动对应的autovacuumworker 进程。
基于此设计思想,autovacuum launcher 进程中维护了一个数据库列表DatabaseList,其中维护了各个database的期望AutoVacuum时间等信息,具体的元素结构如下:
原文链接
相关文章推荐
- [源码分析]Android消息机制之Handler类
- quartz集群调度机制调研及源码分析---转载
- rt-thread的IPC机制之信号量源码分析
- PgSQL · 源码分析· pg_dump分析
- Linux c 开发 - Memcached源码分析之存储机制Slabs(7)
- 异步消息机制源码分析
- 分布式消息队列RocketMQ源码分析之3 -- Consumer负载均衡机制 -- Rebalance
- rt-thread的IPC机制之消息队列源码分析
- 【Flume】【源码分析】flume中FailoverSinkProcessor容错处理机制源码分析
- android源码分析(一) - 语言切换机制
- 分布式消息队列RocketMQ源码分析之3 -- Consumer负载均衡机制 -- Rebalance
- Android消息处理机制源码分析(二):本地实现
- Android 4.0 Launcher2源码分析——主布局文件
- Android IPC 通讯机制源码分析 (二)
- MySQL系列:innodb源码分析之线程并发同步机制
- android源码分析(一) - 语言切换机制
- Android 4.0 Launcher源码分析系列
- Ruby的GC机制源码分析(3)
- Android触摸屏事件派发机制详解与源码分析一(View篇)
- Android异步消息机制及源码分析