【问题标题】:Making multiple TCP connections from a single box for stress testing从一个盒子建立多个 TCP 连接以进行压力测试
【发布时间】:2012-08-26 12:46:39
【问题描述】:

我正在编写一个 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));
}

【问题讨论】:

标签: c# tcp stress-testing


【解决方案1】:

可能发生的情况是,当您在启动新线程之间没有延迟时,您的 CPU/网络负载会上升,并且每个线程需要更长的时间,因为每个线程都与其他线程共享 CPU 时间。

但是,当您以 2 秒的间隔启动每个线程时,您实际上是在允许每个线程在新线程开始之前完成。

如果您尝试打开太多 TCP 连接时 .NET 运行时没有给出某种类型的异常,我会感到惊讶。

无延迟方法是一个不错的压力测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 2015-10-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2014-01-08
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多