PostgreSQL运维技巧之vacuum调优

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: PostgreSQL运维技巧之vacuum调优

一、VACUUM概念

VACUUM 是 PostgreSQL 中的一种维护命令,用于清理和优化数据库中的表。其主要功能包括:

回收空间:删除标记为删除的行,释放磁盘空间。

防止表膨胀:通过回收无效行来防止表变得过大,提高查询效率。

更新统计信息:帮助查询优化器生成更高效的执行计划。

二、vacuum和vacuum full的区别

VACUUM 主要用于清理和回收数据库中标记为删除的行,释放空间并防止表膨胀,而不锁定表,可以在表仍然可读写的情况下运行。

VACUUM FULL:重写整个表,完全释放空间并压缩表,在操作期间会锁定表,因此表不可访问。也会创建表的副本,磁盘空间加倍,所以空间不足的情况下不要运行。

三、vacuum监控和调优

(一)监控

1、dead tuple

死行会导致表膨胀并且查询变慢,因此需要持续关注表中的 dead tuple 和 live tuple 比率,并进行优化

  1. select relnamen_dead_tupn_live_tup from pg_stat_user_tables
  2. select relnamecoalesce(round(n_dead_tup * 100 / (case when n_live_tup + n_dead_tup = 0 then null else n_live_tup + n_dead_tup end ),2),0.00) as dead_tup_ratio from pg_stat_user_tables order by dead_tup_ratio desc limit 5;

2、tuple空间

  1. select relnamerelpages / reltuples as per_tuple_page from pg_class where reltuples!=0;
  2. select relnamereltuples / relpages as per_page_tuple from pg_class where reltuples!=0;

3、 pgstattuple

pgstattuple模块提供了各种功能来获取元组级别的统计信息,具体信息大家可以参考https://www.PostgreSQL.org/docs/current/pgstattuple.html

(二)调优

1、表参数

控制autovacuum执行频率的参数有

autovacuum_analyze_scale_factor

autovacuum_analyze_threshold

autovacuum_vacuum_scale_factor

autovacuum_vacuum_threshold

当表上变化的行数达到条件时,autovacuum 进程会对其进行 vacuum。主要条件是:

autovacuum_vacuum_scale_factor 和 autovacuum_vacuum_threshold 控制执行条件。

默认 autovacuum_vacuum_scale_factor 为 0.2(表膨胀超过 20% 即触发),threshold 为 50 以防止小表频繁触发。

可以单独设置频繁更新或删除的表,示例如下:

  1. ALTER TABLE t SET (autovacuum_vacuum_scale_factor = 0.1);
  2. ALTER TABLE t SET (autovacuum_vacuum_threshold = 10000);

analyze 也通过类似机制控制,由 autovacuum_analyze_scale_factor 和 autovacuum_analyze_threshold 参数决定。

2、清理

为了不影响用户使用,PostgreSQL引入了基于代价的清理机制,以减少CPU和IO占用:

  • 清理过程:从磁盘逐个读取页面(8K),使用VM文件判断是否有dead tuple,有则清理并标记为dirty再写出。
  • 代价参数

vacuum_cost_page_hit = 1:从共享缓存中找到的缓冲区清理代价,默认值1。

vacuum_cost_page_miss = 10:必须从磁盘读取的缓冲区清理代价,默认值10。

vacuum_cost_page_dirty = 20:修改干净块后清理代价,默认值20。

  • 成本限制
  • 从共享缓存读页面:80MB/s
  • 从磁盘读页面:8MB/s
  • 写出脏页:4MB/s
  • 假设 autovacuum_vacuum_cost_delay = 20msautovacuum_vacuum_cost_limit = 200,每秒能做50轮,每轮200代价,实际工作量:
  • 优化建议
  • 对于有缓存的RAID卡autovacuum_vacuum_cost_limit 设置为1000。
  • 对于SSD,设置为10000。

过小的 autovacuum_vacuum_cost_limit 会导致频繁休眠,旧数据无法及时清理,建议适当增加该参数值。

3、工作进程数

PostgreSQL启动 autovacuum_max_workers 来清理不同的数据库/表,大表和小表的代价不同,防止大表阻塞小表:

  • 全局成本限制cost_limit 被所有 worker 共享,多个 worker 并不一定能提高速度。
  • 当清理跟不上时:提高 worker 数无效,应提高 cost 参数,可以在单独的表上设置:
  1. ALTER TABLE t SET (autovacuum_vacuum_cost_limit = 1000);
  2. ALTER TABLE t SET (autovacuum_vacuum_cost_delay = 10);

这些表的清理工作成本独立于全局计算,提高灵活性,但实际生产中很少使用此特性:

  1. 通常需要唯一的全局后台清理成本限制。
  2. 多个 worker 有时一起限制,有时独立,难以监控和分析。
    4、表分区
    由于 VACUUM 不能在同一张表上并发进行,因此表不能太大。如果表超过 3000 万记录或 32GB,应使用分区表。对于旧版本 PostgreSQL,通过表继承实现分区,在 10.x 版本之前语法不方便,导致一些用户未使用分区表。即使在 10.x 之后,性能仍略差。最佳实践是使用 pg_pathman 插件来实现分区表,避免分区带来的性能问题。
    四、vacuum总结
  1. 不要禁用autovacuum
  2. update delete频繁的表上单独设置fillfactor参数,比如80%;
  3. update delete频繁的业务中,减低scale factor,这样清理进程可以及时的进行;
  4. 在好的硬件下,提高限流阀,这样清理进程不会被中断;
  5. 单独提高autovacuum_max_worker不行,需要和参数一起调整;
  6. 使用alter table设置参数要慎重,这会让系统变得复杂。
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
SQL 关系型数据库 数据库
PostgreSQL性能飙升的秘密:这几个调优技巧让你的数据库查询速度翻倍!
【10月更文挑战第25天】本文介绍了几种有效提升 PostgreSQL 数据库查询效率的方法,包括索引优化、查询优化、配置优化和硬件优化。通过合理设计索引、编写高效 SQL 查询、调整配置参数和选择合适硬件,可以显著提高数据库性能。
319 1
|
4月前
|
运维 监控 关系型数据库
PostgreSQL运维核心技能之掌握并行查询
PostgreSQL运维核心技能之掌握并行查询
106 9
|
关系型数据库 PostgreSQL
PostgreSQL vacuum可见性
PostgreSQL vacuum可见性
100 0
|
SQL JSON 关系型数据库
PostgreSQL技术大讲堂 - 第34讲:调优工具pgBagder部署
PostgreSQL从小白到专家技术大讲堂 - 第34讲:调优工具pgBagder部署
1194 1
|
SQL 关系型数据库 OLTP
PostgreSQL技术大讲堂 - 第31讲:SQL调优技巧
PostgreSQL从小白到专家,系列技术大讲堂 - 第31讲:SQL调优技巧
617 3
|
人工智能 算法 数据可视化
带你读《2022龙蜥社区全景白皮书》——5.9.4 KeenTune:智能化全栈调优&容量评估工具
带你读《2022龙蜥社区全景白皮书》——5.9.4 KeenTune:智能化全栈调优&容量评估工具
234 13
|
关系型数据库 分布式数据库 PolarDB
|
关系型数据库 分布式数据库 定位技术
PolarDB for PostgreSQL 开源必读手册-VACUUM处理(中)
PolarDB for PostgreSQL 开源必读手册-VACUUM处理
174 0
|
运维 监控 负载均衡
《泛娱乐行业技术服务白皮书》——四、泛娱乐业务保障与调优最佳实践——4.1游戏运维SRE实践——4.1.1 制定SRE黄金准则
《泛娱乐行业技术服务白皮书》——四、泛娱乐业务保障与调优最佳实践——4.1游戏运维SRE实践——4.1.1 制定SRE黄金准则
156 0
|
运维
《泛娱乐行业技术服务白皮书》——四、泛娱乐业务保障与调优最佳实践——4.1游戏运维SRE实践——4.1.2 游戏自动化运维体系构成
《泛娱乐行业技术服务白皮书》——四、泛娱乐业务保障与调优最佳实践——4.1游戏运维SRE实践——4.1.2 游戏自动化运维体系构成
151 0
下一篇
DataWorks