如何确定.NET中并发HTTP请求的瓶颈

本文关键字:请求 HTTP 并发 何确定 NET | 更新日期: 2023-09-27 18:28:07

我正在尽可能多地、尽可能快地向URL发出HTTP请求。

我使用这段代码来限制最大并行度,这样我就不会因为一次生成大量的Tasks而溢出内存。

    public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body)
    {
        return Task.WhenAll(
            from partition in Partitioner.Create(source).GetPartitions(dop)
            select Task.Run(async delegate {
                using (partition)
                    while (partition.MoveNext())
                        await body(partition.Current);
            }));
    }

这似乎运行良好。

body()本质上可以归结为:

async Task Body()
{
    var r = WebRequest.Create("// the url");
    await r.GetResponseAsync();
}

然而,我似乎在某个地方遇到了瓶颈。如果我尝试进行2500迭代,dop的值不同,我会得到以下结果:

DOP: 50
Total Time: 00:00:14.4801781
Average (ms): 246.6088
StDev: 84.1327983759009
DOP: 75
Total Time: 00:00:09.8089530
Average (ms): 265.758
StDev: 110.22912244956
DOP: 100
Total Time: 00:00:11.9899793
Average (ms): 344.9168
StDev: 173.281468939295
DOP: 200
Total Time: 00:00:09.1512825
Average (ms): 627.0492
StDev: 572.616238312676
DOP: 500
Total Time: 00:00:09.3556978
Average (ms): 1361.5328
StDev: 1798.70589239157
DOP: 750
Total Time: 00:00:12.6076035
Average (ms): 2009.058
Normal Total: 5022646
StDev: 2348.20874093199

DOP: 1000
Total Time: 00:00:11.4721195
Average (ms): 2453.782
StDev: 2481.56238190299
DOP: 2000
Total: 00:00:11.6039888
Average (ms): 4100.5536
StDev: 2459.36983911063

这似乎表明dop=50小于瓶颈。然而,当您达到dop~=100以上时,您会注意到每个请求所花费的Average时间(即Func<T, Task> body运行2500次所花费的平均时间)几乎与DOP线性增加(诚然,这些结果中有一些噪声,但它们是可重复的,误差很小)。

这表明body正在做的工作中有一个"队列",对吧?

我已经在设置了

ServicePointManager.DefaultConnectionLimit = int.MaxValue;

如果我做

servicePoint = ServicePointManager.FindServicePoint("// the url", null);

并监控

servicePoint.CurrentConnections 

在每次执行body时,它总是等于dop(除了初始斜坡上升和尾部下降)。

我已经在各种网络中尝试过,所以它不太可能是基于硬件的,也不应该是远程服务器,因为它是为繁重的入站负载而设计的(并不是说我所说的数字甚至很重)

如何更好地描述我正在做的事情?

如何确定.NET中并发HTTP请求的瓶颈

执行所有工作级别的总时间在9到11秒之间。这是有道理的,因为当DOP(指数级)增加时,您最终会使后端资源或网络或其他东西饱和。

我敢打赌,如果你发布了更低的DOP基准数字,我们会看到更高的总时间。

当您将此时的并发请求数增加一倍时,平均完成时间将增加一倍。

查看以每秒项目数或所花费的总时间为单位的吞吐量。这是一个有趣的指标。每个项目的延迟不是。