0

0

SQLServer RESOURCE_SEMAPHORE 等待状态内存消耗过多

php中文网

php中文网

发布时间:2016-06-07 15:13:06

|

1793人浏览过

|

来源于php中文网

原创

概述: 当一个SQLServer实例运行得很慢的时候,应该做一些检查,如检查 等待 状态 。最好的方法是一开始就建立一个性能基线,以便做性能对比。当发现与性能基线对比后,存在 内存 压力的话,就要找出是什么原因导致的。可以检查事务的 等待 状态 ,其中Resou

概述:

         当一个SQLServer实例运行得很慢的时候,应该做一些检查,如检查等待状态。最好的方法是一开始就建立一个性能基线,以便做性能对比。当发现与性能基线对比后,存在内存压力的话,就要找出是什么原因导致的。可以检查事务的等待状态,其中Resource_semaphore等待可能出现最多。下面是如何去处理这个问题: 

         当检查事务的所有等待类型后,可能会发现Resource_semaphore这个等待类型出现非常多,这会增加一些页面的IO等待。因为这些事务没有足够的内存来处理它们的操作,所以到这了页面的IO等待

 


Resource_semaphore等待


         首先我们来弄清楚一下什么是Resource_semaphore等待。当SQLServer收到一个用户请求(或者查询时)。首先会创建一个编译后的计划,然后在这个基础上创建一个执行计划。当SQLServer创建一个编译后的计划时,它会计算两个内存授予参数,成为:请求内存(required memory)和额外内存(additional memory)

        请求内存是运行排序和hash连接的所需最少内存,之所谓成为“请求”,是因为查询不需要在一开始就申请这部分的内存。而额外内存是存放临时数据到内存中所需的那部分内存。如果没有足够的内存,查询所需的数据将会存到硬盘当中。

         首先,服务器会计算运行特定查询所需要的内存。这部分通常等于请求内存和额外内存的总和。但当实例使用并行执行时,所需的内存为(请求内存*并行度)加上额外内存的总和。服务器会检查是否有足够的内存来运行每个查询,然后会降低额外内存的量,知道所有总内存需求量刚好达到内存的限制量。这部分修改后的内存成为需求内存(requested memory)。在SQLServer内不能,有一个叫Resource Semaphore的设置,用于授予需求内存用于查询。当查询没有得到足够的内存,就会把等待状态改为:Resource_Semaphore。可以从sysprocesses系统表或者sys.dm_exec_request DMV中查询。

        当Resource_semaphore接受一个新的请求时,首先检查是否有查询还在等待中,如果发现有,那么会把这个新请求放到先进先出的队列中,Resource Semaphore会尝试对未等待的查询授予内存,这部分内存可能是之前的查询执行完毕后返回的内存。如果发现有足够的内存,那么就会把内存赋予给处于Resource Semaphore等待状态的查询,让其开始运行。如果不够,那么会把查询放入等待队列并标记为Resource_Semaphore等待。因此,看这个等待状态可以发现内存存在压力。



识别Resource_Semaphore等待

步骤1:


        执行以下语句,并筛选Resource_Semaphore等待的数据:

[sql] view plaincopyprint?

  1. SELECT  *  
  2. FROM    sys.SYSPROCESSES  
  3. WHERE   lastwaittype = 'RESOURCE_SEMAPHORE'  
  4. ORDER BY lastwaittype  

由于这种情况不好模拟出来,所以没有截图。



步骤2:


        从步骤1中得到的结果,可能会看到很多的事务处于ResourceSemaphore 等待状态,现在可以运行下面语句来查看已分配到内存的查询的目前状态,和未被分配内存的查询的数量。这个DMV会返回两行,一行是resource_semaphore_id为0的大查询,另外一些是为1的小查询,这里的小是内存小于5M。在这里可以获得总授予内存和实例上总可用内存。可以查看grantee_count和waiter_count,grantee_count是已经分配了内存的总查询数量,而waiter_count是在队列中等待授予内存的总查询数量:



[sql] view plaincopyprint?

  1. SELECT  *  
  2. FROM    sys.dm_exec_query_resource_semaphores  


步骤3:


         然后使用DMV:sys.dm_exec_query_memory_grants来获得在等待队列中的查询所需要内存的详细信息。这些查询的grant_time和granted_memory_kb可能为null。也可以从这个DMV中得到plan_handle和sql_handle:

[sql] view plaincopyprint?

  1. SELECT  *  
  2. FROM    sys.dm_exec_query_memory_grants  

我们要关注的是下面3列:




步骤4:


       现在将要找到集中消耗内存的查询,可以查看所有等待查询中的需求内存。当看到这部分内存太大的时候,然后找到这些查询的plan_handle,并查看它们的执行计划:



[sql] view plaincopyprint?

  1. SELECT TOP 10  
  2.         *  
  3. FROM    sys.dm_exec_query_memory_grants  


步骤5:

       把步骤4中查询的plan_handle的数据复制,然后执行:




[sql] view plaincopyprint?

  1. SELECT * FROM sys.dm_exec_sql_text(sql_handle)  


注意替换括号中的sql_handle。然后查看其执行计划。

 

总结:

         通过上面的步骤找到耗费内存的查询后,应该调整语句,使其占用更少的资源。以便解决内存压力。

相关专题

更多
苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

115

2025.12.24

拼豆图纸在线生成器
拼豆图纸在线生成器

拼豆图纸生成器有PixelBeads在线版、BeadGen和“豆图快转”;推荐通过pixelbeads.online或搜索“beadgen free online”直达官网,避开需注册的诱导页面。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

82

2025.12.24

俄罗斯搜索引擎yandex官方入口地址(最新版)
俄罗斯搜索引擎yandex官方入口地址(最新版)

Yandex官方入口网址是https://yandex.com。用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

546

2025.12.24

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

150

2025.12.24

php框架基础知识汇总
php框架基础知识汇总

php框架是构建web应用程序的架构,提供工具和功能,以简化开发过程。选择合适的框架取决于项目需求和技能水平。实战案例展示了使用laravel构建博客的步骤,包括安装、创建模型、定义路由、编写控制器和呈现视图。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

20

2025.12.24

Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

47

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

7

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

12

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

371

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RDF快速入门教程
RDF快速入门教程

共11课时 | 4.5万人学习

CSS3 教程
CSS3 教程

共18课时 | 4万人学习

Django 教程
Django 教程

共28课时 | 2.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号