草庐IT

c# - .NET HttpClient 的 Http 连接变慢或死锁

coder 2023-09-19 原文

我们有一个 asp.net webapi 应用程序需要向其他 web 应用程序发出大量调用(它基本上是一个反向代理)。为此,我们使用 HttpClient 的异步方法。

是的,我们已经看到关于只使用一个 HttpClient 实例而不是处置它的提示。

是的,我们已经看到有关设置配置值的提示,尤其是租用超时的问题。目前我们设置 ConnectionLimit = CPU*12,ConnectionLeaseTimeout = 5min 和 MaxIdleTime = 30s。

我们可以看到连接的行为符合预期。负载测试中的吞吐量也非常好。但是,我们面临着连接偶尔会停止工作的问题。它似乎发生在大量请求进入时(并且作为反向代理,导致发出新请求)并且它主要(但不仅)发生在所有后端应用程序中最慢的情况下。然后,行为是需要永远完成对该端点的请求,或者它们只是以超时结束。

托管我们的反向代理应用程序的服务器的 IISReset 终止了问题(暂时)。

我们已经在几个方面进行了调查:

  • 远程 Web 应用程序的性能问题:虽然它的行为与实际情况完全一样,但当在远程服务器本地发出相同请求时,性能还是不错的。 CPU/网络等的值(value)也很低。
  • 网络问题(带宽、路由器、防火墙、负载平衡器):可能但不太可能,因为其他一切都运行稳定,而且我们的托管商也参与了分析。
  • Threadpool starvation:并非不可能,而是理论上的 - 当然我们有很多异步调用,但这对解决这个问题没有帮助吗?
  • HttpCompletionOption.ResponseHeadersRead:这本身不是问题,但也许是其中的一部分?

目前最好的解释集中在 ConnectionLimit:我们最近才开始设置上面提到的值,这似乎引发了问题。但为什么会这样?重用连接而不是为每个请求打开一个新连接不应该是一种改进吗?而且我们设置的值好像比较保守?

我们最近开始试验这些值,以了解它们对生产的影响。然而,我们仍然不清楚这是否是唯一的原因。我们希望采用更直接的分析方法。不幸的是,内存转储和 netstat 打印输出没有任何进一步的帮助。

我们将不胜感激关于如何分析或暗示可能原因的一些建议。

***** 编辑 *****

将连接限制设置为 1000 即可解决问题!所以问题仍然是为什么会这样?据我们所知,默认连接限制在非 Web 应用程序中为 2,在 Web 应用程序中为 1000。 MS 建议默认值为 CPU*12(但他们没有那样实现?!)所以我们的更改基本上是从 1000 到 48。我们仍然可以看到只有少数连接打开。有没有人可以对此有所了解?打开新连接、重用现有连接、流水线等的确切行为是什么?有这方面的信息来源吗?

最佳答案

ConnectionLimit 表示 ServicePointManager.DefaultConnectionLimit ?是的,这很重要。当该值为X时,如果已经有X个请求等待响应,则在之前的任何一个请求完成之前,不会发送新的请求。

关于c# - .NET HttpClient 的 Http 连接变慢或死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52737065/

有关c# - .NET HttpClient 的 Http 连接变慢或死锁的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  3. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  5. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  6. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  10. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

随机推荐