某集团一台sqlserver服务器,据系统管理员反应,经常会出现CPU飙到100%而且高居不下的情况,然后应用层会出现各种等待超时。
服务器配置:windows
server 2008R2 x64 + 32GB内存 +6核CPU,业务量不算特别繁忙,按理CPU使用率不会很高。
首先确认CPU高是否确实是由SQLSERVER导致的,添加几个windows CPU计数器:Procesor:% Privileged
Time(kernel mode值),Procesor: %user time (user mode值),Procesor:
%processor time ,Process:Processor time(添加所有实例,查看sqlserver
cpu占用率)。结果%processor time 很高(正常平均应低于50%),且sqlserver使用率占用绝大部分。
一般来说,sqlserver对
cpu的使用相对于内存、I/O等资源来说,应该算是较少的。CPU的使用主要是用于编译、重编译、sort、aggregation、表join(nested
loop,hash
match等)。可以通过profiler抓取一段trace,基本没有多少编译和重编译存在(profiler里cache
insert和cache miss基本没有),那么很有可能是某些sql语句导致CPU消耗很高。再通过profiler抓取一些CPU
time比较高的sql语句,有时候CPU使用率到达90%时,使用profiler会使服务器负载更高,我们可以用下面sql抓取一段时间内cpu消耗比较高的语句:
SELECT