PostgreSQL技术大讲堂 - 第18讲:Tuning Autovacuum

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 从小白到专家,PostgreSQL技术大讲堂 - 第18讲:Tuning Autovacuum

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。


第18讲:Vacuum空间管理工具

内容1:什么是 autovacuum?

内容2:为什么需要 autovacuum?

内容3:调整Autovacuum

内容4:记录autovacuum

内容5:什么时候在表上做autovacuum?


什么是 autovacuum?

Autovacuum是启动PostgreSQL时自动启动的后台实用程序进程之一

在生产系统中不应该将其设置为关闭

autovacuum = on # ( ON by default )

track_counts = on # ( ON by default )


为什么需要 autovacuum?

需要vacuum来移除死元组

防止死元组膨胀

更新表的统计信息进行分析,以便提供优化器使用

autovacuum launcher使用Stats Collector的后台进程收集的信息来确定autovacuum的候选表列表


记录autovacuum

log_autovacuum_min_duration

-1 :表示不记录

0 :表示记录所有的

'250ms' # Or 1s, 1min, 1h, 1d :表示记录真空操作时间大于此值的操作


什么时候做autovacuum?

1、Autovacuum操作的实际内容:1)vacuum; 2)Analyze

2、Autovacuum vacuum触发条件(如果由于更新和删除,表中氖导仕涝槭擞行с兄担蚋帽斫晌猘utovacuum的候选表):

Autovacuum VACUUM thresold for a table = autovacuum_vacuum_scale_factor * number of tuples + autovacuum_vacuum_threshold

3、Autovacuum ANALYZE触发条件(自上次分析以来插入/删除/更新总数超过此阈值的任何表都有资格进行autovacuum分析)

Autovacuum ANALYZE threshold for a table = autovacuum_analyze_scale_factor * number of tuples + autovacuum_analyze_threshold

举个栗子:

Employee = 1000行

以上述数学公式为参考:

Table:employee成为autovacuum Vacuum的候选者,当下面的条件满足时:

Total number of Obsolete records = (0.2 * 1000) + 50 = 250

Table:employee 成为 autovacuum ANALYZE 候选者,当下面的条件满足时:

Total number of Inserts/Deletes/Updates = (0.1 * 1000) + 50 = 150


Is A Problem?

· 这是不是一个问题?

1:Table1= 100行

其触发分析和vacuum的阈值分别是:60和70

2:Table2=100万行

其触发分析和vacuum的阈值分别是:100050和200050

如果两张表都做同样数量的dml操作,T1 触发Autovacuum是T2的2857倍!!!


pg_stat_user_tables

· 如何确定需要调整其autovacuum setting的表?

为了单独调整表的autovacuum,必须知道一段时间内表上的插入/删除/更新数。

SELECT n_tup_ins as "inserts",n_tup_upd as "updates",n_tup_del as "deletes",n_live_tup as "live_tuples", n_dead_tup as "dead_tuples"

FROM pg_stat_user_tables

WHERE schemaname = 'scott' and relname = 'employee';

inserts | updates | deletes | live_tuples | dead_tuples

---------+---------+---------+-------------+-------------

30 | 40 | 9 | 21 | 49


表autovacuum setting的设置

可以通过设置单个表的存储参数来重写此行为,这样会忽略全局设置。

postgres=# alter table percona.employee set (autovacuum_vacuum_threshold = 100);

postgres=# alter table percona.employee set (autovacuum_vacuum_scale_factor=0);

postgres=#

postgres=# \d+ percona.employee

Table "percona.employee"

Column | Type | Collation | Nullable | Default | Storage | Stats target | Description

--------+---------+-----------+----------+---------+---------+--------------+-------------

id | integer | | | | plain | |

Options: autovacuum_vacuum_threshold=100, autovacuum_vacuum_scale_factor = 0

只要有超过100条过时的记录,运行autovacuum vacuum.


autovacuum_max_workers

· 一次可以运行多少个autovacuum过程

1、在可能包含多个数据库的实例/群集上,一次运行的autovacuum进程数不能超过下面参数设置的值:

autovacuum_max_workers = 3 (Default)

2、启动下一个autovacuum之前的等待时间:

autovacuum_naptime= 1min

(autovacuum_naptime/N)

其中N是实例中数据库的总数

· 真空IO是密集型的吗?

1、autovacuum可以看作是一种清洁工作

2、是一个IO密集型操作

3、设置了一些参数来最小化真空对IO的影响· 以下是用于调整autovacuumIO的参数

autovacuum_vacuum_cost_limit : autovacuum可达到的总成本限制(结合所有autovacuum作业)

autovacuum_vacuum_cost_delay : 当一个清理工作达到autovacuum_vacuum_cost_limit指定的成本限制时,autovacuum将休眠数毫秒

vacuum_cost_page_hit : 读取已在共享缓冲区中且不需要磁盘读取的页的成本.

vacuum_cost_page_miss : 获取不在共享缓冲区中的页的成本.

vacuum_cost_page_dirty : 在每一页中发现死元组时写入该页的成本.

上面参数默认的值考虑如下:

autovacuum_vacuum_cost_limit = -1 (So, it defaults to vacuum_cost_limit) = 200

autovacuum_vacuum_cost_delay = 20ms

vacuum_cost_page_hit = 1

vacuum_cost_page_miss = 10

vacuum_cost_page_dirty = 20

· 让我们想象一下1秒后会发生什么。(1秒=1000毫秒)

在读取延迟为0毫秒的最佳情况下,autovacuum可以唤醒并进入睡眠50次(1000毫秒/20毫秒),因为唤醒之间的延迟需要20毫秒。

1 second = 1000 milliseconds = 50 * autovacuum_vacuum_cost_delay

由于在共享缓冲区中每次读取一个页面的相关成本是1,因此在每个唤醒中可以读取200个页面(因为上面把总成本限制设置为200),在50个唤醒中可以读取50*200个页面。

绻诠蚕砘撼迩姓业搅怂芯哂兴涝榈囊常⑶襛utovacuum代价延迟为20毫秒,则它可以在每一轮中读取:((200/ vacuum_cost_page_hit)*8)KB,这需要等待autovacuum代价延迟时间量。

因此,考虑到块大小为8192字节,autovacuum最多可以读取:50*200*8kb=78.13mb/s(如果在共享缓冲区中已经找到块)。

如果块不在共享缓冲区中,需要从磁盘提取,则autovacuum可以读取:50*(200/ vacuum_cost_page_miss)*8)KB=7.81 MB/秒。

现在,为了从页/块中删除死元组,写操作的开销是:vacuum_cost_page_dirty,默认设置为20

一个auto vacuum每秒最多可以写/脏:50*(200/ vacuum_cost_page_dirty)*8)KB=3.9mb/秒。

· 谨慎设置autovacuum_max_workers

通常, autovacuum_vacuum_cost_limit成本平均分配给实例中运行的所有autovacuum过程的autovacuum_max_workers数。

因此,增加autovacuum_max_workers可能会延迟当前运行的autovacuum workers的autovacuum执行。

而增加autovacuum_vacuum_cost_limit可能会导致IO瓶颈。

可以通过设置单个表的存储参数来重写此行为,这样会忽略全局设置。


以上就是Part 18 - Tuning Autovacuum 的内容,往期视频,联系cuug咨询老师

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
4月前
|
监控 关系型数据库 MySQL
10亿数据如何最快速插入MySQL:技术干货分享
【8月更文挑战第2天】在大数据时代,处理并快速插入数十亿条数据到MySQL数据库是许多企业面临的关键挑战。本文将深入分享一系列高效的技术策略和实战经验,帮助读者优化这一过程,确保数据能够快速、准确地进入数据库系统。
223 1
|
17天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
1月前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
121 3
|
2月前
|
XML 关系型数据库 MySQL
MySQL 导出某些数据的技术详解
MySQL 导出某些数据的技术详解
156 2
|
3月前
|
存储 关系型数据库 MySQL
技术解析:MySQL中取最新一条重复数据的方法
以上提供的两种方法都可以有效地从MySQL数据库中提取每个类别最新的重复数据。选择哪种方法取决于具体的使用场景和MySQL版本。子查询加分组的方法兼容性更好,适用于所有版本的MySQL;而窗口函数方法代码更简洁,执行效率可能更高,但需要MySQL 8.0及以上版本。在实际应用中,应根据数据量大小、查询性能需求以及MySQL版本等因素综合考虑,选择最合适的实现方案。
428 6
|
2月前
|
关系型数据库 MySQL 数据库
MySQL技术深度解析:每次最大插入条数探秘
MySQL技术深度解析:每次最大插入条数探秘
59 0
|
2月前
|
关系型数据库 MySQL 数据库管理
MySQL技术指南:如何更改数据字段的前几位数字
MySQL技术指南:如何更改数据字段的前几位数字
66 0
|
2月前
|
消息中间件 监控 关系型数据库
MySQL数据实时同步到Elasticsearch:技术深度解析与实践分享
在当今的数据驱动时代,实时数据同步成为许多应用系统的核心需求之一。MySQL作为关系型数据库的代表,以其强大的事务处理能力和数据完整性保障,广泛应用于各种业务场景中。然而,随着数据量的增长和查询复杂度的提升,单一依赖MySQL进行高效的数据检索和分析变得日益困难。这时,Elasticsearch(简称ES)以其卓越的搜索性能、灵活的数据模式以及强大的可扩展性,成为处理复杂查询需求的理想选择。本文将深入探讨MySQL数据实时同步到Elasticsearch的技术实现与最佳实践。
174 0
|
4月前
|
SQL 存储 关系型数据库
mysql加索引真的会锁表吗?揭秘背后的技术细节与规避策略
【8月更文挑战第16天】在数据库管理中,添加索引能大幅提升查询效率。MySQL执行此操作时的锁定行为常引起关注。文章详细解析MySQL中索引添加时的锁定机制及其原理。不同存储引擎及SQL语句影响锁定策略:MyISAM需全表锁定;InnoDB提供更灵活选项,如使用`ALTER TABLE... LOCK=NONE`可在加索引时允许读写访问,尽管可能延长索引构建时间。自MySQL 5.6起,在线DDL技术可进一步减少锁定时间,通过`ALGORITHM=INPLACE`和`LOCK=NONE`实现近乎无锁的表结构变更。合理配置这些选项有助于最小化对业务的影响并保持数据库高效运行。
539 4