我们的网络应用程序在高峰时段出现性能问题,目前在一个2003 IIS6 Web服务器和一个SQL Server 2005数据库服务器之间分配。数据库服务器上的查询时间看起来很好(大约30ms),CPU很低(低于20%),但查询可能需要很长时间才能在Web服务器上执行(超过1秒)。
我正在寻找perfmon的线索,并发现平均网络IO等待时间约为400毫秒,这可以很好地解释性能差异。我还在SSMS中运行了一些查询,看到每秒大约有10,000ms的累积ASYNC_NETWORK_IO等待类型。
从某些研究来看,问题似乎是网络容量不足,或者网络服务器没有足够快地处理结果。我该如何调查它是什么,然后解决?
我们将NHibernate用于数据层,因此据我所知,没有使用DataReader。虽然有一个表包含一个包含压缩XML文档的列,但没有已知的返回大型结果集的查询。
提前致谢
其他请求信息
答案 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的提示。