我有一个C#ASP.NET应用程序,它运行一些冗长的模拟并且并行执行。像这样......
static void Main(string[] args)
{
var myArray = new[] {450, 586, 879, 457, 657, 852, 407, ... };
myArray.AsParallel().ForAll(DoStuff);
}
static void DoStuff(int number)
{
//do stuff
}
在本地运行时,以及在我的大多数服务器(Amazon EC2实例)上运行时,执行此代码将使用100%的CPU。这就是我要的。我需要尽快完成这些大型计算
我的服务器中有一个是C3.8XLARGE
Intel Xeon E5-2680 v2(Ivy Bridge)处理器
vCPU:32
mem(GiB):60
在此服务器上,CPU利用率从未超过60%且运行速度非常慢。
只有这台服务器才会导致这种情况发生?我该如何排除故障?
答案 0 :(得分:0)
问题可能在于“ForAll”方法以及它如何扩展。
要拥有100%的CPU,每个核心应该有1个线程执行非常繁重的操作。
TPL在内部创建任务,并有一个默认的TaskScheduler类来处理请求并将其委托给线程池。也许那里有一些滞后。
我创建了一种手动创建线程或任务的不同方法(每个核心1个)。如果你仍然没有100%的CPU,我认为服务器故障是个好主意。可能与物理/虚拟机或服务器中的某些限制有关。