2012-08-31 1 views
1

서버에 동시에 100 개의 TCP 연결을 만드는 C# NUnit 테스트를 작성하고 있습니다. 이 테스트의 목적은 서버에 압력을 가하는 것입니다.스트레스 테스트를 위해 단일 상자에서 여러 TCP 연결 만들기

이렇게하려면 테스트를 통해 100 개의 새 스레드가 만들어지고 반복되고 thread.Start()이 호출 된 다음 다시 반복되고 thread.Join()가 호출됩니다.

각 스레드는 TCP 연결을 만들고 일부 데이터를 요청하며 수신 된 데이터가 null이 아닌지 확인한 다음 완료하는 데 걸린 시간을 인쇄합니다.

내가 알아챈 점은 100 개의 연결에서 각 스레드가 작업을 완료하는 데 필요한 시간이 나중에 콘솔에 쓰는 스레드에 대해 2 초에서 50 초로 증가한다는 것입니다. 그러나 thread.Start()에 대한 각 호출 사이에 2 초 지연을 도입하면 모든 단일 스레드에 대해 2 초가 소요됩니다.

w.r.t. 지연 시간이없는 시나리오인데, 필자는 필요한 시간의 증가가 단위 테스트 (예 : 내 개발자)가 실행되는 시스템의 문제로 인한 것인지 궁금합니다. 예를 들어, 아마도 .NET/Windows 7은 자원 확보로 인해 차례대로 100 개의 TCP 연결을 만들 수 없습니다.

TCP 프로그래밍에 대한 지식이있는 사람이 제발 코멘트 할 수 있습니까? devbox가 bottle neck인지 확인하기 위해 어떤 툴을 사용할 수 있습니까?

결과는 결과가 실제로 서버에 대한 유효한 스트레스 테스트 결과인지 여부를 확인하는 것입니다. 가능성이 일어나고 무엇

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

최대 연결 수를 설정 했습니까? 나는 디폴트가 꽤 낮다고 생각한다. Look here : http://stackoverflow.com/questions/3577738/maxconnections-and-app-config-question – mittmemo

답변

1

는 새로운 스레드를 시작 사이에 지연이 없을 때, 당신의 CPU/네트워크 부하가 상승한다는 것입니다 각 스레드가 다른 스레드에 CPU 시간을 공유하는 각 스레드는 더 오래 걸립니다.

그러나 각 스레드를 2 초 간격으로 시작하면 기본적으로 새 스레드가 시작되기 전에 각 스레드를 완료 할 수 있습니다.

너무 많은 TCP 연결을 열려고하면 .NET 런타임에서 일부 유형의 예외를주지 않으면 놀라실 것입니다.

지연 방지 방법은 알맞은 스트레스 테스트입니다.

관련 문제