【发布时间】:2018-10-03 19:13:08
【问题描述】:
我有一个同时接收多个请求的网络服务。对于每个请求,我都需要调用另一个 web 服务(身份验证的东西)。问题是,如果同时发生多个 (>20) 请求,响应时间会突然变得更糟。
我做了一个示例来演示这个问题:
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);
}
}
}
}
顺序调用没问题。它们需要几毫秒才能完成,响应时间基本相同。
但是,并行请求开始花费的时间越来越长,发送的请求越多。有时甚至需要几秒钟。我在 .NET Framework 4.6.1 和 .NET Core 2.0 上对其进行了测试,结果相同。
更奇怪的是:我使用 WireShark 跟踪 HTTP 请求,它们总是在同一时间进行。 但示例程序报告的并行请求值比 WireShark 高得多。
我怎样才能获得相同的并行请求性能?这是线程池问题吗?
【问题讨论】:
-
澄清一下,
DefaultConnectionLimit设置为 100,您仍然看到 25 个并发请求的速度变慢了吗?你确定服务器没有限制你吗? -
@StephenCleary 是的,问题仍然存在。服务器没有限制我,WireShark 报告所有请求完成的时间比我们在控制台输出中看到的要短。
标签: c# dotnet-httpclient