我目前正在编写一个小型应用程序来对网站进行负载测试,但遇到了一些问题。
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% 的工作量。
- 我可以在客户端计算机上的同时连接数上达到一些限制吗?如果是这样,我该如何改变?
- 我是否忘记在我的代码中做某事?清理/关闭连接?
- 难道是我的代码没问题,实际上是我的服务器无法处理流量?
作为参考,运行上述代码的客户端计算机正在运行 Windows 7,并且与我正在测试的服务器位于同一网络上。该服务器运行 Windows Server 2008 IIS 7.5,是一台专用的 8 核 16GB RAM 机器。