首页 > 数据库 >POSTGRESQL 提高POSTGRESQL性能的一些习惯 (3)

POSTGRESQL 提高POSTGRESQL性能的一些习惯 (3)

时间:2023-06-22 13:00:59浏览次数:47  
标签:POSTGRESQL autovacuum 性能 习惯 问题 cost vacuum 数据库


POSTGRESQL  提高POSTGRESQL性能的一些习惯  (3)_缓存

随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS,SQL SERVER 等,期待你的加入

这个系列写到第三期了,实际上POSTGRESQL 的优化和一个核心之一,这就是VACUUM,一个弄不清vacuum,autovacuum的PG 管理员一定是不大合格的PG DBA。

这里不能从原理开始,这篇文字中会提及PG 13 中关于autovacuum的一些技巧,后期会写一些关于AUTOVACUUM的脚本。

第一个问题,autovacuum能满足日常的表的vacuum 操作需求吗? 

这个问题其实是不大好回答的,如果你的数据库只是小批量的应用,大概率都是满足需求的,但是如果是大型的数据库应用,回答一定是,NO ,实际上我们的数据库大多就不符合安装postgresql 或者云上的POSTGRESQL 的默认设定。主要的问题在以下的部分

1  autovacuum 工作的线程数不足

这个问题一般存在于表多,并且大表多的数据库,以及逻辑库较多的数据库中,其实一句话可以解释,就是表太多,几个周期中,你的表并未能被轮询到,并且被autovacuum进行处理,导致你的表一直长期得不到 autovacuum的“雨露均沾”。

解决这个问题的核心在于你是否有足够的autovacuum的线程,来在较少的周期内轮询到大部分表,而不会因为线程少而导致根本轮不上的情况。

当然还有一些极端的情况,我们也是遇到过的就是一个大表在运行autovacuum 时很长时间根本运行不完,有的运行了2个小时,还在一个表上 autovacuum,这也是导致 autovacuum的线程不够用的问题,和表轮询不到autovacuum的问题产生的一个原因。

解决方案:对于大型的POSTGRESQL 数据库,一定要有足够的CPU 资源,和更大的autovacuum , 这里就需要调整你的 autovacuum_max_workers 的参数了,默认在PG13 是 3 个,这在大型的数据库中,不够用是很正常的,我们调整成 6 这个参数。CPU 均在 8C  -16C 。 

另外一定不要贪,将autovacuum_max_workers 调整的太大,会导致另一个问题,系统在触发autovacuum 可能过于集中,导致磁盘的压力上升,产生性能问题,所以这不是一个 左 右的问题,而是一个 适中的问题。

(需要写脚本,去找出是否存在表长期轮休不到autovacuum的问题的分析脚本)。

2  另一个autovacuum的核心问题就是,参数设计不合理的问题。

对于小表来说autovacuum的参数设计是可以的,基本上不会出现问题,但是对于大表来说,统一个AUTOVACUUM 的参数就是一个灾难,并且随着数据量的加大,越来越难。

autovacuum_analyze_scale_factor  0.1       sighup

autovacuum_analyze_threshold     50        sighup

POSTGRESQL  提高POSTGRESQL性能的一些习惯  (3)_缓存_02

假设你有一张5千万的表,如果想触发一次autovacuum的成本在

50000000 * 0.1 + 50 = 5000000 + 50 = 5000050 ,那么每次要等操作的死行在 500万以上,才能触发一次autovacuum ,这一定不是什么好事。

所以动态调整autovacuum针对每个表一定是一个必选项,尤其针对大表和频繁进行更改的表update ,太多的表。

所以我们需要一个能动态调整表的以上两个参数的程序。避免大表太长时间达不到触发条件。

3  autovacuum cost  太低导致autovacuum 速度太慢

autovacuum的工作速度是很有可能被限制的,除了表的索引太多,表太大,会导致autovacuum一个表的时间很长,2个小时还无法结束,而另一个问题就是autovacuum 的cost 的问题,这里vacuum会被一下的一些值所限制

vacuum_cost_page_hit ,这个位置是与 vacuum 工作的buffer有关,如果你的 vacuum的buffer 不足,则命中需要进行 vaccum的页面的成本就高了。

vaccum_cost_page_miss  这个位置还是与内存有关,如果页面需要读入到缓存中,但缓存没有空间了,就必须清理缓冲,清理缓冲也是需要有成本的,所以缓存的大小还是很重要的。

vaccum_cost_page_dirty 操作页面时,需要对页面进行清理的工作的成本这里涉及的是IO的成本。

如果这些成本累加,达到了 vaccum_cost_limit 的默认成本的值的情况下,则vacuum 就停止了,并且停止vacuum_cost_delay的时间为默认2毫秒,当设置为0 时则自动停止延迟的设置。所以您可以禁用成本限制(通过将autovacuum_vacuum_cost_delay设置为0),或者通过减少autovacuum_vacuum_cost_delay或将autovacuum_vacuum_cost_limit设置为较高的值(如10000)来减少其影响。

POSTGRESQL  提高POSTGRESQL性能的一些习惯  (3)_缓存_03

这个位置也可以写一些程序,立即停止一些 autovacuum的工作。

当然除此之外,长期运行的事务,未使用的逻辑复制槽,不进行 commit 的事务,全部是autovacuum 看上去不工作的可能原因之一。

最后所有的vacuum的工作不能指望 autovaccum 全部完成,在夜间定期对的表进行vacuum 工作,也是一种避免工作期间出现autovacuum 影响工作的的一种好的工作方式。

POSTGRESQL  提高POSTGRESQL性能的一些习惯  (3)_解决方案_04

标签:POSTGRESQL,autovacuum,性能,习惯,问题,cost,vacuum,数据库
From: https://blog.51cto.com/u_14150796/6534696

相关文章

  • POSTGRESQL 统计信息与数据查询的准确性与多种统计信息类型
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。自己做了一个统计分析有关的,思维导图之前有一期说过,对于一些特殊的查询中的优化,可以在不建立索引和SQL优化的情况下,我们通过统计......
  • POSTGRESQL vacuum_freeze系列中 三个参数与 vacuum的关系
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql ,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近在整理VACUUM相关知识的时候,发现一个问题对于vacuum_freeze的3个参数的概念掌握的不牢固,那么只能进行恶补了。本次的三个......
  • PostgreSQL 从熊灿灿一个获取固定字符的SQL 分析巧妙之处
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。某天群里一个同学抛出一个问题,关于获取字段类型中的设置的值,随即熊老师在群里抛出以下的一个SQL (秒抛)SELECTCASEatttypid......
  • POSTGRESQL SQL 语句案例,一场由LIMIT 1 引发的“奇怪异像”
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近一段工作很少优化SQL,实际上7-8年前的确有一段疯狂优化的“美好时光”。 最近一个同事提出一个问题,他的一个POSTGRESQL的SQ......
  • PostgreSQL 15 stats collector 在取消后是如何实现的原有功能的
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。在POSTGRESQL15有一个重要的功能去掉了statscollector在说为什么去掉这个statscollector的问题前,我们先得弄清出statscoll......
  • POSTGRESQL 和 MYSQL 到底应该不应该控制活跃连接
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql ,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近群里某个同学的提问,引起的本篇文章,关于数据库连接的部分,没有废话,我们先针对MYSQL来说说数据库连接的部分。首先MYSQL的客......
  • POSTGRESQL 自动搜索所有逻辑库中的无用索引自动化脚本实现
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。前两天腾出点时间,打算整理一下POSTGRESQL公司的数据库的无用的索引的问题,写了一个SQL通过SQL来获取这些数据库的无用索引,但头......
  • PostgreSQL 15 让多年被DISS的PG 安全画上圆满的句号
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。提起POSTGRESQL中的安全问题其中最容易被人Diss的最大BUG并不是autovacuum 之类的部分,排在首位的被DISS的最大的问题是安全的......
  • POSTGRESQL postgresql 升级的需求来自哪里
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题(本篇的思路来自于,盘古云课堂PG152023年2月18日晚,PG15升级问题大讨论稿)说起POSTGRESQL的升级问题,很多同学会问,升级POSTGRESQL......
  • POSTGRESQL 再说 PGBOUNCER 如何部署的问题
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近得到与PGBOUNCER的一个问题,问题大体上是这样描述的,一台POSTGRESQL的服务器,2000个maxconnection,同时安装了4个pgbouncer在......