我目前正在编写一个小应用程序来加载测试网站并遇到一些问题。
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秒(并且仍在攀升)。
我认为我可能做错了所以我也使用标准Apache jMeter设置运行web test plan并将用户设置为100.在大约300个样本之后,响应时间飙升到大约40秒。
我对我的服务器达到极限持怀疑态度。服务器上的任务管理器显示,只有2GB的16GB正在使用,处理器的工作量大约为5%。
作为参考,运行上述代码的客户端计算机运行的是Windows 7,并且与我正在测试的服务器位于同一网络上。该服务器运行的是Windows Server 2008 IIS 7.5,是一台专用的8核16GB RAM计算机。
答案 0 :(得分:2)
只有当您尝试限制要用作程序策略一部分的核心数时,才应使用MaxDegreeOfParallelism。
默认情况下,并行库使用大量可用线程 - 因此将此选项设置为任何数字主要会限制性能,具体取决于运行它的环境。
我建议您尝试运行此代码而不设置此选项,这样可以提高性能。
ParallelOptions.MaxDegreeOfParallelism Property in MSDN - 阅读备注部分以获取更多信息。
答案 1 :(得分:1)
几点建议: