[%ls] (%d)
中文件 [%ls] 的、所需完成时间超过 %d 秒的 I/O 请求。 OS 文件句柄是 0x%p。 最新的长时间 I/O 操作的偏移量是: %#016I64x。Attribute | 值 |
---|---|
产品名称 | SQL Server |
事件 ID | 833 |
事件源 | MSSQLSERVER |
组件 | SQLEngine |
符号名称 | BUF_LONG_IO |
消息正文 | SQL Server 已 %d 次遇到了针对数据库 [%ls] (%d) 中文件 [%ls] 的、所需完成时间超过 %d 秒的 I/O 请求。 OS 文件句柄是 0x%p。 最新的长时间 I/O 操作的偏移量是: %#016I64x。 |
该消息指示 SQL Server 已从磁盘发出读取或写入请求,并且表明该请求返回所用的时间已超过 15 秒。 SQL Server报告此错误,并指示 I/O 子系统存在问题。 数据库管理系统 (DBMS) (如 SQL Server)依赖于文件输入和输出的及时性 (I/O) 操作。 以下任一项都可能导致 I/O 操作停滞或停止,并SQL Server响应能力和性能产生不利影响:
这些 I/O 问题可能会导致发生以下行为:
当 I/O 操作挂起 15 秒或更长时间时,SQL Server执行以下步骤:
检测操作已挂起。
将信息性消息写入SQL Server错误日志,如“详细信息”部分所述。
下表说明了此信息性消息的不同部分:
消息正文 | 说明 |
---|---|
<数量> () | 未在 15 秒内完成读取或写入操作的 I/O 请求数。 |
文件信息 | 完整的文件名、数据库名称和数据库标识 (DBID) 编号。 |
Handle | 文件的操作系统句柄。 可以将操作系统句柄与调试器或其他实用工具配合使用,以帮助跟踪 I/O 请求数据包 (IRP) 请求。 |
Offset | 上次停滞 I/O 操作或上次停止的 I/O 操作的偏移量。 可以将偏移量与调试器或其他实用工具配合使用,以帮助跟踪 IRP 请求。
注意: |
信息性消息指示当前负载可能遇到以下情况之一:
SQL Server记录它发起 I/O 请求的时间,并记录 I/O 完成的时间。 如果时间差为 15 秒或更长时间,则会检测到这种情况。 这也意味着SQL Server不是此消息描述和报告的延迟 I/O 条件的原因。 这种情况称为停止的 I/O。 大多数磁盘请求在磁盘的典型速度内发生。 此典型的磁盘速度通常称为磁盘查找时间。 大多数标准磁盘的磁盘寻道时间是 10 毫秒或更短。 因此,15 秒是系统 I/O 路径返回到SQL Server很长的时间。 有关更多详细信息,请参阅 “详细信息” 部分。
通过执行以下步骤排查此错误:
有关诊断和排查 I/O 问题导致的SQL Server性能问题的引导式演练,请参阅排查 I/O 问题导致的SQL Server性能缓慢问题。
I/O 停滞
停滞 I/O 定义为未完成的 I/O 请求。 I/O 停滞通常表示 IRP 停滞。 若要解决 I/O 停滞情况,通常必须重新启动计算机或执行类似的操作。 I/O 停滞条件通常表示以下问题之一:
停止的 I/O
停止的 I/O 定义为完成或需要很长时间才能完成的 I/O 请求。 由于以下原因之一,通常会发生 I/O 停止行为:
SQL Server支持部门每年处理许多涉及 I/O 卡住或停滞问题的案例。 这些 I/O 问题以不同的方式显示。 I/O 问题是一些最难诊断和调试的问题,它们需要大量的时间和资源才能从 Microsoft 和客户进行调试。 I/O 请求的报告和记录是按文件设计的。 检测和报告停滞的 I/O 请求是两个单独的操作。
录制
记录操作在SQL Server有两个时刻发生。 第一个是 I/O 操作完成的时间。 第二个时刻是延迟编写器运行时。 延迟编写器运行时,它会检查所有挂起的数据和挂起的日志文件 I/O 请求。 如果 I/O 请求超过 15 秒阈值,则会发生记录操作。
报告
报告的间隔为 5 分钟或更长。 对文件发出下一个 I/O 请求时,会发生报告。 如果发生了记录操作,并且自上次报告发生以来已超过五分钟,则详细信息部分中提到的信息性消息将写入SQL Server错误日志。
15 秒阈值不可调整。 但是,可以使用跟踪标志 830 禁用停止或停滞的 I/O 检测,尽管我们不建议这样做。
可以使用跟踪标志 833 禁用对停滞 I/O 的检测。 若要在每次启动SQL Server时启用此标志,请使用 -T830 启动参数。 若要对当前正在运行的SQL Server实例禁用检测,请使用以下语句:
dbcc traceon(830, -1)
此设置仅在SQL Server过程的生命周期内有效。
备注
停止或停滞的 I/O 请求仅报告一次。 例如,如果消息报告 10 个 I/O 请求已停止,则这 10 个报告不会再次出现。 如果下一条消息报告 15 个 I/O 请求已停止,则表示 15 个新的 I/O 请求已停止。
SQL Server使用标准 Microsoft Windows API 调用来读取和写入数据。 例如,SQL Server使用以下函数:
读取或写入请求由 Windows 作为 I/O 请求数据包处理, (IRP) 。 若要确定 IRP 的状态,请使用以下两项功能:
建议检查以下项的任何可用更新:
在执行其他调试操作之前,请与硬件供应商联系。 调试会话可能涉及第三方驱动程序、固件或筛选器驱动程序组件。
总的来说,系统性能在 I/O 处理中起着关键作用。 在调查 I/O 操作停止或停滞的报告时,应考虑系统的一般运行状况。 过多的负载可能会导致整个系统速度缓慢,包括 I/O 处理。 问题发生时系统的行为可能是确定问题根本原因的一个关键因素。 例如,如果在出现问题时 CPU 使用率增加或保持高位,则可能表明系统进程占用过多的 CPU,导致其他进程受到不利影响。
性能计数器
若要监视 I/O 性能,请检查以下性能计数器以获取特定 I/O 路径信息:
例如,运行 SQL Server 的计算机上的平均磁盘秒/传输时间通常小于 15 毫秒。 如果平均磁盘秒/传输值攀升,则表明 I/O 子系统无法以最佳方式跟上 I/O 需求。
使用性能计数器时要小心,因为SQL Server充分利用了大量推送磁盘队列长度的异步 I/O 功能。 因此,仅较长的磁盘队列长度并不表示存在问题。
在 Windows 系统监视器中,可以查看每个受影响磁盘的计数器“物理磁盘:磁盘字节数/秒”,并将活动速率与每个进程的计数器“进程:IO 数据字节/秒”和“进程:IO 其他字节/秒”进行比较。 执行此操作可以确定一组特定进程是否正在生成过多的 I/O 请求。 Process 对象中其他各种与 I/O 相关的计数器显示更精细的信息。 如果确定SQL Server实例导致服务器上的 I/O 负载过多,请参阅下一节,了解索引和并行度。 有关检测和解决 I/O 瓶颈的详细讨论,请参阅排查 I/O 问题导致的SQL Server性能缓慢问题。
索引和并行度
I/O 的突发通常是因为缺少索引而发生。 此行为可能会严重推送 I/O 路径。 使用索引转弯向导 (ITW) 的传递可能有助于解决系统上的 I/O 压力。 如果查询受益于索引而不是表扫描,或者如果它使用排序或哈希,则系统可以获得以下优势:
以下示例已由 SQL Server 支持和 Windows 升级支持处理。 这些示例旨在提供一个参考框架,并帮助设置你对停滞和停滞的 I/O 情况的期望。 它们还提供一个框架,用于了解系统可能受到的影响或响应方式。 没有特定硬件或驱动程序集对另一个硬件或驱动程序构成任何特定风险或增加的风险。 所有系统在这方面都是相同的。
示例 1:停滞 45 秒的日志写入
写入SQL Server日志文件的尝试会定期停滞约 45 秒。 日志写入未及时完成。 此行为会创建导致 30 秒客户端超时的阻塞条件。
应用程序已提交到 SQL Server,提交将停滞为日志写入挂起。 此行为导致查询继续持有锁并阻止来自其他客户端的传入请求。 然后,其他客户端开始超时。这加剧了此问题,因为应用程序不会回滚查询超时时打开的事务。 这会创建数百个持有锁的打开事务。 因此,会发生严重的阻塞情况。
有关事务处理和阻止的详细信息,请参阅以下 Microsoft 知识库文章:224453了解和解决SQL Server阻塞问题
应用程序使用连接池为网站提供服务。 随着更多连接被阻止,网站会创建更多连接。 这些连接将被阻止,循环会继续。
日志写入大约需要 45 秒才能完成。 但是,此时会备份数百个连接。 阻塞问题会导致SQL Server和应用程序的恢复时间过几分钟。 结合应用程序问题,停滞的 I/O 条件会对系统产生非常负面的影响。
分辨率
此问题跟踪到主机总线适配器 (HBA) 驱动程序中的 I/O 请求停滞。 计算机具有多个支持故障转移的 HBA 卡。 当一个 HBA 落后或未与存储区域网络 (SAN) 通信时,“故障转移前重试”超时值配置为 45 秒。 当超时超过时,I/O 请求将路由到第二个 HBA。 第二个 HBA 处理请求并快速完成。 为了帮助防止此类停滞情况,硬件制造商建议将“故障转移前重试”设置为 5 秒。
示例 2:筛选器驱动程序干预
许多防病毒软件程序和备份产品使用 I/O 筛选器驱动程序。 这些 I/O 筛选器驱动程序将成为 I/O 请求堆栈的一部分,并有权访问 IRP 请求。 Microsoft 产品支持服务已发现各种问题,这些问题包括筛选器驱动程序实现中导致 I/O 条件停滞或 I/O 条件停滞的 bug。
其中一个条件是用于备份处理的筛选器驱动程序,该驱动程序允许备份在备份时打开的文件。 系统管理员已在文件备份选择中包含 SQL Server 数据文件目录。 备份发生时,备份会尝试在备份启动时收集文件的正确映像。 执行此操作会延迟 I/O 请求。 当软件处理 I/O 请求时,一次只允许完成一个 I/O 请求。
备份开始时,SQL Server性能急剧下降,因为SQL Server的 I/O 被迫一次完成一个。 一次一个逻辑使得 I/O 操作无法异步执行,这加剧了问题。 因此,当SQL Server预期发布 I/O 请求并继续时,辅助角色将停滞在读取或写入调用中,直到 I/O 请求完成。 筛选器驱动程序的操作有效地禁用处理任务,例如SQL Server预读。 此外,筛选器驱动程序中的另一个 bug 会在过程中一次保留一个操作,即使备份完成也是如此。 还原SQL Server性能的唯一方法是重启SQL Server,以便在不与筛选器驱动程序交互的情况下释放并重新获取文件句柄。
分辨率
若要解决此问题,将从文件备份过程中删除SQL Server数据文件。 软件制造商已更正了使文件处于“一次一个”模式的问题。
示例 3:隐藏错误
许多高端系统都有多通道 I/O 路径来处理负载均衡或类似活动。 Microsoft 产品支持部门发现负载均衡软件出现问题,其中 I/O 请求失败,但软件无法正确处理错误条件。 该软件可以尝试无限次重试。 I/O 操作停滞,SQL Server无法完成指定的操作。 与前面所述的日志写入条件非常类似,在此类条件对系统进行楔形之后,可能会出现许多不良的系统行为。
分辨率
若要解决此问题,请重启SQL Server。 但是,有时需要重启操作系统才能还原处理。 我们还建议你从 I/O 供应商处获取软件更新。
示例 4:远程存储、镜像和 raid 驱动器
许多系统使用镜像或采用类似的步骤来防止数据丢失。 某些使用镜像的系统基于软件,有些系统基于硬件。 Microsoft 支持部门通常会发现这些系统的延迟增加。
当 I/O 在被视为完成之前必须完成时,总 I/O 时间会增加。 对于远程镜像安装,可能会涉及网络重试。 当驱动器发生故障并且正在重新生成 raid 系统时,I/O 模式也可能中断。
分辨率
需要严格的配置设置,以减少镜像或突袭重新生成操作的延迟。
示例 5:压缩
Microsoft 不支持在压缩驱动器上SQL Server数据文件和日志文件。 NTFS 压缩对于SQL Server不安全,因为 NTFS 压缩会中断提前写入日志记录 (WAL) 协议。 NTFS 压缩还要求对每个 I/O 操作进行更多的处理。 压缩会创建“一次一个”的行为,导致出现严重的性能问题。
分辨率
若要解决此问题,请解压缩数据和日志文件。
有关详细信息,请参阅 支持压缩卷上的数据库。
sys.dm_os_wait_stats动态管理视图中的PAGEIOLATCH_* 和写入日志等待 (DMV) 是调查 I/O 路径性能的关键指标。 如果看到大量的 PAGEIOLATCH 等待,则表明 SQL Server 正在等待 I/O 子系统。 一定数量的 PAGEIOLATCH 等待是典型的预期行为。 但是,如果平均 PAGEIOLATCH 等待时间始终大于 10 毫秒,则应调查 I/O 子系统承受压力的原因。 有关详细信息,请参阅以下文档:
参考
SQL Server要求系统支持SQL Server I/O 可靠性计划要求中所述的“保证传送到稳定介质”。 有关SQL Server数据库引擎的输入和输出要求的详细信息,请访问数据库引擎输入/输出要求。
有关 I/O 错误的详细信息,请参阅 Microsoft SQL Server I/O 基础知识,第 2 章。