我有一个服务,它运行许多接收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;
}
有没有办法提高性能?这是预期的吗?
感谢您的帮助!