最近笔者在项目中遇到postgreSQL的性能问题,所以计划在公众号里写一个系列文章去追踪记录这些问题以及分析过程或解决方法。

本文主要是关于postgreSQL的autovacuum的问题。可能很多人对postgreSQL中的autovacuum是干什么的不是特别清楚。网上其实对其概念有了很多的描述。我自己的理解就是,数据库通过一定的逻辑判断对数据库的一些存储资源进行自动地回收再利用的行为就是autovacuum.

自从postgreSQL8.1版本引入这个功能之后,很多情况下在使用时,是开启autovacuum的,我也特别赞同开启这个功能。因为人工去做vacuum操作,不好判断时机和频率:如果vacuum不及时,不足够频繁会造成dead tuples数据过多,造成表相关update/deletion操作性能下降;如果过于频繁会造成cpu和磁盘读写的繁忙,同样会造成性能问题。

那么autovacuum会不会有性能问题呢?答案是:可能。autovacuum是把vacuum的操作的频率和时机交给数据库去判定,按理说,这应该是理想状态或者最优解了,其实未必。在系统上线时如果针对自身业务,未对autovacuum参数进行调优,使用默认值时很可能是有问题的。那么怎么找到相关配置呢?

两种方式查看postgreSQL相关的配置。

    • postgreSQL安装目录下,找到配置文件postgresql.conf

    • 可以通过如下SQL语句在postgresql中直接查看autovacuum相关的配置

select * from pg_settings where name like 'autovacuum%';

一般默认的操作值如下,这里面主要包括2部分,一部分是vacuum,另外一部分是analyze. Analyze也是非常重要的built-in操作,会在后续的文章中详细介绍。这里主要讲解下常用的,比较重要的几个参数,其中“autovacuum_max_workers”,定义了最大的autovacuum的进程数,默认是3. 也就是说同时可以操作3个表的vacuum操作; "autovacuum_vacuum_threshold"是针对一些小体量的表而言,如果有一张表常年的体量就是20条数据左右,那么这张表可能永远不会被autovacuum考虑在内,因为参数autovacuum_vacuum_threshold设定的默认值为50(>20); "autovacuum_vacuum_scale_factor",这个参数,会考虑的比较多,针对一些大体量的表,比如有1亿行数据,那么针对参数值为0.2的时候,如果dead tuples达到2千万行时,会说明此时需要autovacuum,如果vacuum workers的线程被占满,那么就会排队。

那么怎么去判定某个特定的表是否有autovacuum的问题呢?那么笔者的经验是首先需要一个多时间节点的观察。如果都满足如下条件,说明相关表是时候进行清理dead_tuples了。

pg_stat_all_tables.n_dead_tup > (threshold + pg_class.reltuples * scale_factor)

在以上的表达式中,其中可以通过表pg_stat_all_tables的n_dead_tup字段,加上relname的条件(即表名),就可以获取到特定表的dead tuples的数值;threshold即是postgreSQL中的"autovacuum_vacuum_threshold"参数的值,默认为 50. pg_class.reltuples可以附加查询条件 relname="表名"查询到表中总tuple数; scale_factor是postgreSQL中的"autovacuum_vacuum_scale_factor"参数的值,默认为0.2。如果以上不等式成立,那么说明当前表是需要清理dead tuples的,此时可以监控postgreSQL当前正在进行的autovacuum是不是有包含当前表,如果没有,那么可能就需要对autovacuum进程进行调优了。其次是如果有,但是如果dead tuples一直占有很大比例,那么也需要进行关注性能问题。

下次会讲解当遇到了autovacuum的问题,怎么去解决,需要注意什么。敬请期待。

转自公众号【TimTest】,原文地址:https://mp.weixin.qq.com/s?__biz=MzI2OTYwMDc0MQ==&mid=2247483655&idx=1&sn=4c1ad5eebd2cec8d5436168f762b127b&chksm=eadc938dddab1a9b9ca800114de0779c44cb1ab738570f20fc78e46a66c51e097ea34d59b82e&token=2021082705&lang=zh_CN#rd

【转】postgreSQL​之autovacuum性能问题分析(一)的更多相关文章

  1. 【转】postgreSQL​之autovacuum性能问题分析(二)

    如上篇文章提到,如果出现了autovacuum的问题,那么这可能是个悲伤的故事.怎么解决? 笔者觉得可以从如下几个方面着手去考虑解决问题,可以避免一些坑.1) 持续观察,是不是autovacuum问题 ...

  2. [转帖]PostgreSQL 参数调整(性能优化)

    PostgreSQL 参数调整(性能优化) https://www.cnblogs.com/VicLiu/p/11854730.html 知道一个 shared_pool 文章写的挺好的 还没仔细看 ...

  3. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  4. SQL SERVER 查询性能优化——分析事务与锁(五)

    SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...

  5. ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...

  6. Web服务器性能监控分析与优化

    Web服务器性能监控分析与优化 http://www.docin.com/p-759040698.html

  7. ArrayList和LinkedList遍历方式及性能对比分析

    ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayLis ...

  8. list 、set 、map 粗浅性能对比分析

    list .set .map 粗浅性能对比分析   不知道有多少同学和我一样,工作五年了还没有仔细看过list.set的源码,一直停留在老师教导的:"LinkedList插入性能比Array ...

  9. Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 [ 转载 ]

    Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 @author Trinea 原文链接:http://www.trinea.cn/android/arrayl ...

随机推荐

  1. JavaScript学习系列博客_27_JavaScript 遍历数组

    遍历数组 - 遍历数组就是将数组中元素都获取到 - 一般情况我们都是使用for循环来遍历数组: - 使用forEach()方法来遍历数组(不兼容IE8) forEach()方法需要一个回调函数(由我们 ...

  2. 【故障公告】阿里云 RDS 数据库突发 CPU 近 100% 引发全站故障

    今天晚上9点我们收到阿里云的告警通知: [阿里云监控]华东1(杭州)-云数据库RDS版<cnblogsdb> [instanceId=xxx] 于21:00 发生告警, 前往诊断 CPU使 ...

  3. 介绍 golang json数据的处理

    原文链接:https://blog.csdn.net/weixin_43223076/article/details/83550229 demo1: package main import ( &qu ...

  4. springmvc以及springboot中的拦截器配置

    拦截器两种实现   如果不同的controller中都需要拦截器,不能使用相同的拦截器,因为拦截器不能跨controller,这个时候只能为不同的controller配置不同的拦截器,每一个拦截器只能 ...

  5. 02.RDB持久化配置与工作流程

    一.如何配置RDB持久化机制 配置文件redis.conf save 60 1000 表示每隔60s,检查如果有超过1000个key发生了变更,那么就生成一个新的dump.rdb文件,就是当前redi ...

  6. Javascript常见数据类型API

    1 - 内置对象 1.1 内置对象 ​ JavaScript 中的对象分为3种:自定义对象 .内置对象. 浏览器对象 ​ 前面两种对象是JS 基础 内容,属于 ECMAScript: 第三个浏览器对象 ...

  7. JVM基于栈的解释器执行原理

    通过下面这段代码来解释JVM基于栈的执行原理 4. public static int add(int a, int b) { 5. int c = 0; 6. c = a + b; 7. retur ...

  8. 痞子衡嵌入式:导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP. i.MXRT系列MCU发布已两年多了,基于i.MXR ...

  9. 理解WEB系统

    网络应用及分类 BS架构:Browser/Server web应用的客户端不需要安装以及升级维护 跨平台 较方便CS架构:Client/Server 客户端应用则需要每个客户端安装和升级 一种系统对应 ...

  10. day46:jQuery

    目录 1.jQuery初识 2.选择器 3.文本操作 4.class类值操作 5.css样式操作 6.值操作 7.注意点:button按钮提交form表单数据 8.jquery选择器补充 9.模态对话 ...