PG数据库CPU和内存满负荷运转优化案
1、问题描述
某客户系统采用三层架构:数据库—应用服务—前端应用。其中数据库使用PostgreSQL 10.0作为数据库软件。自周四起,服务器的CPU与内存使用率持续处于过饱合状态,并因此导致了数次宕机(期间有几次宕机是应用服务器宕机)。
2、问题观察
通过观察,发现如下几个疑似问题:
1)在无任何作业的情况下,存在数十个处于空闲状态的服务器进程(即postgres进程),这些进程虽然不消耗CPU,但始终持有内存资源;
2)开启慢查询之后发现,有三类SQL查询效率非常低。
1、根据输入的WKT(矩形范围)作空间相交分析。如下图(耗时30s以上)

2、DCTB表与DDXX表的JOIN查询,如下图耗时5-14s:

3、执行COMMIT提交事务后的等待,如下图耗时10-30s

3、问题分析
1)针对空闲进程的处理:一方面,应用程序(Tomcat)要使用连接池,且要设计有效的回收连接的机制;二方面,在数据库层面设置TCP探针,每隔10s探测一下client process是否仍然处于active状态,如果客户端进程已经异常关闭,数据库会回收连接。
2)针对空间相交分析的SQL,经分析是由于public.dctb的geom字段上未创建空间索引,导致每次的相交分析(即&&操作符)都需要判断所有要素与WKT矩形的空间关系。空间运算属于CPU密集型操作,操作系统的CPU使用率长期过饱合可能与此有关。
创建空间索引:create index idx_dctb_geom on public.dctb using gist (geom),持续运行一段时间后观察到CPU的使用率有明显缓解。
3)针对JOIN查询慢的问题,原本认为可能是因为SQL写法的原因,导致查询优化器选择了错误的执行计划。但经过分析执行计划,发现该SQL的确是先通过索引过滤了部分记录,然后再执行JOIN连接,因此对该问题的优化需要考虑其它的办法。但这并不代表该SQL不需要优化,从SQL的易读性和避免查询优化器选择了错误的执行计划这两个方面考虑,建议把SQL改写成类似如下的写法:
with t3 as (select r_rybh from rwdd.sbxx where mac = '74:d2:1d:b3:a2:bc' limit 1),
t2 as (select bsm,coalesce(sfjz,'Y') sfjz,sjly from dctb where xzqdm='370322')
select t1.bsm,coalesce(t1.tbzt3,'00') tbzt3,t2.sfjz,t2.sjly,t1.shjg1 shjg1,
t1.shyj1 shyj1,
t1.shjg2 shjg2,
t1.shyj2 shyj2,
t1.shjg3 shjg3,
t1.shyj3 shyj3,
t1.wyhczt wyhczt,case when COALESCE(t3.r_rybh,'0') = '0' then '0' else '1' end as sfzpbj from ddxx t1 left join t3 on t1.rybh=t3.r_rybh join t2 on t1.bsm=t2.bsm
4)针对COMMIT延迟的问题,考虑从如下两方面解决:
1、对虚拟磁盘作基准测试,因为怀疑磁盘的IOPS本身就不高。
A.连续读的性能:

以7200转SATA盘连续读性能作为参考,如下:

B.随机读性能

以7200转SATA盘连续读性能作为参考,如下:

通过基础测试可知,虚拟磁盘的性能超过7200转的SATA盘,与10000-15000转SAS盘性能相当。
2、通过修改数据库参数文件,优化WAL日志写的效率
修改的参数包括:
synchronous_commit 由 on 改为了 off
wal_buffers 由100MB 改为了 400MB
commit_delay 由0 改为了 100
wal_compression 由 off 改为了 on
3、其它调整
A.调整了部分内存池的设置。
包括work_mem = 20MB和 maintenance_work_mem = 20MB
B.关闭了autovacuum
4、目前情况
收集了3月18日13:30到21点的部分性能数据,分析如下:
1)Processor Time

Processor Time基本上处于50%左右。
2)磁盘读写MB/s

磁盘读写普遍处于10M/s以下。
3)可用内存(GB)

可用内存长期保持8G左右。
PG数据库CPU和内存满负荷运转优化案的更多相关文章
- 【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...
- 性能优化中CPU、内存、磁盘IO、网络性能的依赖(转)
关于系统性能优化,推荐一篇不错的博客! 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试 ...
- [转]检测SQLSERVER数据库CPU瓶颈及内存瓶颈
在任务管理器中看到sql server 2000进程的内存占用,而在sql server 2005中,不能在任务管理器中查看sql server 2005进程的内存占用,要用 以下语句查看sql se ...
- 鲲鹏性能优化十板斧(二)——CPU与内存子系统性能调优
1.1 CPU与内存子系统性能调优简介 调优思路 性能优化的思路如下: l 如果CPU的利用率不高,说明资源没有充分利用,可以通过工具(如strace)查看应用程序阻塞在哪里,一般为磁盘,网络或应 ...
- 写代码如何合理使用和优化我们的机器资源(CPU、内存、网络、磁盘)
写代码脑子一定要绷紧一根弦,认知到我们所在的机器资源是有限的.机器资源有哪些?CPU.内存.网络.磁盘等,如果不做好保护控制工作,一旦某一资源满负荷,很容易导致出现线上问题. 1 CPU 资源怎么限制 ...
- 性能优化中CPU、内存、磁盘IO、网络性能的依赖
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...
- 转-性能优化中CPU、内存、磁盘IO、网络性能的依赖
转自:https://www.cnblogs.com/Javame/p/3665565.html 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估. ...
- 优化.NET 应用程序 CPU 和内存的11 个实践
https://michaelscodingspot.com/cpu-bound-memory-bound/ 优化.NET 应用程序 CPU 和内存的11 个实践 凡事都有其限度,对吧?汽车只能开这么 ...
- ElasticSearch CPU和内存占用高的优化记录
公司最近使用ElasticSearch作为数据报表汇总引擎.上线三个月累计数据800万,但是今天突然大面积出现查询超时,上服务器查看服务运行情况,发现cpu使用率高达300% mem 使用率也到了90 ...
随机推荐
- Exif认识(二)
通过php获取exif信息后,像光圈和快门的值还需要转换下,才是我们常用看得懂的值 ApertureValue的值: 拍照时镜头的光圈. 单位是 APEX. 为了转换成普通的 F-number(F-s ...
- C# 构造基础返回值类型-BaseResponse
学无止境,精益求精 十年河东,十年河西,莫欺少年穷 用于基础返回值类型,如下: using System; using System.Collections.Generic; using System ...
- 正则表达式,匹配非本站图片网址去掉img标签内容实例
正则表达式,匹配非本站图片网址去掉img标签内容实例 在线正则表达式测试http://tool.oschina.net/regex/# 测试内容: <div><p>eee< ...
- vue通过Blob实现下载文件
需求是这样的...... 具体实现,前端拿到后端返回回来的数据,然后通过Blob实现下载,文件内容样式啥的都是后端写的 script代码: 这里的data就是后端返回回来的数据,此方法兼容IE dow ...
- 2.redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?
作者:中华石杉 面试题 redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发? 面试官心理分析 这个是问 redis 的时候,最基本的 ...
- Linux CentOS 6.5 ifconfig查询不到ip简单解决方法
最近有小伙伴表示在虚拟机中安装CentOS之后使用ifconfig以及ip addr指令无法查询到ip地址, 在此笔者提供一个简单有效的方法; 1. 切换为root用户登录 su root 2.进入配 ...
- MySQL数据备份概述
MySQL备份类型 热备份.温备份.冷备份 (根据服务器状态) 热备份:读.写不受影响: 温备份:仅可以执行读操作: 冷备份:离线备份:读.写操作均中止: 物理备份与逻辑备份 (从对象来分) 物理备份 ...
- openCV CV2用法(转)
文章转自:https://www.kancloud.cn/aollo/aolloopencv/262768 一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 fi ...
- 三、python对字符串和集合的内存垃圾回收机制
变量声明: name1 = "andy" name2 = name1 这个时候我把name1的值给改成了“tom”,问现在name2的值是什么?为什么? 答:andy,因为你把 ...
- Go内置常用包
strings 字符串函数 Contains(s, substr string) bool 字符串s是否包含字符串substr,包含返回true Split(s, sep string) []stri ...