서버에 동시에 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));
}
최대 연결 수를 설정 했습니까? 나는 디폴트가 꽤 낮다고 생각한다. Look here : http://stackoverflow.com/questions/3577738/maxconnections-and-app-config-question – mittmemo