2015-12-27 32 views
5

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?

+0

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. –

+0

Ne hakkında? İstek veya toplam başına mı? Ölçme kodunu yaz. – usr

+0

@usr Vücudun çalıştırılması için ortalama süre 2500 kez, hasta soruyu açıklığa kavuşturun –

cevap

1

Tüm bu çalışma seviyelerini 9 ile 11 saniye arasında gerçekleştirecek toplam süre. Bu mantıklıdır çünkü DOP'u artırırken (üstel olarak), sonunda arka uç kaynağını veya ağı ya da başka bir şeyi doyuracaksınız. Eğer biz yüksek toplam kez görecekti alt DOP kriter numaraları yayınlanmıştır olsaydı

Eminim.

ortalama tamamlanma süresi iki katına bu noktada eşzamanlı istek sayısını iki katına

. saniye veya alınan toplam süre başına öğeler olarak ölçülen zaman oranında

bak. Bu ilginç bir metrik. Öğe başına gecikme değil.

+0

Evet, pek çok test yaptım ve sonuçları kıskançlıktan çektim. <75 dop, beklediğiniz toplam süreyi doğrusal olarak artırır. Muhtemelen öğeler/ler için öğeleri tamamladığını ölçmeliyim. Queicepoint.currentconnections her zaman == dop, queuing kodumdan daha derin görünüyor. –

+0

Bunu ölçmek için kullanılan tüm kodları kaydeder misiniz? Bu sayıların neyi temsil ettiği belli değil. Ayrıca, beklediğiniz sonuçları söyleyebilir misiniz? – usr

+0

İşte benim kodum, AWS SES servisini kullanarak (1000/s istek göndermesine izin verildim - bundan sonra daraltmalıyım) https://gist.github.com/trullock/a112885d374a081aee4d –