当前位置: 首页 > 知识库问答 >
问题:

使用HttpClient的并发请求比预期的要长

包兴思
2023-03-14
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

namespace CallTest
{
    public class Program
    {
        private static readonly HttpClient _httpClient = new HttpClient(new HttpClientHandler { Proxy = null, UseProxy = false });

        static void Main(string[] args)
        {
            ServicePointManager.DefaultConnectionLimit = 100;
            ServicePointManager.Expect100Continue = false;

            // warmup
            CallSomeWebsite().GetAwaiter().GetResult();
            CallSomeWebsite().GetAwaiter().GetResult();

            RunSequentiell().GetAwaiter().GetResult();

            RunParallel().GetAwaiter().GetResult();
        }

        private static async Task RunParallel()
        {
            var tasks = new List<Task>();
            for (var i = 0; i < 300; i++)
            {
                tasks.Add(CallSomeWebsite());
            }
            await Task.WhenAll(tasks);
        }

        private static async Task RunSequentiell()
        {
            var tasks = new List<Task>();
            for (var i = 0; i < 300; i++)
            {
                await CallSomeWebsite();
            }
        }

        private static async Task CallSomeWebsite()
        {
            var watch = Stopwatch.StartNew();
            using (var result = await _httpClient.GetAsync("http://example.com").ConfigureAwait(false))
            {
                // more work here, like checking success etc.
                Console.WriteLine(watch.ElapsedMilliseconds);
            }
        }
    }
}

我如何才能为并行请求获得相同的性能?这是线程池问题吗?

共有1个答案

彭涵衍
2023-03-14

NET Core2.1已经修复了此行为。我认为问题是HttpClient使用的底层windows WinHTTP处理程序。

在.NET Core 2.1中,他们重写了HttpClientHandler(请参见https://blogs.msdn.microsoft.com/dotnet/2018/04/18/performance-in-net-core-2-1/#user-content-networking):

在.NET Core 2.1中,HttpClientHandler有一个新的默认实现,它完全在C#中实现,而不是在其他System.NET库(例如System.Net.Sockets、System.Net.Security等)之上。这不仅解决了前面提到的行为问题,还显著提高了性能(该实现还作为SocketsHttpHandler公开,可以直接使用它而不是通过HttpClientHandler来配置SocketsHttpHandler特定的属性)。

这最终消除了问题中提到的瓶颈。

在.NET Core2.0上,我得到以下数字(以毫秒为单位):

Fetching URL 500 times...
Sequentiell   Total: 4209, Max:  35, Min: 6, Avg:  8.418
Parallel      Total:  822, Max: 338, Min: 7, Avg: 69.126

但是在.NET Core2.1上,单个并行HTTP请求似乎有了很大的改进:

Fetching URL 500 times...
Sequentiell   Total: 4020, Max:  40, Min: 6, Avg:  8.040
Parallel      Total:  795, Max:  76, Min: 5, Avg:  7.972
 类似资料:
  • 我使用jmeter来生成一个性能测试,为了保持简洁,我从一个json文件中读取初始数据,我有一个单线程组,在读取数据后,我在其中随机设置某些值,以防止需要时数据重复,然后我使用变量将最终数据传递给endpoint,这将最终在一个由endpoint接收的json主体中,它基本上将在数据库中生成一个新的事务。此外,我添加了一个常量计时器,在请求之间添加了7秒的延迟,测试持续时间为10分钟,没有上升,我

  • 我需要一个java程序来生成以下请求。我正在使用Apache HttpClient Library,但仍然无法生成这样的请求: 这是我的python程序生成的,我编写了一个等效的java程序。但它扔403。 2012-09-10 15:12:05G信息:G2OAuth auth data=“3,0.0.0,0.0.0,1347289925,3223833979,crlakamai”2012-09-

  • 问题内容: 我有类似以下内容: 它不断返回500。服务提供商说我需要发送JSON。Apache HttpClient 3.1+如何完成? 问题答案: Apache HttpClient对JSON一无所知,因此您需要分别构造JSON。为此,我建议从json.org检出简单的JSON- java 库。(如果“ JSON- java”不适合您,则json.org列出了大量可用不同语言提供的库。) 生成J

  • 我有一个WPF应用程序,需要从远程API检索配置数据。该API已经过测试,并且工作正常,返回我认为是正确的格式。我已经为响应等创建了一个数据类型,但是当我到达通过HttpClient获取响应的行时,它不会向API发送任何请求。 数据类型:- 我已经在API上运行了日志,我们没有看到请求,如果我们使用相同的代码模型调用另一个API控制器来调用Uri2(https://example.com/API/

  • 我向运行在IIS中的本地网站提出以下请求 这将生成以下响应头: HTTP/1.1 200 OK Accept-Ranges: bytes Date: Mon,03 Jun2013 22:34:25GMT ETag:"50c7472eb342ce1:0" Server: Microsoft-IIS/8.0 X-Powerd-By: ASP. NET 通过Fiddler发出的相同请求会产生以下响应头(

  • 我正在创建一个数据下载程序,自从使用httpClient以来,它一直给我带来问题 此代码将所需的所有变量附加到URL: } 每当我调用openSession时,它都会以一种简单的方式打印出标题(这正是我需要它做的)。。。 这打印了一个单行,但当我提出另一个打印长行的请求时,它总是带来这个错误: 这是第二个出现错误的请求: 我在currencyPairsRequest()中是否做错了什么?谢谢你花时