2

我目前正在编写一个小型应用程序来对网站进行负载测试,但遇到了一些问题。

List<string> pageUrls = new List<string();
// NOT SHOWN ... populate the pageUrls with thousands of links

var parallelOptions = new System.Threading.Tasks.ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = 100;
System.Threading.Tasks.Parallel.ForEach(pageUrls, parallelOptions, pageUrl =>
{
    var startedOn = DateTime.UtcNow;

    var request = System.Net.HttpWebRequest.Create(pageUrl);

    var responseTimeBefore = DateTime.UtcNow;

    try
    {
        var response = (System.Net.HttpWebResponse)request.GetResponse();
        responseCode = response.StatusCode.ToString();
        response.Close();
    }
    catch (System.Net.WebException ex)
    {
        // NOT SHOWN ... write to the error log
    }

    var responseTimeAfter = DateTime.UtcNow;

    var responseDuration = responseTimeAfter - responseTimeBefore;

    // NOT SHOWN ... write the response duration out to a file

    var endedOn = DateTime.UtcNow;

    var threadDuration = endedOn - startedOn;

    // sleep for one second
    var oneSecond = new TimeSpan(0, 0, 1);
    if (threadDuration < oneSecond)
    {
        System.Threading.Thread.Sleep(oneSecond - threadDuration);
    }
}
);

当我将 设置MaxDegreeOfParallelism为低值(例如10一切正常)时,responseDuration保持在 1 到 3 秒之间。如果我将值增加到100(如示例中),则responseDuration爬升很快,直到大约 300 次请求后,它已达到 25 秒(并且仍在爬升)。

我认为我可能做错了什么,所以我还使用标准Web 测试计划设置运行了Apache jMeter ,并将用户数设置为 100。在大约 300 个样本之后,响应时间飙升至大约 40 秒。

我怀疑我的服务器是否达到了极限。服务器上的任务管理器显示 16GB 中只有 2GB 正在使用,处理器挂起大约 5% 的工作量。

  1. 我可以在客户端计算机上的同时连接数上达到一些限制吗?如果是这样,我该如何改变?
  2. 我是否忘记在我的代码中做某事?清理/关闭连接?
  3. 难道是我的代码没问题,实际上是我的服务器无法处理流量?

作为参考,运行上述代码的客户端计算机正在运行 Windows 7,并且与我正在测试的服务器位于同一网络上。该服务器运行 Windows Server 2008 IIS 7.5,是一台专用的 8 核 16GB RAM 机器。

4

2 回答 2

2

MaxDegreeOfParallelism 应仅在您尝试限制要用作程序策略的一部分的内核数量时使用。

默认情况下,Parallel 库使用最多的可用线程 - 因此将此选项设置为任意数量主要会限制性能,具体取决于运行它的环境。

我建议您在不设置此选项的情况下尝试运行此代码,这样可以提高性能。

MSDN 中的 ParallelOptions.MaxDegreeOfParallelism 属性- 阅读备注部分了解更多信息。

于 2012-12-10T18:42:00.340 回答
1

几个建议:

  1. 您录制的 Jmeter 测试脚本有多大,您是否插入了一些思考时间?测试越大,负载越重。
  2. 确保 LAN 在测试运行期间没有被竞争流量使用。拥有千兆以太网交换机应该是强制性的。
  3. 一定要使用 2-3 台从机,并避免在 Jmeter 中使用大量的结果记录器,比如树。你将这些图表和结果最小化是对的。
于 2012-12-12T11:16:17.473 回答