2012-08-31 72 views
1

我正在編寫一個C#NUnit測試,該測試可以同時向服務器發送100個TCP連接。測試的目的是強調服務器。從一個盒子進行多個TCP連接以進行壓力測試

要做到這一點,測試會創建100個新線程,循環它們並調用thread.Start(),然後再循環它們並調用thread.Join()

每個線程都會執行一個方法,使TCP連接,請求一些數據,檢查接收到的數據是否不爲空,然後打印完成需要多長時間。

我注意到,有100個連接,每個線程完成其任務所需的時間從2秒增加到50秒,對於稍後寫入控制檯的線程。但是,當我在每次調用thread.Start()之間引入2秒的延遲時,每個線程所需的時間爲2秒。

W.r.t.沒有延遲的情況下,我想知道是否所需時間的增加可能是由於運行單元測試的機器(即我的開發盒)的問題。例如,由於資源的限制,.NET/Windows 7可能不會一個接一個地創建100個TCP連接。

請問有人有關於TCP編程的知識嗎?我可以使用哪些工具來確定我的開箱是否是瓶頸?

目標是要知道結果是否實際上是服務器的有效壓力測試結果。

public void ServerStressTest() 
{ 
    const int NUMBER_OF_REQUESTS = 10; 
    const int DELAY_BETWEEN_REQUESTS = 0; 
    var threads = new System.Collections.Generic.List<Thread>(); 
    var urls = new StaticDataUrls(); 

    Console.WriteLine(string.Format("Requesting static data from the server {0} times with {1} seconds delay between subsequent requests...", NUMBER_OF_REQUESTS, DELAY_BETWEEN_REQUESTS)); 

    for (int i = 0; i < NUMBER_OF_REQUESTS; i++) 
    { 
     var callNumber = i; // prevent access to modified closure 
     threads.Add(new Thread(() => FetchStaticData(urls, callNumber))); 
    } 

    threads.Apply(t => 
         { 
          Thread.Sleep(DELAY_BETWEEN_REQUESTS * 1000); 
          t.Start(); 
         }); 

    threads.Apply(t => t.Join()); 
} 

private void FetchStaticData(StaticDataUrls urls, int callNumber) 
{ 
    var restAdapter = new RestAdapter(true, new Log4NetLogger(GetType())); 

    var stopwatch = Stopwatch.StartNew(); 
    var underlyingResults = restAdapter.Get(urls.UnderlyingUrl); 
    var clientResults = restAdapter.Get(urls.ClientUrl); 
    stopwatch.Stop(); 

    var missingData = new System.Collections.Generic.List<string>(); 
    if(string.IsNullOrEmpty(clientResults.ResponseData)) missingData.Add("client"); 
    if(string.IsNullOrEmpty(underlyingResults.ResponseData)) missingData.Add("underlying"); 

    Console.WriteLine(missingData.Count > 0 
          ? string.Format("Call {0}: No {1} data received in {2} seconds", callNumber, string.Join(", ", missingData.ToArray()), stopwatch.Elapsed.Seconds) 
          : string.Format("Call {0}: Completed with all data in {1} seconds", callNumber, stopwatch.Elapsed.Seconds)); 
} 
+1

您是否設置了最大連接數?我認爲默認值很低。看看這裏:http://stackoverflow.com/questions/3577738/maxconnections-and-app-config-question – mittmemo

回答

1

什麼是可能發生的事情是,當你有開始新的線程之間沒有延遲,你的CPU /網絡負荷上升,每個線程需要更長的時間,因爲每個線程與其他線程共享CPU時間。

但是,如果每隔2秒啓動一個線程,則基本上允許每個線程在新線程開始之前完成。

如果您嘗試打開太多的TCP連接,.NET運行時沒有提供某種類型的異常,我會感到驚訝。

無延遲方法是一個體面的壓力測試。