热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

数据库性能优化数据库等待队列(上)

介绍数据库等待队列(上)本篇文章的目的就是为帮助DBA,开发人员以及其他与使用数据库的人员阐述什么是数据库等待队列。性能优化的已经变得越来越重要了&#x

 

介绍数据库等待队列(上)

本篇文章的目的就是为帮助DBA,开发人员以及其他与使用数据库的人员阐述什么是数据库等待队列。


性能优化的已经变得越来越重要了,随着SQL Server 2005推出之后,里面包含了很多的动态管理视图(DMV)和函数,所以,我们很有必要如何使用这些动态管理对象来帮助我们进行性能的诊断与排除。

对于性能而已,我们一个最可以感知的现象就是:SQL Server的响应变慢了,而且服务器的资源开始被不正常的消耗。面对这些问题,分析等待队列是我们的第一步,只有知道数据库为什么慢,为什么耗费过多的资源,我们才能对症下药。


 

在接下来的内容中,将会讲述如何分析OLTP应用中的等待队列。当然,大家在此基础之上进一步的去研究和深入的学习。

在此之前,我们来看看与性能相关的几个内容,这样便于我们后续内容的展开,首先说说什么是总体的响应时间。

总体响应时间介绍


大家知道,在SQL Server 2000及之前的版本中,我们必须采用很多类似广撒网的方式来设置很多不同的计数器和工具来捕获和分析发生性能瓶颈的原因。我们常常使用的工具包括profiler traces,性能计数器,网络嗅探器,还有一些第三方的诊断工具。不可否认,使用这些工具可以帮助我们找到问题的症结,但是所花费的时间和精力都是非常多的。


我们常常会问这样的问题:数据库引擎在等待什么,从而导致性能下降?,其实,当我们使用工具来分析性能问题的时候,就是在试图去找出这些答案。另外,当我们把问题解决之后,最终用户最为关注的结果就是:总体的响应时间是多少,或者说,发送的查询的响应时间是多少。


所谓总体的响应时间,就是发送一个请求之后,一直到接收到响应,这个过程的时间。例如,现在用户通过应用程序发送了一个请求给数据库,去获取数据。那么总体的响应时间就如图所示:



 

其实,从严格的意义上说,总体响应时间还包含数据发送给应用程序之后,应用程序处理数据,展示数据花的时间,但是,我们这里的重点是研究数据库的等待,所以,我们就不考虑应用程序方面的时间问题。

 

 

下面就言归正传,我们来看看等待的问题。



 

什么是等待统计数据



 

采用微软官方的说法就是:当在SQL Server内部产生 一个请求的时候,由于某些原因,这个请求不能被立刻的处理,于是系统就让这个请求进入等待的状态。SQL Server内部的引擎会跟踪请求等待所花的时间,并且在这些等待的时间基于数据库实例进行聚合,并且把这些信息保存在内存中。

可能上面的讲法有点生硬,我们就举个简单的例子。如,当我们运行一个查询的时候,SQL Server由于CPU或者其他资源被占用而无法及时的处理我们的查询请求,那么此时,我们的请求就必须要等那些资源被释放之后才能继续进行。在这段期间,我们的查询请求就会被挂起,被放在等待队列中,并且SQL Server内部引擎中回去保存一些记录,来标示这个查询请求的等待类型,或者说,因为什么而导致了等待。


 

大家可以看看下面的图:

 

 

借助这个图,我们就非常好理解了,我这里暂时不过过多的解析,以后我们再说。


 

从上面的讨论就可以知道:如果我们可以利用数据库引擎内部保存的等待统计信息来分析,那么在准确度上面会比之前有很多的改进。

 

 

 

等待类型的分类

既然我们要用内部的等待统计信息来分析问题,那么首先就要得知道:到底有哪些等待类型。

在SQL Server中,等待类型有很多,为了便于使用和管理,这些等待类型又是被进行了分类的,所以,下面,我们就来看看等待类型的分类。

说出来可能有点吓人:在SQL Server内部,可以跟踪大约400多个等待类型。如此众多的等待类型,可以让我们感受到:发生等待的原因真是太多了,如果靠我们自己“小米+步枪”的方式去分析,会花费多少精力。


尽管有如此众多的等待,其实我们常常用到的,或者我们关注的等待就只有很少的一部分,如那些与资源争夺相关的等待:CPU,I/O,内存等。下面,我们就介绍我们常常使用的四大等待类型的分类:


资源等待(Resource waits):这类型的等待发生的场景是这样的:当某个工作线程要去访问谋一份资源的时候,但是此时,这个资源被其他线程占用。在这种等待分类中,我们常常看到的典型的,如锁,闩锁,和网络。


信号等待(Signal waits):某个工作线程在等待CPU可用所花费的时间。在SQL Server中,如果某个工作线程运行所需要的资源全部已经准备好了,此时,它就要被运行,但是CPU每次只能运行一个线程,那么,那些已经就绪的工作线程就会被放在称之为runnable的队列中,等待CPU时钟的到来,然后被运行。此时,可以知道,如果这类的等待时间多长,那么就说明CPU有压力,因为要被运行的线程不缺任何的资源,就差被CPU去执行了。


队列等待(Queue waits):这种分类的等待发生的场景是这样的:一个工作线程很闲,等待有任务教给它。那么,这里就有一点要说明的就是:在数据库中,有个工作线程池,我们的向数据库发送的每个请求,都是交给工作线程,然后这些线程去运行的。举个例子,你要去图书馆借书,在图书馆中有很多的图书管理员,这些管理员我们就称之为“工作线程”。当我们发起一个借书的请求之后,这个请求就被交给图书管理员,然后由他们去找书。如果图书馆总是没有人借书,或者借的人很少,那么这些管理员就闲置。这种类型的等待常常与系统的背后任何相关,可以用来分析死锁等情况。


外部等待(External waits):很好理解,当SQL Server工作线程要等待外部某个事件事件的发生然后才去运行,在事件发生之前就要等待,如采用linked server查询,需要等到结果过了之后才能继续进行。

 

 

 

此文为了回复悬赏区中的“介绍数据库等待队列".

 

 

 



推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
author-avatar
秋梯田那路77
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有