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

4
我们的Web应用在高峰时间出现了性能问题,目前被分成一个2003 IIS6 Web服务器和一个SQL Server 2005 DB服务器。DB服务器上的查询时间看起来很好(约30ms),CPU很低(低于20%),但是在Web服务器上执行查询可能需要很长时间(超过1秒)。
我在perfmon中寻找线索,发现平均网络IO等待时间约为400ms,这可能很好地解释了性能差异。我还在SSMS中运行了一些查询,发现每秒大约有10,000毫秒的累计ASYNC_NETWORK_IO Wait Types。
从一些研究中得知,问题要么是网络容量不足,要么是Web服务器无法快速处理结果。我该如何调查它是哪个问题,然后解决它呢?
我们使用NHibernate作为数据层,据我所知没有使用DataReaders。没有已知的返回大结果集的查询,尽管有一个包含压缩XML文档的列的表。
先感谢您的帮助。
附加请求信息:
- Sql Server设置为使用TCP/IP和共享内存协议 - 我们每页进行约4个DB请求,不算太多 - 在高峰时段,DB服务器发送1.5MB / sec - 在高峰时期,Web服务器CPU约为60% - 在高峰时期,Web服务器NIC负载为13MB / sec。 8MB正在发送,5MB正在接收。 同一NIC处理SQL和HTTP流量 - 我们确实使用了一些缓存,但是应用程序相当动态,因此大部分时间都需要最新数据

在 Perfmon 中,您是否有当前网络适配器每秒传输多少数据包的数字? - Andrew
目前网卡接口每秒发送字节数约为560,000,尽管我们目前不处于高峰时间,并且网络IO等待时间为0ms。这是我应该检查的perfmon统计数据吗?明天在问题发生时,我会更新问题的统计数据。 - Robin Weston
每秒字节数足以显示每秒半兆字节,这绝不是一个高数字。 - Andrew
是的,目前的性能还不错。我会明天用更相关的统计数据更新这个问题。有没有什么方法可以研究你提供的理论? - Robin Weston
2个回答

5
数据库引擎正在等待ASP进程消耗发送给它的数据包。这可能是在ASP.Net进程本身中(IP数据包从NIC出队,但未被进程消耗,此时ASP.Net主机很可能是罪魁祸首,因为存在糟糕的代码或CPU过载),也可能是主机操作系统无法快速消耗IP数据包(来自HTTP负载和SQL往返负载的组合对主机来说太多了)。
ASP主机的CPU负载是多少?NIC中断率是多少?HTTP流量是否与TDS(SQL)流量共享在同一个NIC上,如果是,您能否将它们分开放在不同的NIC上?
ASP客户端和SQL之间配置了什么协议?Net pipes还是TCP?如果是Net Pipes,您能否关闭它并强制使用TCP,以便将SMB排除在外?
每个HTTP请求到数据库有多少次往返?如果超过4次,请尝试重构代码,将其减少到每个请求3-5次往返。
您是否在ASP进程上缓存任何内容,以避免额外的数据库往返?

非常感谢您提供的极其有用的答案。一旦我们达到峰值使用量,我将补充问题的额外信息。 - Robin Weston
有什么办法可以找出网卡的中断率吗? - Robin Weston
你可以使用kernrate http://www.microsoft.com/whdc/archive/drvperf.mspx#EPH 或者ETW会话。 - Remus Rusanu

1
我们通过将SQL流量分离到不同的NIC上解决了这个问题。此外,该NIC连接到本地IP地址,而以前它是连接到数据库服务器的公共IP。
感谢@Remus Rusanu的提示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接