首页 > 数据库 >PostgreSQL技术大讲堂 - 第18讲:Tuning Autovacuum

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

时间:2023-06-12 14:45:10浏览次数:40  
标签:PostgreSQL Tuning autovacuum 50 cost Autovacuum vacuum page

 

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

Part 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瓶颈。

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

 

 

 

 

以上就是PostgreSQL技术大讲堂 第18讲 - Tuning Autovacuum 的内容,往期视频,联系cuug咨询老师,PG交流群钉钉交流群:35,82,24,60

标签:PostgreSQL,Tuning,autovacuum,50,cost,Autovacuum,vacuum,page
From: https://www.cnblogs.com/cnblogs5359/p/17474995.html

相关文章

  • CentOS 安装PostgreSQL 9.1
    PostgreSQL通常也简称Postgres,是一个关系型数据库管理系统,适用于各种Linux操作系统、Windows、Solaris、BSD和MacOSX。PostgreSQL遵循PostgreSQL许可,是一个开源软件。PostgreSQL由PostgreSQL全球开发组开发,由极少数的公司志愿组成并进行监督管理,这些公司有红帽、EnterpriseDB等......
  • windows 安装postgresql 14
    开源数据库PostgreSQL是1980年以加利福尼亚大学为中心开发出来的DBMS,与MySQL一样,都是世界上广泛应用的开源数据库(DB)。本文将会介绍使用64位版的Windows安装程序(Winx86-64)在WindowsServer2019(64位)系统中安装PostgreSQL的步骤,请大家结合自身实际下载相应的安装......
  • PostgreSQL配置优化
    PostgreSQL配置优化PostgreSQL配置优化硬件和系统配置测试工具配置文件主要选项测试数据总结 硬件和系统配置操作系统Ubuntu13.04系统位数64CPUIntel(R)Core(TM)2DuoCPU内存4G硬盘SeagateST2000DM001-1CH164测试工具PostgreS......
  • PostgreSQL 复制表的 5 种方式详解
    CREATETABLEASSELECT语句CREATETABLELIKE语句CREATETABLEASTABLE语句SELECTINTO语句CREATETABLEINHERITS语句 PostgreSQL提供了多种不同的复制表的方法,它们的差异在于是否需要复制表结构或者数据。CREATETABLEASSELECT语句可以用于复制表结构和数......
  • postgresql/lightdb批量导入导出数据系列copy/ltuldr/ltldr/lt_bulkload及最佳实践推
    文件位于服务器上,这就限制了使用范围。为此,对于导出,lightdb提供了高性能导出版本ltuldr。对于导入,lightdb在23.1之前提供lt_bulkload,见下文;从23.1开始,支持和oraclesql*loader对应的ltldr。copy可用于快速导入和导出数据,主要用途如下:TheCOPYcommandmovesdatabetweenPostg......
  • PostgreSQL常用运维SQL
    一、数据库连接1、获取数据库实例连接数selectcount(*)frompg_stat_activity;2、获取数据库最大连接数showmax_connections3、查询当前连接数详细信息select*frompg_stat_activity;4、查询数据库中各个用户名对应的数据库连接数selectusename,count(*)fr......
  • 【Checkpoint】Command for log's checkpoint - SQLserver, Oracle, PostgreSQL
    文档引子最近,SQLserver环境中的SQLalwayson因事务爆满导致磁盘持续告警,通过这次事件,记载下SQLserverAG的事务日志处理的正确方式,同时也把Oracle以及PG的相关的checkpoint问题一并做个简单的总结,并且只从结果的角度给出过程,至于具体的理论,请移步官方文档查阅。SQLserver检......
  • Postgresql,MySQL, SQL Server 的多表连接(join)update 操作
    数据库更新时经常会join其他表做判断更新,PostgreSQL的写法与其他关系型数据库更有不同,下面以SQLServer,MySQL,PostgreSQL的数据库做对比和展示。先造数据源。createtableA(idint,cityvarchar(20));createtableB(idint,namevarchar(20));insertintoAvalues(1......
  • PostgreSQL中使用动态SQL-实现自动按时间创建表分区
    PostgreSQL中通过继承,可以支持基本的表分区功能,比如按时间,每月创建一个表分区,数据记录到对应分区中。按照官方文档的操作,创建子表和index、修改trigger等工作都必须DBA定期去手动执行,不能实现自动化,非常不方便。尝试着通过在plpgsql代码中使用动态SQL,将大表分区的运维操作实现......
  • 部署postgresql数据库
    当使用Docker部署PostgreSQL时,可以按照以下步骤进行操作:首先,确保已经安装了Docker并启动了Docker服务。打开终端或命令行界面,运行以下命令以拉取最新的PostgreSQLDocker镜像:dockerpullpostgres容器的启动命令将需要指定一些参数,如容器名称、端口映射、密码等。以下是一个示例命......