加快 IIS/.NET/LINQ 从网络缓冲区检索数据的速度

2024-03-24

当对我的 Web 服务器和数据库服务器之间的流量进行 TCP 分析时,我发现网络缓冲区(TCP 窗口)经常被填满。然后,Web 服务器向数据库服务器发送 TCP 消息,告知其缓冲区已满,并且在更新之前不要发送更多数据。

例如,这是随着时间的推移与数据库服务器的寿命较长的连接之一的网络缓冲区的大小(以字节为单位):

Web 服务器正在 Windows 2008 R2 Web 服务器上运行以 IIS 集成模式运行的 .NET 4.0 应用程序。 SQL 服务器是 2008 R2 服务器。

我对此的解释是,SQL 服务器将数据返回到 Web 服务器的速度比 Web 服务器上的应用程序从缓冲区收集数据的速度更快。我已尝试调整网络驱动程序中的所有内容来解决此问题。特别是增加 RSS 队列、禁用中断调节以及设置 Windows 2008 R2 服务器以更积极地增加缓冲区大小。

因此,如果我的解释是正确的,那么我想知道两种可能性:

  1. .NET 中有什么方法可以告诉它增加网络缓冲区的大小吗? “增强型 2008 R2 TCP 堆栈”很少决定为此连接启用窗口缩放(使缓冲区大于 65 kBytes)(可能是由于低延迟)。看起来在 Windows Server 2008 r2 中手动设置此系统范围的功能已消失(曾经有注册表项,现在已被忽略)。那么有没有办法可以在代码中强制执行此操作?
  2. 是否可以进行任何调整来加快应用程序读取网络缓冲区信息的速度,特别是 SQL 连接的速度?

Edit:
请求的 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
SLEEP_TASK           231661274     337253925             10808            71665032
LATCH_EX             214958564     894509148             11855            84816450
SOS_SCHEDULER_YIELD  176997645     227440530              2997           227332659
ASYNC_NETWORK_IO     112914243      84132232             16707            16250951
  

1) 是什么让您认为这是 TCP 流量控制,而不是 SQL Server 在没有流量的时间间隔内不生成数据?检查是否sys.dm_exec_requests查看 wait_type。等待类型的描述见等待和队列 http://msdn.microsoft.com/en-us/library/cc966413.aspx。如果确实是客户端应用 TCP 流量控制,那么您将看到等待类型ASYNC_NETWORK_IO.

2) If问题确实是网络等待类型,那么解决方案不是增加带宽,而是明显减少流量。客户端没有业务向服务器请求如此多的数据以引起 TCP 流量控制。这可能是由于在客户端中执行了严重错误的操作而导致的,例如计算行数或客户端分页。将处理移至服务器上,只需获取包含所需数据的小型结果集。

Edit

使用数据库调用结果集最终归结为以下一种形式:

FetchNextRow
while (not EnfOfResults)
{
  ProcessRow;
  FetchNextRow;
}

这可能意味着什么,实际上,它可能是foreach row in IQueryable or SqlDataReader.Read()。但基本思想是相同的,即客户端从结果中获取行,处理它们,然后获取更多行。如果客户端代码这样做anything在那里面ProcessRow阻塞,那么客户端代码将无法到达再次获取下一行的位置,因此最终将触发 TCP 流控制,这反过来将导致 SQL Server 挂起查询(因为它没有地方将结果写入)。对于 TCP 而言,您无法采取任何措施来改善这一情况。增加窗口大小实际上会使情况变得更糟,因为现在所有那些以前在源(DB)处被抑制的结果都将被创建并必须存储在某个地方,这最终意味着将实时内存分配给存储并可能使事情变得更糟比他们现在更糟糕。

如果我现在处于你的处境,我会专注于识别where这样做ProcessRow发生阻塞。我提出的一个假设是,该处理将是一个 MVC 视图写入响应缓冲区,并依次被 TCP 流控制阻止,这是由于用户代理不消耗 HTTP 响应(例如,Ajax 调用已完成但浏览器未运行)消耗响应的完成代码,因为主线程正在循环忙于其他事情)。与往常一样,最好的方法是有条不紊地进行衡量。一些可能的工具:

  • Look at ASP.Net 性能计数器 http://msdn.microsoft.com/en-us/library/fxk122b4.aspx.
  • 使用您自己的性能计数器来检测您的代码(比大多数开发人员想象的要容易得多,请参阅使用 XSLT 生成性能计数器代码 http://rusanu.com/2009/04/11/using-xslt-to-generate-performance-counters-code/)
  • 非侵入式采样性能轨迹,请参阅使用 VSPerfASPNETCmd 进行快速网站分析 http://msdn.microsoft.com/en-us/library/ee308442.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加快 IIS/.NET/LINQ 从网络缓冲区检索数据的速度 的相关文章

随机推荐

  • 如何编辑这个 Typo3 菜单?

    我有一个一页示例站点 使用 Typo3 版本 7 6 10 的 bootstrap package Introduction 包 问题是我是 Typo3 的新手 需要帮助转换导航菜单 我希望它们成为页面中各个部分的锚点 更详细地说 从我在后
  • React-router 4.0.0 的路由器历史记录

    In react router 4 0 0历史提供似乎已经改变 如下index js import React from react import ReactDOM from react dom import Router Route ha
  • Cordova 运行的 Java 版本错误。如何让 Cordova 运行特定的 Java 版本?

    javac warning options source value 1 5 is obsolete and will be removed in a future release and error strings in switch a
  • Ionic“似乎是一种非常古老的项目文件格式 - 请在更新版本的 Xcode 中打开您的项目文件”

    fastlane 完成了与automatic code signing 相关的错误 我不确定这意味着什么以及如何修复它 但这是我以前从未遇到过的错误 我使用的是 Ionic v3 这与 iOS 平台未更新有关 iOS 版本 包括 cordo
  • Gson.toJson 返回 null [ProGuard 问题]

    用户错误报告显示Gson toJson obj 偶尔回来 但对于大多数用户来说它工作正常 我拜访了一位用户 他遇到了该错误并在他的手机上调试了应用程序 我做了Toast显示发送到服务器的内容 我看到 Toast 显示 并且Records a
  • 如何在我的 ubuntu 容器中安装 Docker?

    我在运行的容器内安装了 dockerubuntu 18 04要运行我的nodejs应用程序 我需要在这个容器内安装docker 因为我需要dockerize另一个小应用程序 她是我的 Dockerfile FROM ubuntu 18 04
  • 如何使用 Zend Framework 和 netbeans 编写 JavaScript?

    我正在这样编写 JavaScript function some javascript magic 但问题是它没有突出显示并且没有自动完成功能 我尝试过这样写
  • 从网站获取图像列表并显示它

    我正在创建一个 iOS 应用程序 该应用程序应该获取网站上存在的图像列表并将它们显示为屏幕上的图块 类似于显示照片库中的图像 我可以在 UIImageView 中显示 URL 中的单个图像 但是当涉及到显示网站中的完整图像列表时 我一无所知
  • 在 Java 中嵌入 Gecko/WebKit

    我希望将 Gecko WebKit 或其他 Web 浏览器嵌入到 Java 中作为 Swing AWT 控件 我正在寻找不同于 JRex 或JWebPane 你可以使用浏览器 https www teamdev com jxbrowser
  • 如何使用 emscripten 通过 node.js 进行文件输入?

    我有一个 C 项目 我已使用 emscripten 将其转换为 javascript 我需要帮助通过节点实现文件输入到程序中 据我了解 emscripten 中的默认文件系统使用只能在网页或网络工作人员上完成的预加载数据 我需要我的在命令行
  • 在 C++ 声明中使用 ^ 字符意味着什么? [复制]

    这个问题在这里已经有答案了 可能的重复 C CLI 中插入符号 是什么意思 https stackoverflow com questions 202463 what does the caret mean in c cli 在 C CLR
  • 为什么我会遇到映射异常?

    我正进入 状态 org hibernate MappingException Foreign key FKBB979BF4266AA123 address a id must have same number of columns as t
  • 如何在android中设置定时器

    在 android 中设置计时器以启动任务 我创建的不会更改 UI 的函数 的正确方法是什么 以 Java 方式使用它 http docs oracle com javase 1 5 0 docs api java util Timer h
  • 应用程序无法使用 libcurl C++ Windows 7 VS 2010 启动(0xc0150002)[重复]

    这个问题在这里已经有答案了 可能的重复 应用程序无法正确初始化 0xc0150002 https stackoverflow com questions 3537429 the application failed to initializ
  • 从 NSMenu 打开 NSWindowController

    我在代理应用程序中使用 NSMenu 坞站中没有图标 当点击此菜单中的按钮时 我想显示一个通用的 NSWindowController 我的菜单按钮操作 IBAction menuButtonTapped id sender MyWindo
  • 如何列出GC终结列表中的所有对象?

    我的程序崩溃了 它是VS的可视化工具 所以 调试它非常困难 我尝试过转储并使用WinDbg来研究它 但没有成功 所以 现在我尝试以编程方式把手放在该列表上 但我不知道如何 谢谢 如果您想查看某个对象是否在终结队列或 f reachable
  • 对 Stripe 的 API 请求失败(错误:不是有效的 URL)

    我想在 Node 应用程序中使用 Stripe 预构建结帐页面构建一个简单的结帐页面 我遵循 Stripe 文档中的所有必要步骤 但 API 请求似乎不起作用 服务器 js const express require express con
  • 针对网站特定部分的移动检测

    我是网络开发的初学者 我很难解决这个问题 我拍摄了一段视频并将其编码为 mp4 文件和 ism 文件 我有两个不同的视频标签 一个将播放每个文件 对于我正在开发的网站 如果在移动设备上查看该网站 我希望它使用其中一个视频标签 如果不是 则使
  • 如何检测系统日期回滚?

    如何检测用户何时回滚系统日期 使用情况是为了防止规避许可 程序需要检测在未运行时发生的回滚 好吧 您可以在程序中使用嵌入式数据库 其中每隔一段时间就会插 入一个加密的系统日期 如果您发现 较新 的日期早于之前的某个日期 则可以看出有人更改了
  • 加快 IIS/.NET/LINQ 从网络缓冲区检索数据的速度

    当对我的 Web 服务器和数据库服务器之间的流量进行 TCP 分析时 我发现网络缓冲区 TCP 窗口 经常被填满 然后 Web 服务器向数据库服务器发送 TCP 消息 告知其缓冲区已满 并且在更新之前不要发送更多数据 例如 这是随着时间的推