【问题标题】:How to decrease CPU utilization on intensive multithread computation如何降低密集多线程计算的 CPU 利用率
【发布时间】:2012-09-12 19:19:52
【问题描述】:

我已经实现了元启发式求解器并使用了 .NET 4.0 Parallel.ForParallel.Foreach。 它在我的中端机器上运行良好。但是搜索太激烈了,消耗太多资源,尤其是低端机器上的CPU时间。

所以我认为我必须在需要时设置一个选项来调低搜索强度。我想在不涉及算法的情况下降低 CPU 利用率。只要搜索完成较慢,只要它不会锁定机器并允许其他工作搁置,就可以了。

我正在考虑将 Thread.Sleep 放在方法上,因为所有线程都 100% 受 CPU 限制(无 I/O)。这会降低我需要的 CPU 使用强度吗?有没有更好的解决方案?

【问题讨论】:

  • 它是否跨越了两个多核/使用了太多线程?您可以指定一些限制:stackoverflow.com/questions/2002864/…
  • 你为什么关心它消耗过多的CPU?通常,无论如何都不会使用 CPU 时间,并且操作系统在调度方面足够智能,因此您的应用程序不应干扰系统中的其他进程。
  • @svick 我希望它作为后台应用程序运行。目前它正在尝试冻结整个机器:(
  • 为什么不直接使用MaxDegreeOfParallelism 来生成有限数量的线程并让一些内核空闲?

标签: c# multithreading parallel.foreach


【解决方案1】:

如果您使用不同的线程,我建议如下:

Thread.Priority = ThreadPriority.BelowNormal

所以线程的优先级较低。

编辑

好的,这个解决方案只有在不与 ThreadPool 一起使用时才可接受。

这里我不确定,但是关于:

Process.ProcessorAffinity
  • 获取或设置可调度此进程中的线程运行的处理器。

如果我们限制核心,我们就有更多空间来做其他工作,对吧?

【讨论】:

  • 当您使用Parallel.For(Each) 时,我认为这不是一个好的解决方案,因为它使用线程池并且可以从进程的其他部分使用这些线程。更改整个进程(而不是每个单独的线程)的优先级将是一个更好的解决方案。
  • @svick - 是的,所以它们的优先级也较低。我看不出有什么问题。降低整个进程的优先级会更容易 - 节省显式降低池线程的优先级等。
  • @MartinJames 但是如果应用程序的其他部分将优先级设置为正常怎么办(可能是因为响应性很重要)?那么它会令人困惑,因为如果您不明确设置它,您将无法确定当前线程具有什么优先级。因此,我认为设置线程池线程的优先级从来都不是正确的做法。
  • 有没有办法检测它是否在低资源机器上运行?
  • @Tudor - 我不知道在 C# 中使用什么机制以显式方式有效地降低所有线程池线程的优先级。据推测,这必须通过启动新线程池线程的一些事件挂钩来完成(任何想法,任何人?)。降低进程优先级会起作用——所有线程池线程然后将以通常的 Windows 方式获得较低的调度优先级——当它们准备好时,它们将被 Office、浏览器、媒体播放器等中的正常优先级线程抢占。仍然不相信“非常糟糕的主意”。
【解决方案2】:

(头顶在栏杆上方,准备被许多反对票击落..:)

如果您使用不同的线程,我建议如下:

Thread.Priority = ThreadPriority.BelowNormal

所以线程的优先级较低。

[是的,这是 C Sharper 答案的直接副本,但没有后来关于线程池线程和亲和力的编辑。如果您认为这是个好主意,请支持 C Sharper,而不是我]。

或者,通过任务管理器或其他方式降低整个进程的优先级。这将降低进程中所有线程的“真正”调度优先级(包括“非常糟糕的”线程池线程),并改善其他非 CPU 密集型应用程序的用户体验,但应在需要时快速响应做某事。较低优先级的重度应用程序仍会占用所有剩余的 CPU,如果您决定不编辑本月的销售数据或观看最新的非法下载版权电影,它的性能将与以正常优先级运行时一样好。

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 2016-07-11
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多