大家好,欢迎回到性能调优培训的第22周。上周我谈了SQL Server里的基线,今天我们继续,谈下SQL Server里的等待和I/O延迟统计。当我进行SQL服务器健康检查时,我总会使用这2个维度全局掌握下SQL Server的健康状况。

等待统计(Wait Statistics)

在SQL Server里每次你执行一个查询,查询会等待。初次看这个看起来很惨淡,但其实有一个非常好的原因,在SQL Server里总会等待。每次一个查询等待,SQL Server通过所谓的等待统计(Wait Statistics)来跟踪这些等待。在我们讨论等待统计本身前。我想介绍下为什么在执行期间,查询总会等待。等待的概念主要基于2个原则:

  • 非同步资源等待(Asynchronous Resource Waiting)
  • 协同调度(Cooperative Scheduling)

我们来详细看下这2个。每次查询等待一个当前不可用的资源——例如在缓存池理还没缓存的页,或者因为另一个不兼容的锁而不能获得的锁——查询会进入SQL Server里所谓的挂起(Suspended)状态。查询在挂起状态一直等待直到资源变成可用。

当资源变成可用时,查询进入所谓的可执行(Runnable)状态,再次等待,知道CPU变成可用。当CPU是可用时,查询最后进入运行(Running)状态,执行到资源再次变成不可用。当这个发生时,查询再次进入挂起(Suspended)状态。下图显示了这个查询生命周期。

另外查询也会由于在SQLOS(SQL Server操作系统)里SQL Server实现的协同调度(Cooperative Scheduling)而等待。SQL Server通过使用特定的WIN32 API功能调度它的线程。协同调度意味着当一个查询本身超过近4ms的额(quantum )时,它从CPU上撤离。因为这个实现方式,在SQL Server里查询总会等待:一旦一个资源尚不可用,或者查询已超过了它的额——查询就会进入挂起(Suspended)状态并等待。

每次当一个等待情况发生时,等待时间被SQL Server通过等待统计(Wait Statistics)自动跟踪。SQL Server通过DMV sys.dm_os_wait_stats 报告这些信息。通过这个DMV返回的每一行都代表SQL Server里的一个特定等待——所谓的等待类型(Wait Type)。通过评估等待统计,SQL Server告诉你什么是最突出的等待类型。然后你可以聚焦这个等待类型并找出内部问题根源,还有对于这个等待类型为什么等待时间如此高。

I/O延迟统计(I/O Latency Statistics)

除了等待统计外另一个非常重要的是SQL Server也会报告的I/O延迟统计(I/O Latency Statistics)。有了这些延迟时间很容易找出你的SQL Server实例哪个文件有延迟时间。SQL Server通过DMF sys.dm_io_virtual_file_stats来报告这些信息。你可以传入database_idfile_id。如果你对这2个值都提供NULL值的话,你会得到SQL Server实例(数据和日志)所有查询相关文件的延迟统计。

对于这个DMF最重要的是io_stall_read_msio_stall_write_ms列。自上次SQL Server重启后,对你的存储进行读写操作所发生的累积延迟时间。如果你把这2个值除以num_of_read和num_of_writes列,你就得到从SQL Server角度来说,对于磁盘读写的平均延迟时间。这对于你的存储子系统的故障排除非常方便。

如果这个DMF报告非常高的延迟时间,你不应该简单的跑到存储供应商那里并买更快的存储。第一步你总要想下为什么你有这么高的延迟时间。当我在不同的系统上使用这个DMF时,TempDb总会报告很高的延时。但这也不意味着你要把TempDb移到更快的存储,例如SSD硬盘。第一步总要思考下,对于你特定的数据库“为什么”你有这么高的延迟时间。如果是TempDb的话你可以尝试最小化TempDb的使用——例如应用合理的索引策略来摆脱执行计划里的排序和哈希运算符,这2个运算符会蔓延到TempDb。

等待统计和I/O延迟统计直报告你症状,你的任务是找出性能问题的内在根源,分析它,最后解决它。

小结

在今天的性能调优培训里我们详细讨论了SQL Server里的等待统计和I/O延迟统计。对于性能监控和故障排除来说,这2个DMVs/DMFs非常重要,因为你从中可以找出SQL Server当前在哪些领域有性能问题。下周我们会详细谈下TempDB,我把它叫做SQL Server的公共厕所。请继续关注!

围观PPT:

1123_22_等待统计.rar

第22/24周 等待和I/O延迟统计的更多相关文章

  1. 第21/24周 性能监控(PAL工具)

    大家好,欢迎来到性能调优培训的最后一个月.在过去的5个月里,我们谈了SQL Server的各种性能相关的话题,包括性能调优的技术和问题. 但当在你面前,SQL Server没有按你预想的运行时,你会怎 ...

  2. 第0/24周 SQL Server 性能调优培训引言

    大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...

  3. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  4. 分享Kali Linux 2017年第24周镜像文件

     分享Kali Linux 2017年第24周镜像文件  Kali Linux官方于6月11日发布2017年的第24周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KD ...

  5. 第1/24周 SQL Server 如何执行一个查询

    大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Server如何执行一个查询来建立基础.这个部分非常重要, ...

  6. GitHub 官方大动作频频「GitHub 热点速览 v.22.24」

    作者:HelloGitHub-小鱼干 本周 GitHub 官方 Blog 很是热闹,GitHub 官方大动作频频也带来了 GitHub Blog 的频繁更新,除了本周 News 快读收录的 GitHu ...

  7. 第4/24周 页面限制8060 bytes

    恭喜您!在你面前就只剩下几页了,然后你就可以完成第1个月的SQL Server性能调优培训了.今天我将讲下页的一些限制,还有为什么你会喜欢这些限制,同时也会讨厌这些限制. 正如你在第2周学到的,数据页 ...

  8. 第20/24周 死锁(Deadlocking)

    大家好,欢迎回到性能调优培训.今天讨论SQL Server里的死锁(Deadlocking),第5个月的培训就结束了.当2个查询彼此等待,没有查询可以继续它的工作就会发生死锁.第一步我会概括介绍下SQ ...

  9. 【网络流24题】 No.22~24

    接下来几题就写写题解吧.不是很想打了. 22. 输入文件示例input.txt4 21 2 7 36 5 8 37 8 10 59 6 13 9 输出文件示例output.txt17 最长不相交路径. ...

随机推荐

  1. [leetcode 37]sudoku solver

    1 题目: 根据给出的数独,全部填出来 2 思路: 为了做出来,我自己人工做了一遍题目给的数独.思路是看要填的数字横.竖.子是否已经有1-9的数字,有就剔除一个,最后剩下一个的话,就填上.一遍一遍的循 ...

  2. 解剖SQLSERVER 第十三篇 Integers在行压缩和页压缩里的存储格式揭秘(译)

    解剖SQLSERVER 第十三篇    Integers在行压缩和页压缩里的存储格式揭秘(译) http://improve.dk/the-anatomy-of-row-amp-page-compre ...

  3. Service简介

    Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过<service>来声明.可以通过contect.startservice ...

  4. 千呼万唤始出来!—— GG(高仿QQ)终于有移动端了!(技术原理、实现、源码)

    首先要感谢大家一直以来对于GG的关注和支持!GG的不断完善与大家的支持分不开! 从2013年最初的GG1.0,到后来陆续增加了网盘功能.远程协助功能.离线文件功能.群聊功能.语音聊天功能.视频聊天功能 ...

  5. objective-c(协议)

    objective-c中不支持多重继承,其替代方案为Protocal(协议),下面给出一个基本实例: 定义一个协议 @protocol MyProtocal <NSObject> //协议 ...

  6. java提高篇(二九)-----Vector

    在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...

  7. [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar

    在做安卓UI的时候有时候需自定义具有动画效果的按钮或需要自定义一下actionbar~ 本节用一个简单的demo讲如何自定义具有动画效果的按钮,以及个性化的actionbar 下面是效果: 其中: △ ...

  8. [硬件项目] 2、汽车倒车雷达设计——基于专用倒车雷达芯片GM3101的设计方案与采用CX20106A红外线检测芯片方案对比

    前言 尽管每辆汽车都有后视镜,但不可避免地都存在一个后视镜的盲区,倒车雷达则可一定程度帮助驾驶员扫除视野死角和视线模糊的缺陷,提高驾驶安全性.上一节已经分析清倒车雷达的语音模块(上一节),本节将深入分 ...

  9. Yii CModel中rules验证规则[转]

    array( array(‘username’, ‘required’), array(‘username’, ‘length’, ‘min’=>3, ‘max’=>12), array( ...

  10. synchronized同步对象锁

    package com.system.util; import com.common.Constants; import com.util.Cache; /** * 创建同步对象锁 * * @auth ...