SQL Server 2005网络IO等待时间(ASYNC_NETWORK_IO等待类型)问题

时间:2010-07-01 22:15:44

标签: asp.net sql-server sql-server-2005 nhibernate networking

我们的网络应用程序在高峰时段出现性能问题,目前在一个2003 IIS6 Web服务器和一个SQL Server 2005数据库服务器之间分配。数据库服务器上的查询时间看起来很好(大约30ms),CPU很低(低于20%),但查询可能需要很长时间才能在Web服务器上执行(超过1秒)。

我正在寻找perfmon的线索,并发现平均网络IO等待时间约为400毫秒,这可以很好地解释性能差异。我还在SSMS中运行了一些查询,看到每秒大约有10,000ms的累积ASYNC_NETWORK_IO等待类型。

从某些研究来看,问题似乎是网络容量不足,或者网络服务器没有足够快地处理结果。我该如何调查它是什么,然后解决?

我们将NHibernate用于数据层,因此据我所知,没有使用DataReader。虽然有一个表包含一个包含压缩XML文档的列,但没有已知的返回大型结果集的查询。

提前致谢

其他请求信息

  • Sql Server设置为使用TCP / IP 和共享内存协议
  • 我们每页大约提出4个DB请求,没什么可笑的
  • 在高峰时间,DB Server发送1.5MB /秒
  • 最高时,Web服务器CPU约为60%
  • AT峰值,Web服务器NIC负载为13MB /秒。 8MB正在发送,5MB正在接收。相同的NIC处理SQL和HTTP流量
  • 我们确实使用了一些缓存,但应用程序非常动态,因此大多数时候都需要最新的数据

2 个答案:

答案 0 :(得分:5)

数据库引擎正在等待ASP进程使用发送给它的数据包。这可以在ASP.Net进程本身(IP数据包从NIC出队,但它们不被进程消耗,在这种情况下,ASP.Net主机可能是罪魁祸首,如在坏代码或CPU中可能是主机操作系统无法足够快地消耗IP数据包(来自组合HTTP负载的IP负载和SQL往返负载的组合对于主机来说太多了)。

ASP主机上的CPU负载是多少?什么是NIC中断率? HTTP流量是否在具有TDS(SQL)流量的同一NIC上共享,如果是,可以在不同的NIC上将它们分开吗?

ASP客户端和SQL之间配置了什么协议?网管还是TCP?如果是Net Pipes,你可以将其关闭并将其强制为TCP,这样你就可以将SMB排除在等式之外吗?

根据HTTP请求,您要对数据库进行多少次往返?如果超过4,您是否可以考虑重构代码以将其减少到每次请求3-5次往返?

您是否在ASP流程上缓存任何内容以避免额外往返数据库?

答案 1 :(得分:1)

我们通过将SQL流量分离到不同的NIC来解决了这个问题。此外,此NIC连接到本地IP地址,而在它访问数据库服务器的公共IP之前。

感谢@Remus Rusanu的提示。