我目前正在编写一个小应用程序来加载测试一个网站,并有一些问题。
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
everything )时,responseDuration
保持在1到3秒之间。如果我将值增加到100
(如示例中所示),responseDuration
会快速上升,直到大约300个请求之后,它已经达到25秒(并且还在上升)。
我想我可能做错了什么,所以我也用标准的Apache jMeter设置运行了web测试计划,并将用户设置为100。经过大约300个样本后,响应时间猛增到大约40秒。
我怀疑我的服务器是否达到了极限。服务器上的任务管理器显示,只使用了16 2GB中的2GB,处理器挂起的工作量约为5%。
作为参考,运行上述代码的客户端计算机正在运行Windows 7,并且与我正在测试的服务器位于同一网络上。服务器正在运行Windows 2008IIS7.5,是一台专用的8核16 is机器.
发布于 2012-12-10 18:42:00
只有当您试图限制用作程序策略一部分的核心数量时,才应该使用MaxDegreeOfParallelism。
默认情况下,并行库利用了最多的可用线程--因此,将此选项设置为任意数目将限制性能,这取决于运行它的环境。
我建议您尝试在不设置此选项的情况下运行此代码,这将提高性能。
MSDN的ParallelOptions.MaxDegreeOfParallelism属性 -阅读备注部分以获得更多信息。
发布于 2012-12-12 11:16:17
若干建议:
https://stackoverflow.com/questions/13805525
复制相似问题