繁体   English   中英

与Parallel.ForEach一起限制CPU使用率

[英]Limit CPU usage in conjunction with Parallel.ForEach

我需要的 :

我需要在多线程中运行一个方法数组,每个核心最多1个线程。 这些线程中的每一个都需要具有限制功能,以便能够限制所有线程的CPU使用率。 如果我在运行3个线程的4个内核上指定10%(因为我选择3个是最大值),则所有3个线程每个内核的CPU使用率都不会超过10%。 正是某些诸如Steam之类的应用程序可以在其中限制下载速度,但想象您将有多个Internet连接来表示多核。

我试过的

我曾尝试使用Task但无法弄清楚如何管理它创建的最大线程数,甚至更少地管理它们各自使用的核心。

我最终拥有的是:

我最终找到了具有Parallel.ForEach的组合的ParallelOptions.MaxDegreeOfParallelism从而为我提供了我想要的线程数量控制权。 我知道我有多少个内核,我可以轻松地制作一些东西让用户选择要使用的内核数量。 我的测试得出的结论是, Parallel.ForEach属性按顺序在每个核心上工作,一旦所有核心都收到了东西,它就会循环返回并重新分配。 这是完美的。 如果我在4核上设置3的并行度,则在3个不同的核上获得3个线程,而在4核上设置5的并行度,则3核将具有1个线程,而1核将具有2个。这种行为正是我所需要的。 这种方法不是一成不变的,我可以随时更改。

CPU限制

现在使用Parallel.ForEach使CPU 100%地工作,这是一个严峻的问题,在这种紧凑的环境中,长时间在许多计算机上使用超过40-50%的电流都会增加消耗的功率,从而触发建筑物中的紧急警报,我们必须低于该警报。 无论如何,除了在紧密循环中执行thread.sleep外,我没有找到任何解决方案,但这仍然使cpu在几秒钟内以100%的速度运行几秒钟,然后长时间运行近0%,然后一遍又一遍地执行。 这没有用。 我在一个只有150台计算机的房间里进行了一次小测试,其中一半在几乎相同的确切时间消耗了太多的电源,峰值达到100%。 我的第二个测试是仅使用8个或更多内核,并且仅在1个内核上运行,并且可以大幅度减少使用率。

优先

我终于用流程优先级进行了测试,这并不更好。 是的,该进程获得的CPU时间更少,但是当我获得电源时,cpu仍然以100%的速度运行。 除非我在处理可能限制CPU的优先级时错过了一个关键的选择。

最后

我觉得我与Parallel.ForEach非常接近,我只是想失去每个内核的CPU限制。 我只想念一件事吗? 我知道使用Thread.Sleep是完全愚蠢的,因为它实际上限制了cpu的使用时间,而不是数量。

对于那些想要代码的人

再次,这是原型,因此代码几乎没有用。 它所做的一切都会在许多cpu上运行代码,直到完成

static void Main(string[] args)
{
    var items = Enumerable.Range(0, int.MaxValue - 100);

    Parallel.ForEach(
             items,
             new ParallelOptions { MaxDegreeOfParallelism = 4 },
             value => { Calculate(value); }
     );
}

private static void Calculate(int value)
{
    System.Threading.Thread.SpinWait(100000);
    var test = value;
    test *= -1;
    Console.WriteLine(test);
}

您可以使用Windows作业对象来限制整个进程(或进程树)的CPU使用率。 您可以限制整个过程,也可以启动自己限制的童工过程。

这需要PInvoke(在这里不太困难),并且不允许您控制特定的线程(在这里似乎不需要)。

另外,您需要自己进行节流(因为您声明仅控制线程数对您不起作用)。 我将其基于PauseToken 将油门调到75%的任何简单方法是:

var pauseToken = new PauseToken();

//Use pauseToken on all threads that consume a lot of CPU

Task.Run(async () => {
 while (true) {
  await Task.Delay(250); //run
  pauseToken.Pause();
  await Task.Delay(750); //pause
  pauseToken.Resume();
 }
});

您甚至可以动态调整节流的百分比。 每秒读取设备的电源使用情况。 如果它超过某个阈值,则将暂停百分比增加10%。 如果低于此值,请将暂停百分比降低5%。 这样,您可以轻松确定目标功率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM