【问题标题】:HttpClient.GetAsync() CPU consumption is highHttpClient.GetAsync() CPU消耗高
【发布时间】:2015-05-18 20:34:16
【问题描述】:

我有一个服务,它使用 HttpClient 类从其他服务中获取一些资源。作为我们性能测试的一部分,我们模拟了 HttpClient.GetAsync() 调用以从外部服务中删除依赖项,并将其替换为从本地磁盘返回内容的方法。令人惊讶的是 CPU 利用率从 65% 变为 22%。因此,在没有 mock 的情况下进行性能测试时,CPU 利用率为 65%,而有了 mock 则降至 22%。 但 RPS 保持不变

另外,当我开始增加负载时,CPU 利用率和 RPS 上升,我认为这是意料之中的。

我的问题是 - HttpClient.GetAsync() 是一个如此昂贵的操作吗?如果是,那么我如何通过性能分析来确认这一点?哪个工具可以帮助我。

注意:性能测试使用 Visual Studio 负载测试框架以每秒 100 个用户负载运行。

谢谢, 贾维德

【问题讨论】:

  • 您是否真的使用了分析器来查看所花费的时间?
  • 您可以为负载测试增加 HttpClient 的 DefaultConnectionLimit :ServicePointManager.DefaultConnectionLimit = 20;
  • 另外,请务必尽可能使用 ConfigureAwait(false)
  • 你的模拟类使用thread.sleep吗?
  • @Ewan,不,我在模拟类中使用 Task.Delay。

标签: c# performance-testing dotnet-httpclient


【解决方案1】:

我通常构建我的请求并使用HttpClient.SendAsync(request),并且很少注意到 CPU 使用率的任何峰值。此外,每秒 100 个请求是一大堆请求。考虑重新设计您的架构,使其在重负载下表现得更好。诸如减少对HttpClient.SendAsyncHttpClient.GetAsync 的调用次数之类的事情将提高您的性能。您还可以考虑在一组服务器之间进行负载平衡,以减少响应时间和 CPU 负载。另一个考虑因素是缓存对您与之交互的外部服务的响应,以减少外部 HTTP 调用。然后,您可以依赖缓存的响应,直到需要刷新缓存。

【讨论】:

  • 感谢您的建议。我们不能限制对 HttpClient 的调用次数,因为这可能是我们网站上的流量。此外,我们正在使用缓存技术来提高性能。我们也有适当的负载平衡
猜你喜欢
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
相关资源
最近更新 更多