SQL Server中的等待事件ASYNC_NETWORK_IO说明
Tags: ASYNC_NETWORK_IOSQL Server等待事件
简介
ASYNC_NETWORK_IO 是指 SQL Server 在等待网络 IO 操作完成时所使用的等待类型。
这个等待类型通常会在以下情况下出现:
- 当 SQL Server 实例需要向其他服务器发送数据或从其他服务器接收数据时,会出现 ASYNC_NETWORK_IO 等待。
- 当 SQL Server 实例与客户端进行通信时,客户端没有及时响应 SQL Server 实例发送的请求时,也会出现 ASYNC_NETWORK_IO 等待。
- 当 SQL Server 实例与客户端之间的网络连接不稳定或网络质量较差时,也会出现 ASYNC_NETWORK_IO 等待。
在大多数情况下,ASYNC_NETWORK_IO 等待类型是由网络瓶颈或性能问题引起的。要解决这个问题,可以尝试以下几种方法:
- 确保网络连接是稳定的,并检查网络带宽和延迟是否满足要求。
- 将 SQL Server 实例与客户端之间的网络连接优化为更快速和更可靠的网络连接,例如使用千兆以太网连接代替百兆以太网连接。
- 使用 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等待类型。
原因和解决方法
以下部分列出了此等待类型的常见原因以及解决此问题的相应步骤:
大型结果集
某些应用程序客户端请求数千行甚至数百万行,然后通过应用筛选器、排序和聚合来处理结果。 大型结果集可能会导致不必要的网络利用率和客户端应用程序处理。
分辨率:应用程序开发人员必须仔细平衡SQL Server和客户端之间的处理。 筛选或聚合可以通过SQL Server执行,最终结果集可以很小。 限制到达客户端的结果集。 收到数据后,客户端上对数据、表示和格式设置进行更多计算都更合适。
应用程序提取结果的速度不够快
如果客户端应用程序提取结果的速度不够快,并且未通知SQL Server已收到结果集,ASYNC_NETWORK_IO
则等待将在服务器上发生。
为了说明如何使用 ADO.NET,默认情况下, DataSet 和 DataTable 将提取所有行以完成,然后客户端才能访问它。 但是, SqlDataReader 等类允许应用程序开发人员选择从服务器提取每一行后要执行的操作。 应用程序可以一次提取一行,然后根据业务需求处理此行。 例如:
- 将行写入文件。
- 通过网络将行发送到另一个应用程序。
- 等待一段时间或等待用户输入。
分辨率: 若要解决此问题,请使用严格的 WHILE/FOR 循环,尽可能快地提取客户端的所有结果。 这意味着将结果存储在内存中,然后才执行更多处理。
客户端应用程序计算机 (I/O、内存或 CPU)
即使开发应用程序代码以尽快提取结果,系统资源问题也可能导致整个客户端进程变慢。 例如:
如果运行客户端应用程序的计算机具有资源约束,则应用程序可能无法快速提取结果。 例如:
- 100% CPU 利用率
- 内存不足 () 消耗了所有内存
- I/O 速度缓慢 (应用程序可能会) 写入结果或日志
这些资源约束可能会导致处理传入结果的速度缓慢,并导致SQL Server遇到等待类型 ASYNC_NETWORK_IO
。
分辨率:若要解决此问题,请使用 性能监视器 等工具来诊断运行应用程序的系统,然后消除任何资源约束。 以下方法之一可能适合你:
- 停止运行其他应用程序。
- 修复这些应用程序中的任何代码问题。
- 如果应用程序已完全优化,请升级系统上的硬件。
NIC/网络
慢速网络卡或网络接口卡 (NIC) 可能会导致网络流量延迟,并自然会延迟获取结果并与SQL Server通信。 网络延迟通常由以下问题引起:
- 网络适配器驱动程序问题
- 网络筛选器驱动程序问题
- 防火墙配置错误或有故障
- 路由器问题
- 由于流量 (不太常见的) 而导致网络过载
分辨率: 若要诊断这些问题,可以 收集网络跟踪 并查找数据包重置和重新传输。 然后,可以解决与网络相关的问题,以消除数据包重置/重新传输。
如何减少ASYNC_NETWORK_IO等待?
在遇到高 ASYNC_NETWORK_IO等待类型时,DBA应该如何减少此等待?
1,发送小数据集
DBA需要调查导致出现ASYNC_NETWORK_IO等待类型的应用程序,并与创建应用程序的开发人员进行协调。
- DBA需要检查应用程序是否从SQL Server实例请求大数据集,然后在客户端做过滤。
- 改进的方法只有一个:把过滤放到请求数据时,在SQL Server中执行过滤,向客户端应用程序发送小数据集。
2,使用共享内存
在SQL Server端加载大数据时,也可以通过设置启用共享内存协议(Shared memory protocol )来降低ASYNC_NETWORK_IO等待类型。
1 2 3 | SELECT net_transport FROM sys.dm_exec_connections WHERE session_id = @@SPID; |
在客户端应用中,使用net_transport=’Shared memory’来连接数据库。
3,网络问题
如果检查了以上内容之后,SQL Server的ASYNC_NETWORK_IO等待类型出现的次数并未明显减少,那么可能是网络的问题。
检查SQL Server和客户端之间的网络带宽,网速慢是ASYNC_NETWORK_IO等待值较高的常见原因。
4,加大sqlserver 的network packe size
加大sqlserver 的network packe size,从一定程度上优化网络转输的性能,但会增加内存的开销(建议设置小于8kb),最大值32767
network packe size是客户端与sqlserver通信的每个数据包大小有关系。network packe size设置的数据包存放于内存功能组件的connection类别里。默认是4kb设置,输入输出缓存会放在buffer pool里,如果改成了8kb 或更大,输入输出缓存会放在multi-page里 关于内存可查看sql server 内存初探。
设置network packe size 可以由sp_configure控制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SELECT * FROM sys.configurations d where d.name like '%network packet size (B)%' ORDER BY name ; GO sp_configure 'show advanced options', 1; GO RECONFIGURE WITH OVERRIDE; GO sp_configure 'network packet size', 6500; GO RECONFIGURE WITH OVERRIDE; GO |
也可以能过界面来配置
ASYNC_NETWORK_IO 等待思路
此等待状态出现在SQLServer已经把数据准备好,但是网络没有足够的发送速度跟上,所以SQLServer的数据没地方存放。
- 出现这种情况一般不是数据库的问题,调整数据库配置不会有大的帮助。
- 网络层的瓶颈当然是一个可能的原因:对此要考虑是否真有必要返回那么多数据?
- 应用程序端的性能问题,也会导致SQLServer里的ASYNC_NETWORK_IO等待。如果见到了这个类型的等待,就要检查应用程序的健康状况,也要检查应用是否有必要想SQLServer申请这么大的结果集。
- 程序返回结果集的方式 。
参考
https://www.cnblogs.com/gered/p/12773105.html
https://blog.csdn.net/culuo4781/article/details/107624695
https://www.modb.pro/db/171352