性能调优2:CPU

关系型数据库严重依赖底层的硬件资源,CPU是服务器的大脑,当CPU开销很高时,内存和硬盘系统都会产生不必需要的压力。CPU的性能问题,直观来看,就是任务管理器中看到的CPU利用率始终处于100%,而侦测CPU压力的工具,最精确的就是性能监控器。

一,使用性能监控器侦测CPU压力

性能监控器(PerfMon)是侦测CPU压力的首选工具,对于CPU高利用率,在使用性能监控器时可以重点关注下面的3个计数器:

Processor/ %Privileged Time:花费在执行Winidows内核命令上的处理器时间的百分比

Processor/ %User Time:花费在处理应用程序上的处理器时间的百分比

Process(sqlserver.exe)/ % Processor Time:每个处理器所有进程的总处理时间

 除了上面这3给计数器之外,还可以使用SQL Statistics计数器来监控:

SQL Server:SQL Statistics/Auto-Param Attempts/sec

SQL Server:SQL Statistics/Failed Auto-params/sec

SQL Server:SQL Statistics/Batch Requests/sec

SQL Server:SQL Statistics/SQL Compilations/sec

SQL Server:SQL Statistics/SQL Re-Compilations/sec

SQL Server:Plan Cache/Cache Hit Ratio

二,使用DMV侦测CPU压力

使用DMV来侦测当前系统CPU的压力,常规的步骤是:

step1:使用sys.dm_os_wait_stats 检查等待,查看是否存在CPU压力

step2:根据等待类型,通过sys.dm_os_wait_stats 和 sys.dm_os_schedulers 确定CPU问题的种类

step3:通过sys.dm_exec_query_stats 和 sys.dm_exec_sql_text 找出计划缓存中CPU消耗最高的查询

step4:通过sys.dm_os_waiting_tasks找到当前任务中CPU相关的等待类型中CPU消耗最高的任务

step5:从sys.dm_exec_requests中找到当前查询中CPU资源使用最高的查询。

三,CPU相关的等待

从sys.dm_os_wait_stats 中检查等待,对于CPU压力,通常相关的等待类型是:SOS_SCHEDULER_YIELD和CXPACKET

1,CXPACKET

CXPACKET是最常见的并行等待,如果一个查询由多个线程组成,那么只有在最慢的那个线程完成之后,整个查询才会完成。这就是并行查询的木桶效应,一个木桶的容量取决于组成木桶最短的那块木条的长度。

在多CPU的环境中,一个单独的查询可以使用多个线程来共同完成,每个线程单独处理数据集的一部分。在并行处理的过程中,如果某个线程处于落后状态,CXPACKET等待就会产生。但是,应该注意,CXPACKET等待并不总是表示系统存在性能问题。需要测试,合理设置并行度阈值(Cost Threshold for Parallelism,CTP)和最大并发度(Max Degree of Parallelism,MDP),这两个配置项的用途是:

CTP是指只有查询的开销超过一定的阈值之后,才会使用并发操作

MDP应设置为CPU的内核数量,表示最多使用多少个线程同时处理任务

出现CXPACKET等待的原因是:

在可变类型中,数据的分布存在严重的倾斜,比如某列nvarchar类型的数据,有些数据的长度是几个字符,有些的几千个字符,对这样的数据进行查询时,会导致某些线程执行很快,但另一个线程执行很慢。

查询所需要的数据存放在不同的IO子系统中,而这些子系统的性能又存在差异

查询所需要的数据中,不同部分的碎片不同,所需的IO也不同。IO数量直接影响运行速度和资源开销,从而导致查询过程中不同线程的运行速度不同。

2,SOS_SCHEDULER_YIELD

多任务等待,多任务是指服务器同时处理多个任务,SOS_SCHEDULER_YIELD等待类型就发生在一个任务资源放弃当前占用的资源,让其他任务使用资源执行下去。

SQL Server以协同模式运行,在必要的时候,SQL Server会让出资源给其他线程,通常来说,这种让步是临时的,但是,当长期、大量出现这种等待的时候,有可能意味着CPU存在压力,这个时候,可以检查 sys.dm_os_schedulers,看看当前有多少个 runnable的任务在运行,

select schedule_id, current_tasks_count, runnable_task_count, work_queue_count, pending_disk_io_count from sys.dm_os_schedulers where schedule_id<255

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyzjy.html