I have a webservice which receives multiple requests at the same time. For each request, I need to call another webservice (authentication things). The problem is, if multiple (>20) requests happen at the same time, the response time suddenly gets a lot worse.
I made a sample to demonstrate the problem:
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); } } } } Sequential calls are no problem. They take a few milliseconds to finish and the response time is mostly the same.
However, parallel request start taking longer and longer the more requests are being sent. Sometimes it takes even a few seconds. I tested it on .NET Framework 4.6.1 and on .NET Core 2.0 with the same results.
What is even stranger: I traced the HTTP requests with WireShark and they always take around the same time. But the sample program reports much higher values for parallel requests than WireShark.
How can I get the same performance for parallel requests? Is this a thread pool issue?
DefaultConnectionLimitset to 100, you're still seeing a slowdown for 25 concurrent requests? Are you sure the server isn't throttling you?