="t18">像 SQL Server 这样
![](/icons/49540de.gif)
数据库管理系统依赖于文件输入/输出操作
![](/icons/49540de.gif)
及时进行
![](/icons/49540dou2.gif)
有故障或配置不当
![](/icons/49540de.gif)
硬件、固件设置、筛选器驱动
![](/icons/49540chengxu.gif)
、压缩、
![](/icons/49540chengxu.gif)
![](/icons/49540cuowu.gif)
以及 I/O 路径内
![](/icons/49540de.gif)
其他情况都可能导致阻塞或延迟 I/O 问题
![](/icons/49540dou.gif)
并且很快对 SQL Server 性能产生消极影响
上述问题对 SQL Server
![](/icons/49540de.gif)
影响因问题细节
![](/icons/49540de.gif)
区别而差异很大
![](/icons/49540dou.gif)
但它们通常导致阻塞、锁存器争用和超时、过长
![](/icons/49540de.gif)
响应时间以及资源
![](/icons/49540de.gif)
过度利用
阻塞 I/O 是指必须进行外部干预才能完成
![](/icons/49540de.gif)
I/O 请求(通常是 I/O 请求包 (IRP))
![](/icons/49540dou2.gif)
这种状况通常需要执行完整
![](/icons/49540de.gif)
系统重新启动或类似操作才能解决
![](/icons/49540dou.gif)
并且强烈表明硬件有故障或者在 I/O 路径组件中存在
![](/icons/49540chengxu.gif)
![](/icons/49540cuowu.gif)
延迟 I/O 是指无需干预即可完成但所花时间超过预期时间
![](/icons/49540de.gif)
I/O 请求(同样
![](/icons/49540dou.gif)
这通常是 IRP)
![](/icons/49540dou2.gif)
这种状况
![](/icons/49540de.gif)
原因通常是硬件配置、固件设置或筛选器驱动
![](/icons/49540chengxu.gif)
干预
![](/icons/49540dou.gif)
需要硬件或软件Software供应商提供帮助以便跟踪和解决
SQL Server 2000 SP4 包含数据库和日志文件 I/O(读和写)逻辑以便检测延迟和阻塞状况
![](/icons/49540dou2.gif)
当 I/O 操作经过 15 秒钟或更长时间仍未完成时
![](/icons/49540dou.gif)
SQL Server 会检测到并报告这
![](/icons/49540yi.gif)
状况
![](/icons/49540dou2.gif)
以下消息将被记录到 SQL Server
![](/icons/49540cuowu.gif)
日志中:
2007-11-1 00:21:25.26 spid1 SQL Serverhas encountered 192
occurrence(s) of IO requests taking longer than 15 seconds to complete
on file [E:\SEDATA\stressdb5.ndf] in database [stressdb] (7). The OS
file handle is 0x00000000000074D4. The off
![](/icons/49540set.gif)
of the latest long IO is:
x00000000022000".
该消息表明
![](/icons/49540dou.gif)
当前工作负载需求超出了 I/O 路径或当前系统配置和功能
![](/icons/49540dou.gif)
或者 I/O 路径含有不能正常工作
![](/icons/49540de.gif)
软件Software(固件、驱动
![](/icons/49540chengxu.gif)
)或硬件组件
所记录
![](/icons/49540de.gif)
![](/icons/49540cuowu.gif)
信息提供了以下信息:
• ### occurrences — 未能在 15 秒钟以内完成读或写操作
![](/icons/49540de.gif)
I/O 请求
![](/icons/49540de.gif)
数量
• File information — 完整
![](/icons/49540de.gif)
文件名、数据库名和受影响文件
![](/icons/49540de.gif)
DBID
• File handle — 该文件
![](/icons/49540de.gif)
操作系统句柄
![](/icons/49540dou2.gif)
可以通过调试器和其他实用工具来使用这
![](/icons/49540yi.gif)
信息跟踪 IRP 请求
• Off
![](/icons/49540set.gif)
— 上
![](/icons/49540yi.gif)
个阻塞或延迟 I/O
![](/icons/49540de.gif)
偏移量
![](/icons/49540dou2.gif)
可以通过调试器和其他实用工具来使用这
![](/icons/49540yi.gif)
信息跟踪 IRP 请求
![](/icons/49540dou2.gif)
(注:在记录该消息
![](/icons/49540de.gif)
时候
![](/icons/49540dou.gif)
该 I/O 可能不再阻塞或延迟
![](/icons/49540dou2.gif)
)
记录和报告
I/O
![](/icons/49540de.gif)
报告和记录是按照文件执行
![](/icons/49540de.gif)
![](/icons/49540dou2.gif)
延迟和阻塞 I/O 请求
![](/icons/49540de.gif)
检测和报告是两个区别
![](/icons/49540de.gif)
操作
检测(记录)是在 SQL Server 内部
![](/icons/49540de.gif)
两个位置处理
![](/icons/49540de.gif)
![](/icons/49540dou2.gif)
第
![](/icons/49540yi.gif)
个位置是在 I/O 实际完成
![](/icons/49540de.gif)
时候
![](/icons/49540dou2.gif)
如果请求花费了 15 秒钟以上
![](/icons/49540dou.gif)
则发生记录操作
![](/icons/49540dou2.gif)
第 2个位置是在延迟写入器进程执行
![](/icons/49540de.gif)
时候
![](/icons/49540dou2.gif)
当延迟写入器执行时
![](/icons/49540dou.gif)
它包含新
![](/icons/49540de.gif)
对所有挂起
![](/icons/49540de.gif)
数据和日志文件 I/O 请求进行检查
![](/icons/49540de.gif)
操作
![](/icons/49540dou.gif)
并且
![](/icons/49540dou.gif)
如果已经超过了 15 秒钟
![](/icons/49540de.gif)
阈值
![](/icons/49540dou.gif)
则会发生记录操作
报告是按照不低于 5 分钟
![](/icons/49540de.gif)
时间间隔执行
![](/icons/49540de.gif)
![](/icons/49540dou2.gif)
当对文件进行下
![](/icons/49540yi.gif)
次 I/O 请求时
![](/icons/49540dou.gif)
发生报告操作
![](/icons/49540dou2.gif)
如果记录操作已经发生
![](/icons/49540dou.gif)
并且自上
![](/icons/49540yi.gif)
次报告发生以来已经过去了 5 分钟或更长时间
![](/icons/49540dou.gif)
则向
![](/icons/49540cuowu.gif)
日志中写入新
![](/icons/49540de.gif)
报告(上面显示
![](/icons/49540de.gif)
![](/icons/49540cuowu.gif)
消息)
![](/icons/49540dou2.gif)
15 秒钟
![](/icons/49540de.gif)
阈值当前是不可调整
![](/icons/49540de.gif)
![](/icons/49540dou2.gif)
尽管不推荐这样做
![](/icons/49540dou.gif)
但您可以用跟踪标志 830 完全禁用延迟和阻塞 I/O 检测
![](/icons/49540dou2.gif)
在 SQL Server 启动期间设置启动参数 –T830 可以禁用延迟/阻塞 I/O 检测
![](/icons/49540dou2.gif)
使用 dbcc traceon(830, -1) 可以禁用对当前正在运行
![](/icons/49540de.gif)
SQL Server 例子
![](/icons/49540de.gif)
检测
![](/icons/49540dou2.gif)
只有重新启动 SQL Server
![](/icons/49540dou.gif)
Dbcc traceon 才会生效
注:延迟或阻塞
![](/icons/49540de.gif)
给定 I/O 请求只会报告
![](/icons/49540yi.gif)
次
![](/icons/49540dou2.gif)
如果消息报告 10 个 I/O 被延迟
![](/icons/49540dou.gif)
则这 10 个报告不会再次发生
![](/icons/49540dou2.gif)
如果下
![](/icons/49540yi.gif)
个消息报告 15 个 I/O 被阻塞
![](/icons/49540dou.gif)
则表明 15 个新
![](/icons/49540de.gif)
I/O 请求已经被延迟
性能和计划操作
总体系统性能可能在 I/O 处理中扮演关键
![](/icons/49540de.gif)
角色
![](/icons/49540dou2.gif)
在研究延迟或阻塞 I/O
![](/icons/49540de.gif)
报告时
![](/icons/49540dou.gif)
应该考虑系统
![](/icons/49540de.gif)
综合运行状况
![](/icons/49540dou2.gif)
过多
![](/icons/49540de.gif)
负载可能导致整个系统(包括 I/O 处理)变慢
![](/icons/49540dou2.gif)
系统在发生问题时
![](/icons/49540de.gif)
行为可能是确定问题根源
![](/icons/49540de.gif)
关键所在
![](/icons/49540dou2.gif)
例如
![](/icons/49540dou.gif)
如果 CPU 利用率在发生问题时变高或者保持较高水平
![](/icons/49540dou.gif)
则可能表明系统中
![](/icons/49540de.gif)
某个进程正在消耗如此的多
![](/icons/49540de.gif)
CPU 时间
![](/icons/49540dou.gif)
以至于它以各种方式对其他进程产生了消极影响
请查看性能计数器 Average Disk Sec/Transfer 以及 Average Disk Queue Length 或 Current Disk Queue Length
![](/icons/49540dou.gif)
以获得特定
![](/icons/49540de.gif)
I/O 路径信息
![](/icons/49540dou2.gif)
例如
![](/icons/49540dou.gif)
SQL Server 计算机上
![](/icons/49540de.gif)
Average Disk Sec/Transfer 通常低于 15ms
![](/icons/49540dou2.gif)
如果该值上升
![](/icons/49540dou.gif)
则可能表明 I/O 子系统无法满足 I/O 要求
请记住
![](/icons/49540dou.gif)
SQL Server 充分利用了 Windows
![](/icons/49540de.gif)
异步 I/O 功能
![](/icons/49540dou.gif)
并且猛烈地扩展磁盘队列长度
![](/icons/49540dou.gif)
因此上述性能计数器具有较高
![](/icons/49540de.gif)
值本身并不表明存在问题
索引和并行性
特别常见
![](/icons/49540de.gif)
![](/icons/49540yi.gif)
种情况是
![](/icons/49540dou.gif)
![](/icons/49540yinwei.gif)
索引丢失以及由此导致
![](/icons/49540de.gif)
扫描、哈希和排序对 I/O 系统造成
![](/icons/49540de.gif)
压力
![](/icons/49540dou.gif)
所以突发大量
![](/icons/49540de.gif)
I/O
![](/icons/49540dou2.gif)
运行
![](/icons/49540yi.gif)
遍“Index Turning Wizard”通常会有助于解决系统
![](/icons/49540de.gif)
I/O 压力
![](/icons/49540dou2.gif)
如果添加索引可以帮助查询避免表扫描甚至排序或哈希
![](/icons/49540dou.gif)
则系统可以获得多个优点:
• 减少完成操作所需
![](/icons/49540de.gif)
物理 I/O
![](/icons/49540dou.gif)
这直接等效于提高查询
![](/icons/49540de.gif)
性能
• 数据缓存Cache中只有较少
![](/icons/49540de.gif)
页面必须周转
![](/icons/49540dou.gif)
因此缓存Cache中
![](/icons/49540de.gif)
那些页面可以
![](/icons/49540yi.gif)
直和活动查询相关
• 避免不必要
![](/icons/49540de.gif)
排序和哈希
• 可以降低 tempdb 利用率和减少争用情况
• 减少资源利用率和/或并行操作
![](/icons/49540dou2.gif)
![](/icons/49540yinwei.gif)
SQL Server 不能保证服务器在确定是否将查询并行化时考虑并行查询执行和系统中
![](/icons/49540de.gif)
负载
![](/icons/49540dou.gif)
所以您最好针对串行执行优化所有查询
![](/icons/49540dou2.gif)
在 Q/A 环境中
![](/icons/49540dou.gif)
应该将 max degree of parallelism 设置为 1
![](/icons/49540dou.gif)
以便对根本没有从服务器收到任何并行计划
![](/icons/49540de.gif)
最糟糕情况强行进行调整
![](/icons/49540dou2.gif)
如果在测试环境中证实查询可以按串行方式高效执行
![](/icons/49540dou.gif)
则生产环境中
![](/icons/49540de.gif)
并行计划可以提供出乎意料
![](/icons/49540de.gif)
性能改进
![](/icons/49540dou2.gif)
但是
![](/icons/49540dou.gif)
很多情况下
![](/icons/49540dou.gif)
SQL Server 选择并行执行
![](/icons/49540dou.gif)
这是
![](/icons/49540yinwei.gif)
要遍历数据
![](/icons/49540de.gif)
绝对数量过于庞大
![](/icons/49540dou2.gif)
该数据量通常直接受到索引
![](/icons/49540de.gif)
影响
![](/icons/49540dou2.gif)
例如
![](/icons/49540dou.gif)
如果丢失索引
![](/icons/49540dou.gif)
则可能产生大量排序操作
![](/icons/49540dou2.gif)
我们很容易就可以看出
![](/icons/49540dou.gif)
执行排序操作
![](/icons/49540de.gif)
多个辅助进程如何使响应速度比以串行方式处理排序更快速
![](/icons/49540dou.gif)
不过我们需要了解
![](/icons/49540dou.gif)
该操作可能大幅增加 I/O 系统
![](/icons/49540de.gif)
压力
![](/icons/49540dou2.gif)
当多个辅助进程并发运行时
![](/icons/49540dou.gif)
来自多个辅助进程
![](/icons/49540de.gif)
大型读请求可能导致 I/O 突发以及 CPU 利用率提高
![](/icons/49540dou2.gif)
很多时候
![](/icons/49540dou.gif)
如果添加了索引或者发生了其他调整操作
![](/icons/49540dou.gif)
则可以调整查询以使其更快地运行并使用更少
![](/icons/49540de.gif)
资源
![](/icons/49540dou2.gif)
这不仅提高了相关查询
![](/icons/49540de.gif)
性能
![](/icons/49540dou.gif)
而且还提高了系统
![](/icons/49540de.gif)
整体性能
![](/icons/49540dou2.gif)
来自 Microsoft SQL Server Support
![](/icons/49540de.gif)
实际举例
Microsoft SQL Server 和 Platforms Escalation Support 已经处理了下列方案
![](/icons/49540dou.gif)
这些方案旨在提供
![](/icons/49540yi.gif)
个参考框架
![](/icons/49540dou.gif)
并且帮助树立有关延迟和阻塞 I/O 情况以及系统可能如何受到影响
![](/icons/49540de.gif)
预期
![](/icons/49540dou2.gif)
不存在给其他软硬件带来任何特殊或更高风险
![](/icons/49540de.gif)
特殊硬件或驱动
![](/icons/49540chengxu.gif)
集;在这个方面
![](/icons/49540dou.gif)
所有系统都是相同
![](/icons/49540de.gif)
举例 1 — 阻塞 45 秒钟
![](/icons/49540de.gif)
日志写操作:
![](/icons/49540yi.gif)
个尝试性
![](/icons/49540de.gif)
SQL Server 日志文件写操作周期性地阻塞 45 秒钟
![](/icons/49540dou2.gif)
该日志写操作无法及时完成
![](/icons/49540dou.gif)
从而产生阻塞情况
![](/icons/49540dou.gif)
导致 30 秒钟
![](/icons/49540de.gif)
客户端查询超时
请求被提交并阻塞(日志写挂起)
![](/icons/49540dou.gif)
导致查询继续占用锁并且阻塞来自其他客户端
![](/icons/49540de.gif)
传入请求
![](/icons/49540dou2.gif)
其他客户端开始超时并且使问题变得复杂
![](/icons/49540dou.gif)
这是
![](/icons/49540yinwei.gif)
应用
![](/icons/49540chengxu.gif)
没有被设计为在发生超时
![](/icons/49540de.gif)
时候回滚尚未解决
![](/icons/49540de.gif)
事务
![](/icons/49540dou2.gif)
这会导致数以百计尚未解决
![](/icons/49540de.gif)
事务占用锁以及严重
![](/icons/49540de.gif)
阻塞
![](/icons/49540dou2.gif)
(有关事务处理和阻塞
![](/icons/49540de.gif)
详细信息
![](/icons/49540dou.gif)
请参阅 INF: Understanding and Resolving SQLServer 7.0 or 2000 Blocking Problems)
![](/icons/49540dou2.gif)
应用
![](/icons/49540chengxu.gif)
使用连接池来维护 Web 站点
![](/icons/49540dou.gif)
因此
![](/icons/49540dou.gif)
随着更多
![](/icons/49540de.gif)
连接被阻塞
![](/icons/49540dou.gif)
Web 站点创建了更多
![](/icons/49540de.gif)
连接
![](/icons/49540dou.gif)
而这些连接又会被阻塞
![](/icons/49540dou.gif)
该循环会
![](/icons/49540yi.gif)
直持续下去
在大约 45 秒钟的后
![](/icons/49540dou.gif)
该日志写操作将完成
![](/icons/49540dou.gif)
但到此时为止
![](/icons/49540dou.gif)
数以百计
![](/icons/49540de.gif)
连接已经积累起来
![](/icons/49540dou.gif)
从而导致阻塞问题
![](/icons/49540dou.gif)
并使得 SQL Server 和应用
![](/icons/49540chengxu.gif)
需要花费几分钟
![](/icons/49540de.gif)
时间进行恢复
![](/icons/49540dou2.gif)
当和应用
![](/icons/49540chengxu.gif)
问题结合起来
![](/icons/49540de.gif)
时候
![](/icons/49540dou.gif)
延迟 I/O 状况会对系统产生非常消极
![](/icons/49540de.gif)
影响
解决办法:这归因于 HBA 驱动
![](/icons/49540chengxu.gif)
中
![](/icons/49540de.gif)
延迟 I/O 请求
![](/icons/49540dou2.gif)
计算机具有多个带有故障转移支持
![](/icons/49540de.gif)
HBA 卡
![](/icons/49540dou2.gif)
故障转移超时值被配置为 45 秒
![](/icons/49540dou2.gif)
当
![](/icons/49540yi.gif)
个 HBA 落后或者在 45 秒钟或更长时间内未和 SAN 通信时
![](/icons/49540dou.gif)
该 I/O 请求被路由到第 2个 HBA 进行处理
![](/icons/49540dou.gif)
并且会很快完成
![](/icons/49540dou2.gif)
硬件产品
![](/icons/49540de.gif)
推荐故障转移设置为 5 秒钟
![](/icons/49540dou.gif)
以便避免出现这样
![](/icons/49540de.gif)
延迟状况
如果在 SQL Server 2000 SP4 中已经有了新
![](/icons/49540de.gif)
自动报告该状况
![](/icons/49540de.gif)
功能
![](/icons/49540dou.gif)
那么我们在疑难解答过程中就可以很快知道
![](/icons/49540dou.gif)
基本问题是由于 SQL Server 外部
![](/icons/49540de.gif)
问题而发生
![](/icons/49540de.gif)
阻塞或延迟 I/O 操作
![](/icons/49540dou2.gif)
事实上
![](/icons/49540dou.gif)
我们花费了大量时间来解决
![](/icons/49540yi.gif)
个在最初呈现为普通性能问题
![](/icons/49540de.gif)
问题
举例 2 — 筛选器驱动
![](/icons/49540chengxu.gif)
干预:
许多防病毒软件Software和备份产品使用 I/O 筛选器驱动
![](/icons/49540chengxu.gif)
![](/icons/49540dou2.gif)
这些筛选器驱动
![](/icons/49540chengxu.gif)
成为 I/O 请求栈
![](/icons/49540de.gif)
![](/icons/49540yi.gif)
部分
![](/icons/49540dou.gif)
并且可以访问 IRP 请求
![](/icons/49540dou2.gif)
Microsoft 技术支持部门已经遇见过各种问题 — 从导致阻塞 I/O
![](/icons/49540de.gif)
![](/icons/49540cuowu.gif)
到筛选器驱动
![](/icons/49540chengxu.gif)
实现中
![](/icons/49540de.gif)
延迟状况
其中
![](/icons/49540dou.gif)
Microsoft SQL Server 技术支持部门遇到
![](/icons/49540de.gif)
![](/icons/49540yi.gif)
种情况是
![](/icons/49540dou.gif)
涉及到用于备份处理(该过程能够备份在备份时处于打开状态
![](/icons/49540de.gif)
文件)
![](/icons/49540de.gif)
筛选器驱动
![](/icons/49540chengxu.gif)
![](/icons/49540dou2.gif)
系统管理员
![](/icons/49540cuowu.gif)
地在文件备份选择中包括了 SQL Server 数据文件目录
![](/icons/49540dou2.gif)
当备份发生时
![](/icons/49540dou.gif)
它试图收集备份开始时文件
![](/icons/49540de.gif)
![](/icons/49540yi.gif)
致镜像
![](/icons/49540dou2.gif)
在完成该操作时
![](/icons/49540dou.gif)
它将延迟后续
![](/icons/49540de.gif)
I/O 请求
![](/icons/49540dou.gif)
使它们能够在软件Software处理它们时逐个完成
当备份开始时
![](/icons/49540dou.gif)
SQL Server
![](/icons/49540de.gif)
性能会急剧下降
![](/icons/49540dou.gif)
![](/icons/49540yinwei.gif)
针对 SQL Server
![](/icons/49540de.gif)
I/O 被强迫逐个完成
![](/icons/49540dou2.gif)
使该问题变得更为复杂
![](/icons/49540de.gif)
是
![](/icons/49540dou.gif)
单 I/O 逻辑
![](/icons/49540de.gif)
特点使得 I/O 通常无法异步执行
![](/icons/49540dou.gif)
因此当 SQL Server 期望发送 I/O 请求并继续工作时
![](/icons/49540dou.gif)
UMS 辅助进程却在 I/O 完成的前
![](/icons/49540yi.gif)
直阻塞在读或写
![](/icons/49540diaoyong.gif)
中
![](/icons/49540dou2.gif)
SQL Server 预读功能实际上被筛选器驱动
![](/icons/49540chengxu.gif)
![](/icons/49540de.gif)
操作禁用了
![](/icons/49540dou2.gif)
而且
![](/icons/49540dou.gif)
即使当备份完成时
![](/icons/49540dou.gif)
筛选器驱动
![](/icons/49540chengxu.gif)
中
![](/icons/49540de.gif)
另
![](/icons/49540yi.gif)
个
![](/icons/49540chengxu.gif)
![](/icons/49540cuowu.gif)
仍然使单 I/O 行为保持不变
![](/icons/49540dou2.gif)
恢复 SQL Server 性能
![](/icons/49540de.gif)
唯
![](/icons/49540yi.gif)
思路方法是关闭数据库并重新打开它或者重新启动 SQL Server
![](/icons/49540dou.gif)
以便在当前筛选器驱动
![](/icons/49540chengxu.gif)
交互未就绪
![](/icons/49540de.gif)
情况下释放并重新获取文件句柄
解决办法:将 SQL Server
![](/icons/49540de.gif)
数据文件从文件备份过程中排除
![](/icons/49540dou.gif)
并且解决筛选器驱动
![](/icons/49540chengxu.gif)
中
![](/icons/49540de.gif)
导致文件被置于单 I/O 模式
![](/icons/49540de.gif)
![](/icons/49540chengxu.gif)
![](/icons/49540cuowu.gif)
举例 3 — 隐藏
![](/icons/49540de.gif)
![](/icons/49540cuowu.gif)
:
很多高端系统具有用于处理负载平衡
![](/icons/49540de.gif)
多通道 I/O 路径以及类似
![](/icons/49540de.gif)
工具
![](/icons/49540dou2.gif)
Microsoft SQL Server 技术支持部门已经见过使用此类软件Software
![](/icons/49540de.gif)
情况
![](/icons/49540dou.gif)
其中
![](/icons/49540dou.gif)
尽管 I/O 请求失败
![](/icons/49540dou.gif)
但软件Software确实正确地处理了
![](/icons/49540cuowu.gif)
状况
![](/icons/49540dou.gif)
并且执行了无数次重试
![](/icons/49540dou2.gif)
I/O 被阻塞
![](/icons/49540dou.gif)
并且 SQL Server 无法完成指定
![](/icons/49540de.gif)
操作
![](/icons/49540dou2.gif)
和上面描述
![](/icons/49540de.gif)
日志写状况非常类似
![](/icons/49540dou.gif)
在这样
![](/icons/49540de.gif)
状况对系统产生了消极影响的后
![](/icons/49540dou.gif)
发生了很多糟糕
![](/icons/49540de.gif)
系统行为
解决办法:在类似情况下
![](/icons/49540dou.gif)
重新启动 SQL Server 可以在
![](/icons/49540yi.gif)
定程度上缓解问题
![](/icons/49540dou.gif)
但是
![](/icons/49540dou.gif)
有时需要重新启动 Windows 来使处理恢复到正常状态
![](/icons/49540dou2.gif)
当然
![](/icons/49540dou.gif)
I/O 子系统中
![](/icons/49540de.gif)
![](/icons/49540chengxu.gif)
![](/icons/49540cuowu.gif)
最终需要由 I/O 供应商解决
SQL Server 2000 SP4
![](/icons/49540de.gif)
新
![](/icons/49540de.gif)
对此类状况进行自动报告
![](/icons/49540de.gif)
功能使得类似问题
![](/icons/49540de.gif)
检测变得更加容易
![](/icons/49540dou2.gif)
我们不仅可以看到整个服务器
![](/icons/49540de.gif)
总体性能下降
![](/icons/49540dou.gif)
而且还可以通过 SP4 所记录
![](/icons/49540de.gif)
新消息洞察问题
![](/icons/49540de.gif)
本质
![](/icons/49540dou.gif)
并且知道该问题很可能出在 SQL Server 外部
举例 4 — 远程存储/镜像/RAID 驱动器:
很多系统使用镜像或类似
![](/icons/49540de.gif)
技术来帮助防止丢失数据
![](/icons/49540dou2.gif)
其中
![](/icons/49540yi.gif)
些系统是基于软件Software
![](/icons/49540de.gif)
![](/icons/49540dou.gif)
而其他系统是基于硬件
![](/icons/49540de.gif)
![](/icons/49540dou2.gif)
Microsoft SQL Server 技术支持部门经常遇到
![](/icons/49540de.gif)
和这些系统有关
![](/icons/49540de.gif)
情况是延迟增加
当针对镜像
![](/icons/49540de.gif)
I/O 必须在 I/O 操作被视为完成的前成功完成时
![](/icons/49540dou.gif)
这显然会增加总体 I/O 时间
![](/icons/49540dou2.gif)
对于远程镜像安装
![](/icons/49540dou.gif)
网络延迟和重试可能成为
![](/icons/49540yi.gif)
个不利原因
![](/icons/49540dou2.gif)
当发生驱动器故障并且 RAID 子系统重新生成时
![](/icons/49540dou.gif)
I/O 吞吐量可能会受到影响
解决办法:在类似情况下
![](/icons/49540dou.gif)
我们通常建议使用严格
![](/icons/49540de.gif)
配置设置(这随供应商和设备而异)
![](/icons/49540dou.gif)
以减少镜像延迟和 RAID 重新生成操作
RAID 系统开销和延迟可能导致 I/O 变慢
![](/icons/49540dou.gif)
而 SQL Server 对此无能为力
![](/icons/49540dou2.gif)
就像任何其他应用
![](/icons/49540chengxu.gif)
![](/icons/49540yi.gif)
样
![](/icons/49540dou.gif)
它是 RAID 硬件和驱动
![](/icons/49540chengxu.gif)
![](/icons/49540de.gif)
客户端
![](/icons/49540dou2.gif)
当该类型
![](/icons/49540de.gif)
问题使服务器
![](/icons/49540de.gif)
速度过度降低时
![](/icons/49540dou.gif)
SP4 中新
![](/icons/49540de.gif)
延迟和阻塞 I/O 报告功能有助于查明问题所在
举例 5 — 压缩:
Microsoft 不在压缩驱动器上支持 SQL Server 7.0 或 2000 数据和日志文件
![](/icons/49540dou2.gif)
NTFS 压缩是不安全
![](/icons/49540de.gif)
![](/icons/49540dou.gif)
这不仅是
![](/icons/49540yinwei.gif)
它破坏了预写日志 (WAL) 协议
![](/icons/49540dou.gif)
而且还
![](/icons/49540yinwei.gif)
它要求对每个 I/O 请求执行更多
![](/icons/49540de.gif)
处理
![](/icons/49540dou2.gif)
压缩禁止了异步 I/O
![](/icons/49540dou.gif)
从而导致所有带有受影响数据或日志文件
![](/icons/49540de.gif)
SQL Server I/O 都被同步执行
解决办法:在这种情况下
![](/icons/49540dou.gif)
我们总是建议客户解压缩他们
![](/icons/49540de.gif)
数据和日志文件
NTFS 压缩可能导致 I/O 变慢
![](/icons/49540dou.gif)
而 SQL Server 对此无能为力
![](/icons/49540dou2.gif)
就像任何其他用户模式应用
![](/icons/49540chengxu.gif)
![](/icons/49540yi.gif)
样
![](/icons/49540dou.gif)
它是文件系统
![](/icons/49540de.gif)
客户端
![](/icons/49540dou2.gif)
当压缩对 SQL Server I/O 操作产生不利影响时
![](/icons/49540dou.gif)
SP4 中新
![](/icons/49540de.gif)
延迟和阻塞 I/O 报告功能有助于查明问题所在
附加数据点
系统进程中提供
![](/icons/49540de.gif)
等待类型信息可能有助于诊断 I/O 瓶颈
![](/icons/49540dou2.gif)
缓冲区 I/O 锁存器等待类型和写日志等待是调查 I/O 路径性能
![](/icons/49540de.gif)
关键指标
![](/icons/49540dou2.gif)
Microsoft 知识库文章 822101: The waittype and lastwaittype fields in the sysprocesses table 概述了等待类型
![](/icons/49540dou.gif)
并且详细介绍了和诊断延迟或阻塞 I/O 状况有关
![](/icons/49540de.gif)
I/O 等待类型