私はmake as many HTTP requests to a URL as possible, as quickly as possibleにしようとしています。.NETでの同時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();
}
しかし、私はどこかにボトルネックを持っているようです。
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
のためにさまざまな値を使用して、試してみて、2500
繰り返しを行う場合、私はこれらの結果を取得します。しかし、あなたがdop~=100
を超えると、が実行するのに要する時間の平均(つまり、2500
時間の平均)はDOP
でほぼ直線的に増加します(これらの結果にノイズはほとんどありませんが、小さな誤差で)。
これは、「キュー」は仕事body
の内側に存在することを示唆しているが、右、しているのですか?
を除いて(私はすでに
ServicePointManager.DefaultConnectionLimit = int.MaxValue;
を設定していると私は
servicePoint = ServicePointManager.FindServicePoint("// the url", null);
を行うとbody
の各実行に
servicePoint.CurrentConnections
を監視する場合、dop
にその常に等しいです最初のランプアップとテールオフ)。
私はこれをさまざまなネットワークから試しました。そのため、ハードウェアベースである可能性は低く、重いインバウンド負荷用に設計されたリモートサーバであってはいけません。 )
私が行っていることをどのようにプロファイルすることができますか?
ここにはたくさんの可能性がありますが、私の最初の推測は、Windowsの同時接続制限を打つことです。もう1つの可能性は、サーバのハードウェアがあなたの接続を潜在的なDOS攻撃として扱い、それらを抑制することです。 –
平均何ですか?要求ごとにまたは合計で?測定コードを記入してください。 – usr
@usr 'body'を2500回実行する平均時間は、質問を明確にしてください –