2010-07-01 107 views
4

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

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

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

我们使用NHibernate作为我们的数据层,所以根据我所知没有使用DataReader。没有已知的查询会返回大型结果集,尽管有一个表具有包含压缩XML文档的列。

在此先感谢

附加请求信息

  • SQL Server设置为使用TCP/IP 和共享内存协议
  • 我们做每个页面,没什么大约4 DB请求荒谬的
  • 在高峰时间DB服务器发送1.5MB /秒
  • 在峰值时,Web s erver CPU大约60%
  • AT峰值,Web服务器NIC负载为13MB /秒。 8MB正在发送,5MB正在接收。同样的NIC处理SQL和HTTP流量
  • 我们确实使用了一些缓存,但应用程序是非常动态的,所以需要多达大部分时间
+0

在perfmon中,您是否有一张数字表示网卡当前正在通过的秒数? – Andrew 2010-07-01 22:21:14

+0

当前网络接口\发送的字节数/秒为〜560,000,尽管我们目前没有处于高峰时间,网络IO等待时间为0ms。这是我应该检查的perfmon stat吗?我将在明天更新问题,并提供发生问题时的高峰时段的统计数据。 – 2010-07-01 22:33:05

+0

字节/秒足以显示每秒半兆,这不是任何想象中的高数字。 – Andrew 2010-07-01 22:39:52

回答

1

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

感谢@Remus Rusanu的提示。

5

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

你在ASP主机上的CPU负载是什么?什么是网卡中断率? HTTP流量是否与TDS(SQL)流量在同一个网卡上共享,如果是,您可以将它们分离到不同的NIC上吗?

ASP客户端和SQL之间配置了什么协议?网管或TCP?如果是Net Pipes,你可以关闭它并强制它使用TCP,这样你可以让SMB脱离等式?

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

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

+0

感谢您的非常有帮助的答案。一旦我们达到峰值使用率,我会用额外的信息修改这个问题。 – 2010-07-02 10:45:47

+0

任何想法如何找出网卡中断率? – 2010-07-02 11:19:57

+0

您可以使用kernrate http://www.microsoft.com/whdc/archive/drvperf.mspx#EPH或ETW会话 – 2010-07-02 17:27:48