现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高。软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治。开发人员解决数据问题基本又是搜遍百度各种方法尝试个遍,可能错过诊断问题的最佳时机又可能尝试一堆方法最后无奈放弃。

    怎么样让琐事缠身的程序维护人员,用最快的方式解决数据库出现的问题?怎么让我们程序员的痛苦降低到最小...每天喝喝茶水,看看新闻平安度过一天呢?本系列重要通过Expert for sqlserver工具讲解下数据库遇到的各种问题的表象及导致这样问题的根本原因,让定位问题更准确,解决问题思路更清晰!!

    数据库的性能好坏,对于最终用户来说表现为点击的操作是否能够快速响应,那么反应到数据库上就是语句执行时间是否够短!

    对用运维人员数据库性能的表现,简单可能看成CPU 、内存、磁盘三巨头指标是否正常,那么今天我们就从CPU 下手,看看CPU能够看出哪些问题!

废话不多说,直接开整---------------------------------------------------------------------------------------------------

  主要用到的性能计数器(不知道什么是性能计数器的,请自行百度)

  就用两个~

  1. %Process Time 全实例  (主要用于查看当前服务器的CPU 情况)
  2. %Process Time sqlservr (主要用于查看数据库使用的CPU情况 )

排除应用影响CPU                       

    

    

  

  综合这两个计数器 在同一时间点可以诊断出CPU 是否是被服务器其他的应用所消耗的,如图中17:10 左右的  “%Process Time 全实例(红线)” 突然升高,而SQL 服务的(绿线)并无明显升高,这也就说明,在这个时间段的CPU 压力不是有数据库导致的!

  这个红线的明显升高时,因为我在数据库所在的服务器上做了一次文件压缩!类似文件压缩这种操作会使用大量CPU,对数据库性能造成冲击!

CPU 问题分析                        

   CPU很高或者达到100%一定是你业务压力很大?CPU 不能满足你的需求么?在下结论前请仔细分析,一个草率的定论可能换来,老板一个安慰“世界那么大你该出去走走了!”

   下面我们用几个典型的场景,分析下问题,并给出最佳实践~

高峰时段CPU 持续很高

    

                                图中是服务器几天的CPU情况

    很多人看到这张图,是不是看到了自己的服务器?是否有一种亲切感呢~下面我们来分析下这种表象可能存在的问题!

    首先明确一点90%的问题可能集中在10%的场景,这种CPU 持续持续很高的情况请注意下面两点:

  1. 你的数据库并行度是否调整?
  2. 你的数据库是否缺少索引,导致频繁的查询消耗很高的CPU资源?    

    最大并行度是什么?简单的可以理解为执行一条语句最多可以使用多少个CPU。看起来当然是使用的越多越好啦,使用的越多语句肯定越快呀! 这个答案是大写的 “NO”,使用过多的CPU会导致线程协同工作产生的时间较长,直接导致语句很慢,而且消耗的CPU时间很多,导致CPU使用高,进而成为瓶颈!

  看一个数据语句持续时间也就是执行时间,但是看看CPU的时间,这就是没有设置并行度,一个并行计划会产生大量的CPU消耗,另外会让语句执行的更慢!    

  

    那么是不是使用的越少越好呢?任何事情没有绝对的,视情况而定,如果系统有比较大数据量的操作需求,并行使用多个CPU会有很大的提升。

    一般建议系统如果超过32个CPU 那么设置成8或者4,如果系统中都是特别短小且频繁的语句建议设置成1(取消语句并行,要慎重真的符合你的场景才好)

    注:很多时候并行度设置和你的服务器CPU配置有关,比如有几路、几核、是否超线程,一般来说不要跨物理CPU为好。

    并行开销的阀值,主要控制SQL优化器何时选用并行计划,建议默认值,此值设置的越小优化器越容易选择并行计划。

    并行度的设置是针对实例级别的设置(2016中可以对单独数据库设置)

    怎么设置并行度和阀值,请看下图: 系统默认的并行度 为0,阀值默认为5

    

  

    并行度的调整可谓谁用谁知道啊,下面我们说说系统老大难的问题--语句导致CPU高

    语句导致CPU高也是很常见的问题之一,那么语句怎么调优降低CPU 消耗呢? 这里只做一些简单的说明,具体的语句调优、参数化减少语句编译,请看后面的系列文章。

    语句调优的方式很多种,这里介绍和CPU相关最为常用:

  1. 添加索引降低语句开销,执行需要的资源消耗少了消耗的CPU 自然相对就少了。
  2. 降低语句复杂度,让SQL Server执行高效(同样也是降低资源消耗的方法)。
  3. 分析语句是否可以采用串行计划。
  4. 前端程序尽量参数化减少语句的编译消耗。

CPU 规律波动

    拿到CPU的监控数据不要盲目下结论,数据往往是最能反映问题,给你提供思路的!

    

    如果你是系统维护人员,看到类似这样的CPU数据指标,如果你还不能有一些思路,请你好好熟悉下你亲爱的系统。

    这张图很清晰地反映出系统每半小时一次的CPU升高,那么别忙着去找对应时间点的语句,我们最少要好好想一下,系统中有什么操作半小时执行一直?SQL JOB?计划任务?前台定时处理?等等等

    这个规律的定时处理是否有异常?是否最近有什么改动?执行的结果是不是和你想的一样?

    也许问题就这么清晰的定位了......

CPU 突然飙高

    

                    图中 9点CPU由平均20几飙升到100%

    CPU突然飙高可能是偶然的现象,也许你可以认为没有关系,但当你判断为偶然之前,你是否做过下面的分析:

  1. 是否分析过系统日志,CPU飙高时间点是否有异常?
  2. 是否检查服务器上有什么特殊应用?
  3. 是否检查了数据库状态?
  4. 是否询问过相关业务人员?
  5. 是否马上开启监控为下一次突发情况的到来做好准备?

    如果没有你的判断真是毫无根据...也错过了一次发现问题,学习知识的机会!

    排除上述异常,最有可能的原因就是数据库中,在那一刻有一个或多个语句运行异常,或非常不优化。如果这情况真的因为语句问题,而且只出现一次,那么这可能不是问题,我们尽量找到当时的语句,查看问题。找到当时的语句可以通过系统视图sys.dm_exec_query_stats 查看CPU消耗以及运行时间,或者由自己的监控工具得到。

    找到对应的时间点看看到底是什么语句在运行~

    

    

    对这条语句进行分析到底是为什么!

CPU 真高

    经过各种分析优化,如果依然CPU压力明显,真心是硬件不能支撑业务了,那么我们就要选择更高大上的方式了,比如修改程序设计垂直/水平拆分,添加硬件,读写分离分担压力,组建集群负载均衡等等手段......

-----------------------------------------------------------------------------------------------------

  总结:对于CPU压力的解决,大部分的用户可以通过调整并行度和系统语句的优化来解决。

      另外对系统的监控和分析在诊断问题及解决问题中起到至关重要的作用。

      在下结论前一定要经过仔细的分析研究,一个想当然的决定可能造成严重的影响。

     你的系统真的需要加硬件,或高大上的方案么?     

    

-----------------------给出一些CPU相关的文章连接-----------------------------------------------------

桦仔的  SQLSERVER排查CPU占用高的情况

高大侠的  深入解析SQL Server并行执行原理及实践(下)

careyson的 谈一谈SQL Server中的执行计划缓存(上)

常用 监控SQLSERVER性能计数器

----------------------------------------------------------------------------------------------------

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!

  引用高大侠的一句话 :“拒绝SQL Server背锅,从我做起!”

为了方便阅读给出系列文章的导读链接:

SQL SERVER全面优化-------Expert for SQL Server 诊断系列

Expert 诊断优化系列------------------你的CPU高么?的更多相关文章

  1. Expert 诊断优化系列------------------内存不够用么?

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...

  2. Expert 诊断优化系列------------------语句调优三板斧

    前面三篇通过CPU.内存.磁盘三巨头,讲述了如何透过现在看本质,怎样定位服务器三巨头反映出的问题.为了方便阅读给出链接: SQL SERVER全面优化-------Expert for SQL Ser ...

  3. Expert 诊断优化系列------------------透过等待看系统

    上一篇我们简单的介绍了,语句优化的三板斧,大部分语句三板斧过后,就算不成为法拉利也能是个宝马了.为了方便阅读给出系列文章的导读链接: SQL SERVER全面优化-------Expert for S ...

  4. Expert 诊断优化系列------------------冤枉磁盘了

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...

  5. Expert 诊断优化系列------------------给TempDB 降温

    前面文章针对CPU.内存.磁盘.语句.等待讲述了SQL SERVER的一些基本的问题诊断与调优方式.为了方便阅读给出导读文章链接方便阅读: SQL SERVER全面优化-------Expert fo ...

  6. Expert 诊断优化系列------------------锁是个大角色

    前面几篇已经陆续从服务器的几个大块讲述了SQL SERVER数据库的诊断和调优方式.加上本篇可以说已经可以完成常规的问题诊断及优化,本篇就是SQL SERVER中的锁.为了方便阅读给出系列文章的导读链 ...

  7. Expert 诊断优化系列-------------针对重点语句调索引

    上一篇我们说了索引的重要性,一个索引不仅能让一条语句起飞,也能大量减少系统对CPU.内存.磁盘的依赖.我想上一篇中的例子可以说明了.给出上一篇和目录文链接: SQL SERVER全面优化------- ...

  8. PLSQL_性能优化系列14_Oracle High Water Level高水位分析

    2014-10-04 Created By BaoXinjian 一.摘要 PLSQL_性能优化系列14_Oracle High Water Level高水位分析 高水位线好比水库中储水的水位线,用于 ...

  9. Mysql优化系列(2)--通用化操作梳理

    前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...

随机推荐

  1. C#中的匿名方法

    C#中的匿名方法是在C#2.0引入的,它终结了C#2.0之前版本声明委托的唯一方法是使用命名方法的时代.虽然在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方 ...

  2. day4(homework)

    第八单元 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) 2) 将用户信息数据库文件和用户密码数据库文件纵向合并为一个文件/2.txt(追加) 3) 将/1.txt ...

  3. Spring-boot 开发Web应用

    动态修改Freemarker模版: 设置模版属性:   spring.freemarker.cache=false 启动应用方式有两种: a. 运行main()函数启动应用:则修改完模版文件后,需要把 ...

  4. UWP学习记录8-设计和UI之控件和模式5

    UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...

  5. 桥接模式/bridge模式/对象结构型

    意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 动机 当一个抽象类有多个实现时,通常用继承来协调它们.但是继承机制将抽象和实现固定,难以对抽象部分和实现部分独立地进行修改.扩充和重用. ...

  6. html内容超出了div的宽度如何换行让内容自动换行

    在显示评论列表的时候因为有固定宽,但是显示的内容超出的了div的宽,在这种情况下我们需要将其换行,实现的css代码如下   在工作中评论内容测试遇到评论着的评论内容为:"dddddddddd ...

  7. [算法总结]three-way partition

    procedure three-way-partition(A : array of values, mid : value): i ← 0 j ← 0 n ← size of A - 1 while ...

  8. getComputedStyle 方法

    一:getComputedStyle getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值.返回的是一个CSS样式声明对象([object CSSStyleDeclarat ...

  9. UGUI研究院之控件以及按钮的监听事件系统

    继续学习,我相信大家在做NGUI开发的时候处理事件都会用到UIEventListener,那么UGUI中怎么办呢?先看UGUI的事件有那些吧 Supported Events The Eventsys ...

  10. Android MVP 利用rxjava 避免向Model传入监听方法

    传统的MVP: 1.抽离出View的接口,即ILoginView. 2.抽离Model的接口,即ILoginModel. 3.抽离Presenter的接口,即ILoginPresenter. 4.实现 ...