CPU问题定位基本流程:

  性能计数器诊断
  主要用到的性能计数器
  %Process Time 全实例  (主要用于查看当前服务器的CPU 情况)
  %Process Time sqlservr (主要用于查看数据库使用的CPU情况 )
  步骤1.排除应用影响CPU

  综合这两个计数器 在同一时间点可以诊断出CPU 是否是被服务器其他的应用所消耗的,如图中17:10 左右的  “%Process Time 全实例(红线)” 突然升高,而SQL 服务的(绿线)并无明显升高,这也说明,在这个时间段的CPU 压力不是有数据库导致的!
  这个红线的明显升高时,因为我在数据库所在的服务器上做了一次文件压缩!类似文件压缩这种操作会使用大量CPU,对数据库性能造成冲击!
  步骤2.CPU 问题定位
  高峰时段CPU 持续很高

  CPU 规律波动

  CPU 突然飙高

  图中 9点CPU由平均20几飙升到
  步骤3.CPU 问题分析与解决(通用步骤)
  首先明确一点90%的问题可能集中在10%的场景,这种CPU 持续持续很高的情况请注意下面两点:
  你的数据库并行度是否调整?
  你的数据库是否缺少索引,导致频繁的查询消耗很高的CPU资源?
  并行度和并行阀值
  大并行度是什么?简单的可以理解为执行一条语句多可以使用多少个CPU。看起来当然是使用的越多越好啦,使用的越多语句肯定越快呀! 这个答案是大写的 “NO”,使用过多的CPU会导致线程协同工作产生的时间较长,直接导致语句很慢,而且消耗的CPU时间很多,导致CPU使用高,进而成为瓶颈!
  看一个数据语句持续时间也是执行时间,但是看看CPU的时间,这是没有设置并行度,一个并行计划会产生大量的CPU消耗,另外会让语句执行的更慢!

  那么是不是使用的越少越好呢?任何事情没有的,视情况而定,如果系统有比较大数据量的操作需求,并行使用多个CPU会有很大的提升。
  一般建议系统如果超过32个CPU 那么设置成8或者4,如果系统中都是特别短小且频繁的语句建议设置成1(取消语句并行,要慎重真的符合你的场景才好)
  注:很多时候并行度设置和你的服务器CPU配置有关,比如有几路、几核、是否超线程,一般来说不要跨物理CPU为好。并行度的设置是针对实例级别的设置(2016中可以对单独数据库设置)
  并行开销的阀值,主要控制SQL优化器何时选用并行计划,建议默认值,此值设置的越小优化器越容易选择并行计划。
  怎么设置并行度和阀值,请看下图: 系统默认的并行度 为0,阀值默认为5

  语句导致CPU高
  语句导致CPU高也是很常见的问题之一,那么语句怎么调优降低CPU 消耗呢? 这里只做一些简单的说明,具体的语句调优、参数化减少语句编译,请看后面的系列文章。
  语句调优的方式很多种,这里介绍和CPU相关为常用:
  添加索引降低语句开销,执行需要的资源消耗少了消耗的CPU 自然相对少了。
  降低语句复杂度,让SQL Server执行高效(同样也是降低资源消耗的方法)。
  分析语句是否可以采用串行计划。
  前端程序尽量参数化减少语句的编译消耗。