当我直接在生产或 QA 数据库上更改或创建存储过程时,几秒钟后我开始遇到超时并且应用程序变得不可用。
日志文件显示此错误:
SQL Server 在数据库 [QA_Database] (9) 中的文件 [C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\QA_Database.ldf] 上遇到了 3 次耗时超过 15 秒的 I/O 请求。OS 文件句柄为 0x0000000000000568。最新长 I/O 的偏移量为:0x0000002821a200
我们安装了 SQL Server 2008 R2,包括最新的 Service Pack。生产环境和暂存环境完全分开。
我尝试在 QA 上重现此问题,但无济于事。我不知道这可能是什么问题。
答案1
非常简单。它就是这么说的:
SQL Server 已遇到 3 次 I/O 请求耗时超过 15 秒的情况
SQL Server 发出 IO 请求,需要 10 秒以上才能完成。通常,对于高性能数据库服务器,它应该需要 2-3 毫秒,而不是 15,000 毫秒或更长时间。
文件路径:
[C:\Program Files\Microsoft SQL
这让我觉得你没有生产服务器,但有人不知道如何安装 SQL Server,于是订购了硬件并进行了设置。结果,你的数据库文件位于(慢速?)系统驱动器上,而不是具有 IO 优化设置,并且你的磁盘完全超载。当在系统磁盘上运行高性能数据库而不是优化的磁盘布局时,就会发生这种情况。数据库服务器在硬件方面配置起来很棘手。
唯一的解决方案是:
- 检查缺失的索引。表扫描(尤其是当内存不足时)非常耗费 IO,并且会使每个 IO 子系统超载。
- 如果查询优化没有产生效果,那么就购买一台合适的数据库服务器,并配备一些速度更快的磁盘。最后,您的产品数据库可能需要比慢速系统驱动器提供的更多的 IOPS。
举个例子,我这里有一个较小的数据库(800gb),我使用 8 个 Velociraptor 作为 RAID 10 来存储数据库文件,使用 2x120gb SSD 来存储日志 - 这样可以很好地将日志 IO 与数据库 IO 区分开来。我对数据库文件磁盘 IO 不满意,很快就会升级到 SSD 缓存。
C 上不存在任何东西(除了使用率极低的系统数据库)。
事实上,你在 IO 相关问题上没有提到你的磁盘布局,这让我认为你不知道数据库在 IO 方面的工作方式,有人只是订购了一台便宜的戴尔服务器,认为“它有一个至强,所以它很快”,而数据库通常不关心 CPU 并且完全受 IO 限制。
答案2
该错误可能表示任何原因,从规格不足或硬件故障(我们刚遇到该错误,是连接 PowerVault 的电缆损坏),到数据库或 RAID 配置错误。
IO 延迟发生在您的事务日志文件上,我假设它与您的数据库位于同一阵列上。通过将两个小型驱动器配置为单独的 RAID-1(镜像)阵列并将事务日志移至那里,您应该会看到好处。