一个表缺失索引发的CPU资源瓶颈案例
背景
近几日,公司的应用团队反应业务系统突然变慢了,之前是一直比较正常。后与业务部门沟通了解详情,得知最近生意比较好,同时也在做大的促销活动,使得业务数据处理的量出现较大的增长,最终系统在处理时出现瓶颈。
分析和追踪问题的根源
首先:通过工具追踪服务器的性能,主要定位什么资源、在什么时候出现瓶颈。
这样的工具很多,可以网上搜搜工具和使用方法如PerMon和PAL等,最终得到结果是在业务高峰期(中午12点到23点前)如下图,CPU资源使用率一直很高,初步可以判断是CPU资源紧张。那真的“资源”不够吗?!不一定,进一步分析。

下一步,要更进一步实时监测到底什么东西在消耗CPU资源。
可以实时监控SQL Server资源的工具也很多,我这里使用的SQL Server Profiler,通过过滤和筛选相关Event后抓取想要的列,最主要是CPU这一列的值,如下:

上图,查看每一列CPU资源使用情况,看起来是不是很累,还好有另外一个国外很好的工具ClearTrace,它可以很轻松地分析出trc文件中最占资源的如CPU/Reads/Writes等,这里重点分析CPU,如下图标出,第一二行就是导致CPU资源瓶颈的SQL语句

下一步,重点单独调试、分析上面列出的有问题语句。
我采用做法是将上面拷贝出来并填写对应条件参数的值,将整个语句拿到SSMS中单独调试,开启Actual Execution Plan和IO、Time统计,如下图显示单次执行logical read接近8.5w次,执行计划显示查找是通过索引扫描,这个表比较大,所以查询效率很低。而恰恰在这个案例中该语句执行频率极高,最终给资源特别是CPU造成很大损耗。
这里推荐大家另外一个不错的执行计划分析工具sqlsentry plan Explorer。
接下来,试着在QA环境中,根据语句条件加上合适的非聚集索引。
看一下效果如下图,logical reads降到个位数,加上非聚集索引后,执行计划走的Index Seek,查询效率极大提升。

最后,实施到生产环境后,查看优化效果。

总结
很多时候,当我们遇到系统性能问题,需要先收集数据后,再通过数据分析确定问题根源。本案例在日常数据库运维中比较典型的,常规入手点就是检查PerfMon输出,已识别Memory、I/O 、CPU的瓶颈,资源瓶颈可能就是来自于某个或几个执行效率特别差的查询语句,经过适当的数据收集、分析处理基本可以锁定根源,并通过适当的方法如调整索引、调整语句写法等基本可以解决主要性能问题,特别是在系统上线不久这些问题尤为明显。另外就是随着时间推移,系统的业务压力增加,数据量增加也会带来类似性能问题。总的来说,建议一定要先从应用层面、数据库中索引、存储过程代码等最基本的方面入手进行调优,最大程度榨取提升性能的空间,然后再考虑数据库配置、硬件等。另外特别提醒,解决一个瓶颈可能带来另一个瓶颈,所以建议对调优的内容做一段时间的监控。
一个表缺失索引发的CPU资源瓶颈案例的更多相关文章
- 连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑
由于是开发阶段,所以并没有配置postgres的参数,都是使用安装时的默认配置,以前运行也不见得有什么不正常,可是前几天我的cpu资源占用突然升高.查看进程,发现有一个postgres的进程占用CPU ...
- 汇编语言--CPU资源和存储器(二)
二.CPU资源和存储器 需要访问的硬件资源主要有:CPU内部资源.存储器和I/O端口. 1.寄存器组 (1)16位寄存器组 16位CPU所含有的寄存器有(见图2.1中16位寄存器部分): 4个数据寄存 ...
- 18. ClustrixDB 管理CPU资源
作为一个分布式MPP数据库,ClustrixDB能够利用多个节点和核心来比单节点数据库更快地处理查询.有两个可调进程可以促进这一点. Clustrix选择了一组默认参数来控制那些提供最常见工作负载的进 ...
- nginx 性能优化的概述及在CPU资源方面的处理
nginx的性能优化的概述 软件层面的提升硬件的使用率 增大CPU的利用率 增大内存的利用率 增大磁盘IO利用率 增大网络带宽利用率 提升硬件规格 网卡:万兆网卡.例如10G.25G.40G等 磁盘: ...
- 如何限制虚拟主机可使用的CPU资源
使用IIS 6.0运营虚拟主机的朋友们都会碰到这样一个问题,当某个网站占用大量CPU资源时,会把整个服务器都拖慢了,影响服务器上其他网站的访问速度,客户们的投诉也让系统管理员倍感头疼.我们知道,从II ...
- Docker CPU 资源限制——CPU分片功能测试
之前的一篇随笔——Docker CPU 资源限制 中介绍了针对COU的某个或某几个核的控制,今天介绍下CPU分片功能,即CPU占比. 测试步骤 1.下载CPU测试image.agileek/cpuse ...
- Docker CPU 资源限制——CPU固定核功能测试
Docker使用Linux cgroup来实现资源的限制,对于CPU的限制有两种方法: 1.cpuset CPU Set限定容器使用某个固定的CPU核.使用默认的libcontainer引擎时,可以通 ...
- iOS-RunLoop,为手机省电,节省CPU资源,程序离不开的机制
RunLoop是什么?基本操作是什么? 1.RunLoop的作用 RunLoop可以: 保持程序的持续运行 处理App中的各种事件(比如触摸事件.定时器事件.Selector事件) 节省CPU资源,提 ...
- java:找出占用CPU资源最多的那个线程(HOW TO)
在这里对linux下.sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结:linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资 ...
随机推荐
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
- 使用struct处理二进制
有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...
- android http 抓包
有时候想开发的时候想看APP发出的http请求和响应是什么,这就需要抓包了,这可以得到一些不为人知的api,比如还可以干些“坏事”... 需要工具: Fiddler2 抓包(点击下载) Android ...
- iOS审核这些坑,腾讯游戏也踩过
作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...
- RabbitMq应用一
RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...
- c# Enumerable中Aggregate和Join的使用
参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/asp.net-core-environment.html http://www.yuanjiaochen ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
- [OC] NSURLSession
有的程序员老了,还没听过NSURLSession 有的程序员还嫩,没用过NSURLConnection 有的程序员很单纯,他只知道AFN. NSURLConnection在iOS9被宣布弃用,NSUR ...
- GSD_WeiXin(高仿微信)应用源码
高仿微信计划:已经实现功能 1.微信首页(cell侧滑编辑.下拉眼睛动画.下拉拍短视频.点击进入聊天详情界面) 2.通讯录(联系人字母排序.搜索界面) 3.发现(朋友圈) 4.我(界面) 待实现功能( ...
- IM 去中心化概念模型与架构设计
今天打算写写关于 IM 去中心化涉及的架构模型变化和设计思路,去中心化的概念就是说用户的访问不是集中在一个数据中心,这里的去中心是针对数据中心而言的. 站在这个角度而言,实际上并非所有的业务都能做去中 ...