K09*_*K09 1 sql-server-2008-r2
我们的数据库偶尔会出现此错误...“超时已过期。在操作完成之前超时时间已过或服务器没有响应。---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out在 System.Data.SqlClient.SqlInternalConnection.OnError"
我已经运行 perfmon 并得到以下结果。如何检查导致如此高磁盘 I/O 的原因?平均值 磁盘队列长度计数器(蓝色)非常高。
谢谢!
对于你提出的问题:
我不会单独依赖磁盘队列。事实上,我什至很少查看磁盘队列长度,除非我正在深入研究某个问题。最好查看磁盘的延迟。这些是平均值。磁盘 Sec/Read(或 /Write 和 /Transfer)计数器。这会告诉您从 Windows 的角度来看您的磁盘延迟是多少。因此,请求在发送到磁盘并带回之后所花费的时间.. 现在的磁盘队列并不能告诉您很多信息,因为大多数 IO 子系统都能够处理磁盘队列深度并且有多个主轴在您的 RAID 组中工作经常。最后 - 在这种情况下 - 您的磁盘队列长度看起来并没有那么糟糕。从这里看来,此屏幕截图(平均长度)时的最大值为 1.377。这在大多数 SQL Server 系统上都不算什么。看看你的实际延迟。另外,我不看 % Disk Time .. 我看的是空闲时间。那是一个更可靠的计数器,你只需要做一点数学就能读取它.. 闲置越多,活动越少。
你的问题背后的一般问题
我会从一个问题开始问这个问题——你为什么直接去找你的 IO?可能有很多事情导致您的速度变慢。在这里详尽地回答这个问题很困难,但要考虑/考虑一些高级别的事情:
这里可能还有很多其他的东西。这可能在连接或网络上。它可能是阻塞的,可能是需要进行索引调整和查询调整,也可能是您期望查询花费的时间比默认的 30 秒超时时间长,等等。
但我会尝试收集更多数据,然后选择一条下山的路。这是一个旧的白皮书,但它对通过等待进行性能调整非常有用。虽然会有 Tom 没有在本文中提到的新等待类型,但它仍然非常适用并且会帮助你。