make as many HTTP requests to a URL as possible, as quickly as possible ürününü deniyorum..NET'te eşzamanlı HTTP isteği darboğazı nasıl belirlenir?
Bu Kuramı, Paralelizmin Maksimum Derecelerini azaltmama izin vermek için kullanıyorum, bu nedenle bir kerede çok sayıda ve çok sayıda Tasks
yumurtlayarak bellek taşımıyorum.
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);
}));
}
Bu iyi çalışıyor gibi görünüyor.
async Task Body()
{
var r = WebRequest.Create("// the url");
await r.GetResponseAsync();
}
Ancak, bir yerlerde bir darboğaz var gibi:
body()
esasen aşağı kaynar.
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
darboğaz daha az olduğunu göstermektedir görünmektedir: Ben dop
için değişen değerlerle, denemek ve 2500
yinelemeleri yaparsanız ben bu sonuçları elde. Ancak, dop~=100
'un üzerine çıktığınızda, her bir istekte (Func<T, Task> body
'un 2500
zamanını çalıştırmak için geçen sürenin ortalaması olan Average
), DOP
ile neredeyse doğrusal olarak arttığını fark edersiniz (bu sonuçlarda bir miktar gürültü kabul edilir, ancak tekrarlanabilirler) küçük hata ile).
Bu body
yaptığı işle içinde bir "kuyruk" doğru, orada olduğunu göstermektedir?
Zaten
ServicePointManager.DefaultConnectionLimit = int.MaxValue;
ayarlama ve ben
servicePoint = ServicePointManager.FindServicePoint("// the url", null);
ve eğer onun her zaman eşit dop
için (hariç body
her yürütme
servicePoint.CurrentConnections
izlemek ediyorum inital rampa yukarı ve kuyruk kapalı).
Bunu çeşitli ağlardan denedim, bu nedenle donanım tabanlı olması pek olası değil ve uzaktaki yükler için tasarlanan uzak sunucu olmamalıydı (konuştuğum rakamlar bile ağır değil)
Ne yaptığımı daha iyi nasıl söyleyebilirim?
burada bir çok olasılık vardır, ama benim ilk tahminim Windows eşzamanlı bağlantı sınırı düşüyoruz olurdu.Başka bir olasılık ise, sunucunun donanımı bağlantılarınızı potansiyel bir DOS saldırısı olarak ele almak ve onları kısmaktır. –
Ne hakkında? İstek veya toplam başına mı? Ölçme kodunu yaz. – usr
@usr Vücudun çalıştırılması için ortalama süre 2500 kez, hasta soruyu açıklığa kavuşturun –