【问题标题】:SQL Server 2005 Network IO Wait Times (ASYNC_NETWORK_IO Wait Type) ProblemSQL Server 2005 网络 IO 等待时间(ASYNC_NETWORK_IO 等待类型)问题
【发布时间】:2010-07-01 22:15:43
【问题描述】:

我们的 Web 应用程序在高峰时段遇到性能问题,目前该应用程序分为一台 2003 IIS6 Web 服务器和一台 SQL Server 2005 DB 服务器。 DB 服务器上的查询时间看起来不错(大约 30 毫秒),CPU 较低(低于 20%),但在 Web 服务器上执行查询可能需要很长时间(超过 1 秒)。

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

根据一些研究,问题似乎是网络容量不足,或者网络服务器处理结果的速度不够快。我该如何去调查它是什么,然后解决?

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

提前致谢

要求的其他信息

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

【问题讨论】:

  • 在 perfmon 中,您是否知道网卡当前正在通过的每秒数据包数?
  • 当前网络接口\字节发送/秒约为 560,000,尽管我们目前不是高峰时间,网络 IO 等待时间为 0 毫秒。这是我应该检查的性能数据吗?明天我会用问题发生的高峰时间的统计数据更新问题。
  • 字节/秒足以显示每秒半兆,这在任何想象中都不是一个高数字。
  • 是的,目前的表现还不错。明天我会用更相关的统计数据更新这个问题。有什么方法可以调查您提供的理论吗?

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


【解决方案1】:

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

ASP 主机上的 CPU 负载是多少?网卡中断率是多少? HTTP 流量是否与 TDS (SQL) 流量在同一个 NIC 上共享,如果是,您能否将它们分开在不同的 NIC 上?

ASP 客户端和 SQL 之间配置了什么协议?网络管道还是 TCP?如果是 Net Pipes,你能把它关掉并强制它使用 TCP,这样你就可以把 SMB 排除在外了吗?

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

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

【讨论】:

  • 感谢您提供的非常有帮助的答案。一旦达到使用高峰,我会用额外的信息修改问题。
  • 知道如何找出网卡中断率吗?
  • 您可以使用 kernrate microsoft.com/whdc/archive/drvperf.mspx#EPH 或 ETW 会话
【解决方案2】:

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

感谢@Remus Rusanu 的提示。

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多