我正在编写一个C#NUnit测试,它可以与服务器建立100个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));
}
答案 0 :(得分:1)
可能发生的情况是,当您在启动新线程之间没有延迟时,您的CPU /网络负载会上升,并且每个线程需要更长时间,因为每个线程与其他线程共享CPU时间。
然而,当你开始每个线程相隔2秒时,基本上允许每个线程在新线程开始之前完成。
如果尝试打开太多TCP连接,.NET运行时没有提供某种类型的异常,我会感到惊讶。
无延迟方法是一个不错的压力测试。