多线程.NET HTTPClient并发请求会降低性能

时间:2018-01-31 12:08:09

标签: c# .net multithreading concurrency dotnet-httpclient

我有一个服务,它运行许多接收Protobuf消息的简单套接字,通常包括发送到单个远程REST服务位置的请求。每个线程都有它自己使用的HttpClient实例。  当以非常高的速率运行单个线程时,性能似乎表现得如预期,响应速度非常快。如果我允许多个并发请求,即。要求发送两个不同的线程,性能大幅下降。添加更多线程的行为类似。

我已设置默认连接限制并设置线程池最小线程:

             ServicePointManager.DefaultConnectionLimit = 1000;

            ThreadPool.SetMinThreads(20, 20);

我设置了一个接受请求的.NET Core简单REST服务,只返回一个简单的200响应,因此我可以消除外部服务作为问题的一部分,我看到完全相同的结果 - 增加了更多的时间线程在某个阈值(sub 200ms)使用。

在.NET Core Rest日志输出中,我看到执行动作时间增加,从非常快(<10ms)到50 +,100 + ms,因为请求以高速率进入(即没有睡眠收到请求后每个线程200ms)。

我不清楚这里发生了什么。有没有办法提高并发HttpClient请求性能?

部分代码:

    public void OpenPorts(int port, IServiceCommunication)
    {
        if (Logger.IsDebugEnabled)
            Logger.Debug("Opening port " + port);

         Task.Factory.StartNew(() => { SocketThreadPort("tcp://*:" + port, serviceToUse); });
    }
}

private async void SocketThreadPort(string port, IServiceCommunication externalService)
    {
        int threadId = (int)AppDomain.GetCurrentThreadId();
        int managedThreadId = Thread.CurrentThread.ManagedThreadId;
        Console.WriteLine("ThreadId = " + threadId);
        Console.WriteLine("ManagedThreadId = " + managedThreadId);
        while (true)
        {
            if (Logger.IsDebugEnabled)
                Logger.Debug("Sending on " + port);
            var reply = await externalService.Send(sendingData).ConfigureAwait(false);
        }
}

IServiceCommunication只是HttpClient的一个包装器,用于所有意图和目的。这是发送:

    public async Task<HttpResponseMessage> SendHttpRequest(HttpRequestMessage request)
    {
        var result = await _httpClient.SendAsync(request).ConfigureAwait(false);
        return result;
    }

有没有办法提高性能?这是预期的吗?

感谢您的帮助!

0 个答案:

没有答案