排行
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
中国数据库
向量数据库
时序数据库
实时数据库
搜索引擎
空间数据库
图数据库
数据仓库
大调查
2021年报告
2022年报告
年度数据库
2020年openGauss
2021年TiDB
2022年PolarDB
2023年OceanBase
首页
资讯
活动
大会
学习
课程中心
推荐优质内容、热门课程
学习路径
预设学习计划、达成学习目标
知识图谱
综合了解技术体系知识点
课程库
快速筛选、搜索相关课程
视频学习
专业视频分享技术知识
电子文档
快速搜索阅览技术文档
文档
问答
服务
智能助手小墨
关于数据库相关的问题,您都可以问我
数据库巡检平台
脚本采集百余项,在线智能分析总结
SQLRUN
在线数据库即时SQL运行平台
数据库实训平台
实操环境、开箱即用、一键连接
数据库管理服务
汇聚顶级数据库专家,具备多数据库运维能力
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
我的订单
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
资讯
活动
大会
课程
文档
排行
问答
我的订单
首页
专家团队
智能助手
在线工具
SQLRUN
在线数据库即时SQL运行平台
数据库在线实训平台
实操环境、开箱即用、一键连接
AWR分析
上传AWR报告,查看分析结果
SQL格式化
快速格式化绝大多数SQL语句
SQL审核
审核编写规范,提升执行效率
PLSQL解密
解密超4000字符的PL/SQL语句
OraC函数
查询Oracle C 函数的详细描述
智能助手小墨
关于数据库相关的问题,您都可以问我
精选案例
新闻资讯
云市场
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
专家团队
智能助手
精选案例
新闻资讯
云市场
微信扫码
复制链接
新浪微博
分享数说
采集到收藏夹
分享到数说
首页
/
LoaRunner性能测试系统学习教程:SQL Server等待类型
LoaRunner性能测试系统学习教程:SQL Server等待类型
西安川石
2020-12-15
211
上期我们讲到LoadRunner性能测
CPU瓶颈
,
这期我们讲LoadRunner性能测试
SQL server等待类型。
SQL Server
等待类型
通常可能更多的去监控每个查询执行步骤所消耗的时间,但其实这些还不够,因为每个执行计划在执行前可能需要等待,而这些等待的时间是被消耗了,没有任何作用,所以如果能缩短等待时间显然可以提高
SQL Server
的性能。
SQL
等待类型
SQLServer
通过
SQLOS(SQLServerOperatingSystem)
调度程序来管理用户请求执行,SQLOS则通过SCHEDULER、WORKER、TASK等对任务进行调度和处理。
默认情况下调度程序的数量与服务器中的逻辑CPU数量相同,即SCHEDULER个数与CPU个数相匹配,因为一个CPU某时刻只能运行一个调度程序,如果服务器中包含2个CPU,则调试程序数量为2,如果是双核的,那么调度程序为4,如果是双核且超线程的,则调度程序数量为8。只有拿到scheduler所有权的任务worker才能在这个逻辑CPU上运行。
使用以下查询语句可以查询到当前CPU数和SCHEDULER数。
SELECTcpu_count,scheduler_countFROMsys.dm_os_sys_info
结果如图所示。
在调度程序内部,会话通常有三种状态:
running
、
runnable
和
suspended
,但会话只可能是这三种状态中的一种,在任何时刻,调度程序上只能有一个会话处于
running
状态,其它的会话都处于等待状态,存储在
runnable
队列之中,停止执行并将某等待的会话状态将改为
suspended
。会话三状态图如图
所示。
WORKER(又称为WORKERTHREAD)是指工作线程,在一台服务器上,可以有多个工作线程。因为每一个工作线程要耗费资源,所以,SQLServer有一个最大工作线程数。
一个TASK(TASK是WORKER中运行最小的任务单元)进来,系统会给它分配一个工作线程进行处理,但是当所有的工作线程都在忙,而且已经达到了最大工作线程数,SQLServer就要等待,直到有一个忙的工作线程被释放,最大工作线程数可以通过下面的查询得到。SQLSERVER并不是一开始就把这些所有的工作线程都创建,而是依据需要而创建。
使用以下查询语句可以查询到当前最大工作线程数。
SELECTmax_workers_countFROMsys.dm_os_sys_info
结果如图所示。
Windows使用抢占方式(pre-emptive)调度模型进行调度,意味着由调度程序决定运行某个任务的线程何时需要为另外一个任务让路并切换出去,这种方式可以很好的运行在很多同等重要的不同服务的服务器上,但对于运行SQLServer的服务器来说,这种方式并不理想,因为一个SQLServer任务可能随时被切换出去,而仅仅是为了给一个次要的Windows任务一些CPU的时间。SQLServer有着自身的调度程序,采用非抢占式或协作模型,它依赖于所有线程在必须等待某事件时能产生处理时间,对于SQLServer来说这种模型是一种高效的模型,因为它可以判断某个线程在何时需要处理器时间,即CPU时间。
TASK是由BATCH而来,一个连接,可以包含多个BATCH,而每个BATCH则可以分解成多个TASK,如下面某一个连接要做的事情,这个连接要做的有两个BATCH,而每个BATCH,如以下查询语句,可能会被分解成多个TASK
因为可以支持并行化查询。具体BATCH怎么分解成TASK,以及分解成多少个,则是由SQLServer内部进行处理。
INSERTINTOTABLE_BVALUES(‘aaa’)
GO
SELECT*FROMTABLE_B
GO
了解Connection、Batch、Task、Worker、Scheduler这些概念后,那么,它们之间的关系如何呢?具体的关系如图所示。
客户端向服务器发送请求时,会先建立一个连接
建立的连接数受max/minconnection两个参数的影响,每个连接有一个相应的SPID,只要用户没有退出,或者没有timeout,这个始终是存在的。
在每一个连接里,可能会有多个batch,在一个连接里,batch都是按顺序的,只有上一个batch执行完了,才会执行下面一个batch。因为有很多连接,所以从SQLServer层面上看,同时会有很多个batch并行进行。
每一个batch,可能会分解成多个task以支持如并行查询,这样,在SQL层面上来看,同时会有很多个TASK。
SQLServer上,每一个CPU通常会对应一个Scheduler,有几个额外的系统Scheduler,只是用来执行一些系统任务
对用户来讲,只需要关心UserScheduler就可以了,如果有4个CPU的话,那么通常就会有4个UserScheduler。
每个Scheduler上,可以有多个worker对应,Worker是真正的执行单元,Scheduler(对CPU的封装)是执行的地方
Worker的总数受maxworker_thread限制,每一个worker在创建的时候,自己需要申请2M内存空间,如果maxworker_thread为1024,并且那些worker全部创建的话,至少需要2G空间,所以过多的worker,会占用很多系统资源。
在SQLServer中根据等待类型进行分类,通常可以分为三类:
Resourcewaits(资源等待)
当某个工作线程请求访问某个不可用的资源(因为该资源正在由其他某个工作线程使用,或者该资源尚不可用)时,便会发生资源等待。资源等待的示例包括锁等待、闩锁等待、网络等待以及磁盘I/O等待,锁等待和闩锁等待是指等待同步对象。
Queuewaits(队列等待)
当工作线程空闲,等待分配工作时便会发生队列等待,队列等待通常发生在系统后台任务(如监视死锁以及清除已删除的记录等任务)中,这些任务将等待工作请求被放入工作队列,即使没有新数据包放入队列,队列等待也可能定期处于活动状态。
Externalwaits(外部等待)
当SQLServer工作线程正在等待外部事件(如扩展存储过程调用或链接服务器查询)完成时,便会发生外部等待。当诊断有防碍的问题时,请记住,外部等待不会始终表示工作线程处于空闲状态,因为工作线程可能处于活动状态且正在运行某些外部代码。
资源等待,包括I/O、加锁以及内存,是最为常见的等待。
如果出现下列任一情况,则SQLServer工作线程不可能处于等待状态:
资源变得可用。
查询非空。
外部进程完成。
尽管线程不再处于等待状态,但是它并不表示立即开始运行,因为此类线程首先放入可运行工作线程的队列中
并且必须等待量程在计划程序中运行,在SQLServer2005中,等待时间计数器为bigint值。
使用以下查询语句可以查看等待类型,如图所示。
关于
sys.dm_os_wait_stats
字段说明,见表
。
END
扫码下面二维码进入软件测试QQ交流群~
扫下方二维码进入腾讯课堂体验免费课程~
关注我们,川石学院带你
玩
转技术!
我就知道你在看
sql server
文章转载自
西安川石
,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
领墨值
有奖问卷
意见反馈
客服小墨