高磁盘 I/0 问题

K09*_*K09 1 sql-server-2008-r2

我们的数据库偶尔会出现此错误...“超时已过期。在操作完成之前超时时间已过或服务器没有响应。---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out在 System.Data.SqlClient.SqlInternalConnection.OnError"

我已经运行 perfmon 并得到以下结果。如何检查导致如此高磁盘 I/O 的原因?平均值 磁盘队列长度计数器(蓝色)非常高。

谢谢!

在此处输入图片说明 在此处输入图片说明

Mik*_*lsh 7

对于你提出的问题:

我不会单独依赖磁盘队列。事实上,我什至很少查看磁盘队列长度,除非我正在深入研究某个问题。最好查看磁盘的延迟。这些是平均值。磁盘 Sec/Read(或 /Write 和 /Transfer)计数器。这会告诉您从 Windows 的角度来看您的磁盘延迟是多少。因此,请求在发送到磁盘并带回之后所花费的时间.. 现在的磁盘队列并不能告诉您很多信息,因为大多数 IO 子系统都能够处理磁盘队列深度并且有多个主轴在您的 RAID 组中工作经常。最后 - 在这种情况下 - 您的磁盘队列长度看起来并没有那么糟糕。从这里看来,此屏幕截图(平均长度)时的最大值为 1.377。这在大多数 SQL Server 系统上都不算什么。看看你的实际延迟。另外,我不看 % Disk Time .. 我看的是空闲时间。那是一个更可靠的计数器,你只需要做一点数学就能读取它.. 闲置越多,活动越少。

你的问题背后的一般问题

我会从一个问题开始问这个问题——你为什么直接去找你的 IO?可能有很多事情导致您的速度变慢。在这里详尽地回答这个问题很困难,但要考虑/考虑一些高级别的事情:

  • 您是否遇到阻塞?我会下载SP_Whoisactive并在您收到这些错误时查看它。你看到阻塞了吗?您是否看到超时的请求背后的查询?持续时间是多少?
    • 您是否分析了您的 SQL Server等待统计数据以了解您等待的主要原因是什么?
    • 您知道哪些查询或查询导致超时吗?如果是这样,你能看看那些,看看是否有任何调整的空间?

这里可能还有很多其他的东西。这可能在连接或网络上。它可能是阻塞的,可能是需要进行索引调整和查询调整,也可能是您期望查询花费的时间比默认的 30 秒超时时间长,等等。

但我会尝试收集更多数据,然后选择一条下山的路。这是一个旧的白皮书,但它对通过等待进行性能调整非常有用。虽然会有 Tom 没有在本文中提到的新等待类型,但它仍然非常适用并且会帮助你。