与网络I/O相关的等待的主要是ASYNC_NETWORK_IO,是指当sql server返回数据结果集给客户端的时候,会先将结果集填充到输出缓存里(ouput cache),同时网络层会开始将输出缓存里的数据打包,由客户端接收。若是客户端接收数据包慢,sql server没有地方存放新数据结果时,这时任务进入ASYNC_NETWORK_IO等待状态。html
1. 从实例级别查看ASYNC_NETWORK_IOsql
平均耗时: 46366950.0/43014737.0=1.077ms, 最大等待时间:~40秒。缓存
2. 重现ASYNC_NETWORK_IO等待网络
为了演示ASYNC_NETWORK_IO 现象,咱们须要输出一个大结果集。当sql server内存彻底被使用后,大量的数据填充到缓存里,此时sql server没有地方存放新数据结果,进入等待状态。分布式
-- 一次查询100000条数据输出到客户端 SELECT TOP 100000 * FROM PUB_Stock WITH(nolock)
监听到的会话以下:sqlserver
使用dbcc inputbuffer 查询64结果以下:性能
3.分析与解决优化
这个等待出现的问题强调如下几点:spa
(1) 客户端没有把数据及时取走,调整sqlserver 的配置通常状况下是否是有什么大的帮助。.net
(2) 网络层多是问题的缘由。 解决:1是减小对客户端大量数据输出。 2是加大sqlserver 的network packe size,从必定程度上优化网络转输的性能,但会增长内存的开销(建议小于设置小于8kb)。
network packe size是客户端与sqlserver通讯的每一个数据包大小有关系。network packe size设置的数据包存放于内存功能组件的connection类别里。默认是4kb设置,输入输出缓存会放在buffer pool里,若是改为了8kb 或更大,输入输出缓存会放在multi-page里 关于内存可查看sql server 内存初探。 设置network packe size 能够由sp_configure控制。客户端应用程序能够覆盖此值如在.net 里配置以下。
Data Source=(local);Initial Catalog=AdventureWorks;"Integrated Security=SSPI;Packet Size=512
演示将 net work packe size设置成6050字节
USE AdventureWorks2012 ; GO EXEC sp_configure 'show advanced options', 1; GO RECONFIGURE ; GO EXEC sp_configure 'network packet size', 6500 ; GO RECONFIGURE; GO
也能够能过界面来配置
(3) 应用程序端性能问题,也会致使sql server里的ASYNC_NETWORK_IO等待。
sqlserver 的网络层将结果集打包好发向客户端之后,要等到客户端确认收到,才会接着发下一个包。
(4) 分布式锁
若是长时间看到ASYNC_NETWORK_IO,同时在sqlserver内部又形成了阻塞,而且该等待持续了好久,就该怀疑是不是分布式的死锁。
总结:当遇到ASYNC_NETWORK_IO等待,须要检查应用程序本身的健康情况,也要检查应用是否有必要向sql server 申请这么大的结果集返回,通常来说sqlserver 自己没有什么问题。
这里还有其它几个NET_WAITFOR_PACKET,PROXY_NETWORK_IO,EXTERNAL_SCRIPT_NETWORK_IOF。
2.1 NET_WAITFOR_PACKET: 在msdn中解释是 网络读取过程当中,链接正在等待网络数据包时出现。
实际级等待以下图所示:
2.2 后面二个proxy_network_io,external_script_network_iof。在生产环境下没有数据。在msdn中也没有找到相应解释。只能经过字面含义去解释。