我用的SQL Server 2008 R2 企业版,当分配所有4个CPU共64核时,系统CPU占用超过60%,前台工作不流畅。这时调整SQL分配的CPU,让SQL只占用2个CPU共32核时,系统CPU占用降低到10%~20%之间,前台客户端明显流畅了,百思不得其解。望高人指点!万分感谢!

解决方案 »

  1.   

    贴出来具体的调整SQL分配的方式看看,是SQL语句执行的时候指定了两颗CPU?还是修改了配置并发参数?
      

  2.   

    不懂.数据库刚装好时是不是所有CPU都开的呢?
      

  3.   

    首先先要用各种手段定位瓶颈——如DMV、性能计数器、R2自带的性能报表等。不定位,只有瞎猜,这样完全靠运气。
    看你的描述可能是上下文切换过多引起的,个人觉得有可能你的代码不够优化,需要找出CPU开销较大的,然后进行优化。
    最后你开4个CPU怎么就变成64核了?除非你能准确定位问题,不然不要随便改微软的默认配置
      

  4.   

    核太多,互相切换的机会也多,各个核的cache里的数据也需要重复搬移到别的核的cache?
    os是什么?是不是它对太多核的应对做的不够好?
      

  5.   

    是不是并发度太高,造成并发任务之间的相互等待太多。
    试一下把Max Degree of parallelism的值设置为比较小的值。
      

  6.   

    同意,可以看一下WAIT TYPE是不是并发造成的。
      

  7.   

    现在的CPU有4个64核的吗?一个CPU有16核,这么离谱啊?是不是超线程了,如果是超线程的话,最后取消掉。
    还有LZ可以看看CPU的架构,就明白多核CPU的好处和坏处。
      

  8.   

    --PS:内存处理分NUMA和SMP
    --1、NUMA:非统一内存访问,每组处理器都有自己的内存,并可能有自己的 I/O 通道,
    --并且,每个 CPU 都可以通过一致的方式访问与其他组关联的内存。
    --NUMA通过提供分离的存储器给各个处理器,
    --避免当多个存储器访问同一个存储器产生的性能损失来试图解决这个问题
    --例如:inter酷睿i5中的二级缓存,4*256kb,从这个可以看出4核心,因为inter处理器采用NUMA结构,
    --每个核心被分配了256kb缓存。
    --同样,i3因为是双核,那么二级缓存为2*256kb。
    --为什么需要为CPU分配内存?因为现在的计算机CPU的性能已经超过了内存性能。
    --CPU经常需要等待内粗的数据,而通过减少对内存访问次数来提高计算机性能,即建立高度缓存。
    --与此同时,NUMA结构支持多处理器的扩展,而SMP支持的扩展性比较低很难扩展到100个以上的多处理器。
    --2、SMP:对称多处理,
    --各处理器能并行访问不同的存储块,但对同一块的访问必须是顺序的。但是他的技术比较成熟。
    --由于inter处理器比较稳定,现今的服务器基本使用inter处理器,所以SMP结构不做多的介绍。
      

  9.   

    感觉有可能是并行度问题。sql 有时候为了提高查询时间,
    使用高并行的处理策略,这样会导致cpu开销多大
    这也是部分语句会出现的
    你可以跟踪一下cpu开销过大的查询。
    这类语句的特点是cputime = 会比 elapsed time大很多
    然后用option 限定一下maxdop 在试试
      

  10.   


    高并行的处理策略 导致的cpu开销大,直接好处是sql执行速度快很多!是好事
      

  11.   


    高并行的处理策略 导致的cpu开销大,直接好处是sql执行速度快很多!是好事
    不一定,以前遇到过并行计划结果很慢,结果查看等待信息都是并行计划引起的,因为有的操作早就做完了,但是有的没做完,所以要一直等待。有的时候顺序执行可能效果好。 另外并行可能会影响系统反应,阻塞后面的语句执行(无法及时获得CPU资源)
      

  12.   

    这个问题问的有点晕,也许是我自己理解太浅。
    就感觉这两位的答案好一点。5楼说的是NUMA
    结构吗?高速缓存在CPU里而非内存里。NUMA结构好处在于每个节点处理访问自己的内存池不需要共享的总线,不需要额外的代价。如果访问数据在远程内存中,那么访问数据代价要高很多。所以只有两个NUMA就会把本地内存访问数量最大化。而不是4个就会访问远端内存吗?
      

  13.   

    并行查询并不会因为CPU多了而导致服务器慢吧?只是会增加CPU的占用率,我怀疑LZ的应用程序也部署在服务器上面,这样的话,并发造成的CPU占用率升高,同时应用程序因为得不到足够的CPU处理,导致客户端变慢。
      

  14.   

    前天设定数据库选项,打开所有CPU给SQL Server使用,然后检查了一下
    SELECT top 5 *
    FROM sys.dm_os_wait_stats
    order by wait_time_ms desc
    CXPACKET 一项高居第一,于是将MaxDOP设定为16,CPU占用所改善。谁知昨天业务繁忙时段下面有客户端连接不上服务器。
    再查微软资料:--当您配置 MAXDOP 值时,请遵循以下准则: 
    --    对于使用八个以上的处理器的服务器使用以下配置: MAXDOP = 8。
    --    服务器的有八个或更少的处理器,使用下列配置其中 N 等于处理器数: MAXDOP = 0 到 N。
    --    对于具有 NUMA 配置的服务器,MAXDOP 不应超过分配给每个 NUMA 节点的 cpu 数。
    --    超线程已启用的服务器的 MAXDOP 值不应超过物理处理器的数量。
    怀疑和超线程有关系,再上网查了下我的服务器志强E7 4820 果然是超线程CPU,物理核是8个。根据微软MaxDOP第一条和第四条原则,调整MaxDOP到8,目前为止CPU占用不高,LAZYWRITER_SLEEP是第一个wait_stats,运行似乎还稳定。
    散分结贴。
      

  15.   

    在一台2路4核超线程的服务器,maxdop采用默认的0(即所有)
    在对分区表查询时,cpu会100%,结果出现也比较快
    而其他查询,大多数只能占到6%左右(即一个核),即无法并行
    按上面的说法,只能设为4?
      

  16.   

    服务器的有八个或更少的处理器,使用下列配置其中 N 等于处理器数: MAXDOP = 0 到 N。
    对于具有 NUMA 配置的服务器,MAXDOP 不应超过分配给每个 NUMA 节点的 cpu 数。
    超线程已启用的服务器的 MAXDOP 值不应超过物理处理器的数量。