MSSQL中的等待事件ASYNC_NETWORK_IO说明

0    186    2

Tags:

👉 本文共约4363个字,系统预计阅读时间或需17分钟。

简介

ASYNC_NETWORK_IO 是指 SQL Server 在等待网络 IO 操作完成时所使用的等待类型。

这个等待类型通常会在以下情况下出现:

  1. 当 SQL Server 实例需要向其他服务器发送数据或从其他服务器接收数据时,会出现 ASYNC_NETWORK_IO 等待。
  2. 当 SQL Server 实例与客户端进行通信时,客户端没有及时响应 SQL Server 实例发送的请求时,也会出现 ASYNC_NETWORK_IO 等待。
  3. 当 SQL Server 实例与客户端之间的网络连接不稳定或网络质量较差时,也会出现 ASYNC_NETWORK_IO 等待。

在大多数情况下,ASYNC_NETWORK_IO 等待类型是由网络瓶颈或性能问题引起的。要解决这个问题,可以尝试以下几种方法:

  1. 确保网络连接是稳定的,并检查网络带宽和延迟是否满足要求。
  2. 将 SQL Server 实例与客户端之间的网络连接优化为更快速和更可靠的网络连接,例如使用千兆以太网连接代替百兆以太网连接。
  3. 使用 SQL Server 的性能监视工具来跟踪和诊断 ASYNC_NETWORK_IO 等待的问题,并尝试通过调整服务器配置或查询优化来改善性能。

总之,ASYNC_NETWORK_IO 等待类型通常是由网络瓶颈或性能问题引起的,可以通过优化网络连接和服务器配置以及调整查询优化来改善性能。

ASYNC_NETWORK_IO 等待类型是DBA经常会遇到的,虽然名称是异步、网络和IO,但是大多数情况下,此等待类型跟任何网络问题均无关系。

数据库系统大量出现ASYNC_NETWORK_IO等待的情况,大致有两类:

  • 会话必须等待客户端应用程序处理从SQL Server接收到的数据,才能向SQL Server发送信号,表明它可以接受新数据进行处理。 这是最常见的情况,可能反映了不良的应用程序设计。
  • 网络带宽已用尽, 以太网阻塞将导致从应用程序来回传输数据的速度变慢,这将降低应用程序的效率,这种情况不常见,可以说是罕见。

症状

当SQL Server生成结果集并通过将结果放入输出缓冲区将其发送到客户端应用程序时,客户端应用程序会从输出缓冲区提取结果集。 如果客户端应用程序停止或提取结果的速度不够快,SQL Server必须等待确认客户端应用程序已收到所有结果,然后再发送更多结果。 此等待将显示为 ASYNC_NETWORK_IO。 有关详细信息,请参阅了解SQL Server ASYNC_NETWORK_IO等待中的视频。

过多的ASYNC_NETWORK_IO等待可能会导致两个问题:

  • 查询可能会变慢,因为它们的总持续时间会更长。
  • 当SQL Server等待客户端提取结果时,它无法释放获取的锁。 如果锁定长时间未释放,则会在SQL Server上阻止其他会话。

客户端应用程序的问题

当SQL Server大量出现ASYNC_NETWORK_IO等待时,最常见的原因是客户端应用程序无法足够快速地处理从SQL Server传回的数据,换句话说,就是SQL Server传递给应用程序的数据量超出了应用程序的处理能力。常见于客户端应用程序请求大量的数据。

当应用程序请求大量的结果数据集时,缓慢的数据处理将导致数据缓冲区被填满,从而阻止SQL Server向客户端发送新的数据。当缓存区被填满时,执行批处理的服务器进程(SPID)将被迫等待,直到客户端应用程序设法开始处理缓冲区中存储的数据,从而允许SQL Server将新的结果集(通过缓冲区)发送给客户端。在等待将应用程序请求的新数据发送到缓冲区以进行进一步处理时,SQL Server会生成ASYNC_NETWORK_IO等待类型。

img

原因和解决方法

以下部分列出了此等待类型的常见原因以及解决此问题的相应步骤:

大型结果集

某些应用程序客户端请求数千行甚至数百万行,然后通过应用筛选器、排序和聚合来处理结果。 大型结果集可能会导致不必要的网络利用率和客户端应用程序处理。

分辨率:应用程序开发人员必须仔细平衡SQL Server和客户端之间的处理。 筛选或聚合可以通过SQL Server执行,最终结果集可以很小。 限制到达客户端的结果集。 收到数据后,客户端上对数据、表示和格式设置进行更多计算都更合适。

应用程序提取结果的速度不够快

如果客户端应用程序提取结果的速度不够快,并且未通知SQL Server已收到结果集,ASYNC_NETWORK_IO则等待将在服务器上发生。

为了说明如何使用 ADO.NET,默认情况下, DataSetDataTable 将提取所有行以完成,然后客户端才能访问它。 但是, SqlDataReader 等类允许应用程序开发人员选择从服务器提取每一行后要执行的操作。 应用程序可以一次提取一行,然后根据业务需求处理此行。 例如:

  • 将行写入文件。
  • 通过网络将行发送到另一个应用程序。
  • 等待一段时间或等待用户输入。

分辨率: 若要解决此问题,请使用严格的 WHILE/FOR 循环,尽可能快地提取客户端的所有结果。 这意味着将结果存储在内存中,然后才执行更多处理。

客户端应用程序计算机 (I/O、内存或 CPU)

即使开发应用程序代码以尽快提取结果,系统资源问题也可能导致整个客户端进程变慢。 例如:

如果运行客户端应用程序的计算机具有资源约束,则应用程序可能无法快速提取结果。 例如:

  • 100% CPU 利用率
  • 内存不足 () 消耗了所有内存
  • I/O 速度缓慢 (应用程序可能会) 写入结果或日志

这些资源约束可能会导致处理传入结果的速度缓慢,并导致SQL Server遇到等待类型 ASYNC_NETWORK_IO

分辨率:若要解决此问题,请使用 性能监视器 等工具来诊断运行应用程序的系统,然后消除任何资源约束。 以下方法之一可能适合你:

  • 停止运行其他应用程序。
  • 修复这些应用程序中的任何代码问题。
  • 如果应用程序已完全优化,请升级系统上的硬件。

NIC/网络

慢速网络卡或网络接口卡 (NIC) 可能会导致网络流量延迟,并自然会延迟获取结果并与SQL Server通信。 网络延迟通常由以下问题引起:

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复