【问题标题】:Force 100% CPU usage on server在服务器上强制 100% 的 CPU 使用率
【发布时间】:2014-08-07 04:14:13
【问题描述】:

我有一个 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。这就是我要的。我需要尽快完成这些大型计算

我的 1 个服务器是 C3.8XLARGE
英特尔至强 E5-2680 v2(常春藤桥)处理器
vCPU:32
内存(GiB):60

在这台服务器上,CPU 利用率从不超过 60%,而且运行非常缓慢。

什么可能导致这种情况仅在此服务器上发生?如何解决问题?

【问题讨论】:

  • 听起来这个问题更适合serverfault.com
  • @p.s.w.g "Server Fault 是一个面向专业系统和网络管理员的问答网站"。这似乎与管理无关,它与编程直接相关。 Stack Overflow 对我来说似乎很好。
  • 60% 并不意味着它的处理速度较慢。也许 XEON 比您的其他服务器快得多,以至于 CPU 不再是瓶颈。这要么意味着实际处理时间更快,要么其他硬件组件会造成瓶颈。
  • 当您正在考虑将系统资源分配给正在运行的应用程序时,这似乎是服务器管理问题。
  • 不,这(还)不是Server Fault 的问题。你需要先做很多很多的调试。我已投票决定重新打开它。

标签: c# asp.net amazon-ec2 parallel-processing


【解决方案1】:

问题可能在于“ForAll”方法及其扩展方式。

要拥有 100% 的 CPU,每个核心应该有 1 个线程来执行非常繁重的任务。

TPL 在内部创建任务,并有一个默认的 TaskScheduler 类来处理请求并将其委托给线程池。也许那里有一些滞后。

我会创建一种不同的方法来手动创建线程或任务(每个内核 1 个)。如果您仍然没有获得 100% 的 CPU,我认为服务器故障是个好主意。可能与物理/虚拟机或服务器中的某些限制有关。

【讨论】:

    猜你喜欢
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多