【问题标题】:Asp.Net HttpClient PerformanceAsp.Net HttpClient 性能
【发布时间】:2014-02-10 22:52:19
【问题描述】:

我正在使用 Visual Studios 负载测试项目进行负载/压力测试,当前用户设置为 10 非常低。该应用程序向 WebAPI 服务层/应用程序发出多个 System.Net.Http.HttpClient 请求(在某些情况下调用另一个 WebApi 层/应用程序),并且在测试单个 MVC4 控制器(不解析依赖请求)时,它仅获得大约 30 个请求/秒。

这些数字基于一个示例项目,其中除了 HttpClient 调用之外的任何层都没有执行任何实际代码,并构建了一个新的模型集合以返回(因此,一些序列化也作为 WebApi 的一部分发生)。我已经尝试过使用和不使用异步控制器,结果似乎非常相似(使用异步控制器略有改进)

缓存调用显然会显着增加(大约 400 RPS),尽管数据和流量的性质意味着在现实世界场景中不会缓存大量调用。

HttpClient(或一般的 HTTP 层)是否过于昂贵,或者您有什么想法可以提高吞吐量?

可能值得注意的是,在我的本地开发机器上,这个负载测试也会最大限度地利用 CPU。任何想法或建议将不胜感激?

【问题讨论】:

  • 当涉及的变量如此之多时,很难提供建设性的反馈。您的服务是否全部运行在同一台机器上,不同的机器上,有多少网络跃点,您是否跨域等等?您的请求可能会有很多延迟,因为您正在谈论调用可能调用其他 Web API 服务的 Web API 服务。
  • 我已经看到 HttpClient 在开发机器上针对本地 Web api 执行 12000 个请求/秒。然而,有很多因素需要考虑。 HttpClient 不应该增加很多开销。
  • 示例应用程序包括一个应用程序中的所有层,所有层都在我的开发机器上本地运行。很高兴听到您已经看到 12000 HttpClients req/sec。

标签: asp.net asp.net-mvc-4 asp.net-web-api load-testing dotnet-httpclient


【解决方案1】:

HttpClient 有一个内置的默认 2 个并发连接。

您是否更改了默认设置?

this answer

我相信如果你追查 HTTPClient 的 deps,你会发现它依赖于 ServicePointManager 的设置。

this link

您可以通过调用System.Net.ServicePointManager.DefaultConnectionLimit更改默认连接限制

【讨论】:

  • 在某些情况下,您必须显式设置 DefaultConnectionLimit 才能对 HttpClient 产生影响。我的经验是,除非您设置它,否则您将看到无限数量的连接,这实际上会使您的性能变得更糟。
  • 你能定义这些场景吗?我一直看到强制执行 2 连接默认...
  • 尝试从控制台应用程序使用 httpclient。
  • 我的印象是限制不适用于对 localhost 的调用?也许我应该更清楚的是,所有层目前都在一个简单的示例应用程序中,所有应用程序都在本地运行。
【解决方案2】:

您可以增加 http 客户端的并发连接数。默认连接限制为 2。为了找到最佳连接,请尝试使用公式 12* 计算机上的 CPU 数。

在代码中:在代码中:

ServicePointManager.DefaultConnectionLimit = 48;  

或者在 Api.config 或者 web.config 文件中

<system.net>
    <connectionManagement>
      <add address="*" maxconnection="48"/>
    </connectionManagement>
  </system.net>

查看link了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多