【发布时间】:2011-03-03 00:32:22
【问题描述】:
在对我的 Web 服务器和数据库服务器之间的流量进行 TCP 分析时,我发现网络缓冲区(TCP 窗口)经常被填满。然后,Web 服务器向数据库服务器发送 TCP 消息,告诉它其缓冲区已满,并且在获得更新之前不要发送更多数据。
例如,这是网络缓冲区的大小(以字节为单位),用于一段时间内与数据库服务器的长期连接:
Web 服务器在 Windows 2008 R2 Web 服务器上运行以 IIS 集成模式运行的 .NET 4.0 应用程序。 SQL 服务器是 2008 R2 服务器。
我对此的解释是,SQL 服务器向 Web 服务器返回数据的速度比 Web 服务器上的应用程序可以从缓冲区收集数据的速度更快。我已经尝试调整网络驱动程序中的所有内容来解决这个问题。特别是增加 RSS 队列、禁用中断调节以及设置 Windows 2008 R2 服务器以更积极地增加缓冲区大小。
因此,如果我的解释是正确的,那让我想知道两种可能性:
- .NET 中有没有办法告诉它增加网络缓冲区的大小? “增强的 2008 R2 TCP 堆栈”很少决定为此连接启用窗口缩放(使缓冲区大于 65 kBytes)(可能是由于低延迟)。看起来手动设置这个系统范围的能力在 Windows server 2008 r2 中消失了(曾经有现在被忽略的注册表项)。那么有没有办法可以在代码中强制执行此操作?
- 是否有任何可以调整的东西来加快应用程序读取网络缓冲区信息的速度,尤其是 SQL 连接?
编辑:
请求的 DMV 查询在 ASYNC_NETWORK_IO 处中断:
SELECT * FROM sys.dm_os_wait_stats ORDER BY waiting_tasks_count desc;
wait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_ms
CXPACKET 1436226309 2772827343 39259 354295135
睡眠任务 231661274 337253925 10808 71665032
LATCH_EX 214958564 894509148 11855 84816450
SOS_SCHEDULER_YIELD 176997645 227440530 2997 227332659
ASYNC_NETWORK_IO 112914243 84132232 16707 16250951
【问题讨论】:
-
这是一个我将直接与 Microsoft 讨论的问题。打开支持票证或使用免费的 MSDN 电话(如果有)。
-
Kyle 的跟进:blog.serverfault.com/post/…