CPU使用率vs线程数

时间:2012-10-15 09:38:59

标签: multithreading performance optimization

一般来说,CPU使用率与程序中的线程数之间的关系是什么。 假设:

  • 多核CPU
  • 线程完成相同的工作(假设他们从队列中获取相同的工作项并处理它们)

4 个答案:

答案 0 :(得分:14)

这取决于应用程序的性质。

  • 主要执行计算的应用程序 - 每个1个主题的比率 核心是一个合理的决定,因为您不希望由于开销而产生太多线程,并且您希望利用所有核心。
  • 主要执行 IO 操作(如http请求)的应用程序可以生成比#cores更多的线程,并且仍然可以提高效率,因为瓶颈是每个IO请求的等待时间,并且您想要在每次需要等待时获取尽可能多的信息。

也就是说,您将获得的CPU使用率仍取决于许多因素(IO,同步,程序中的非并行部分)。

如果您对速度感兴趣,那么应用程序将始终记住Amdahl's law,这将严格限制您的应用程序将采取的时间(加速) ,即使拥有无限数量的工作核心。

答案 1 :(得分:4)

除了明显的关系之外,没有这样的一般关系:

  • 应用程序不能使用比可用核心数乘以其运行的(挂钟)秒数更多的CPU时间(CPU秒),并且
  • 单个线程每秒不能使用多个CPU秒。

多线程应用程序的实际CPU数量主要取决于应用程序的性质以及实现它的方式:

  • 如果每个线程执行的计算不会产生与其他线程争用锁,内存访问等的争用,那么您应该能够接近可用CPU资源的理论限制。

  • 争用可能会降低有效的CPU使用率,有时会非常显着。

但是没有通用公式可以告诉你可以获得多少加速。

答案 2 :(得分:1)

我认为没有关系或不容易。这取决于线程正在做的工作。具有一个线程的程序可以占用100%的CPU,而具有大量线程的程序可以消耗更少的。

如果您正在寻找线程和完成工作之间的优化关系,您必须研究您的案例,并可能找到一个经验解决方案。

答案 3 :(得分:1)

正如其他答案已经陈述的那样,“它取决于”。在一个理想的世界中,对于n个核心,你会得到因子n的吞吐量,因为你在每个核心的一个单独的线程中做同样的工作(已经包含一个错误的假设,因为你需要以某种方式同步线程从同一队列中读取。)

Understanding the Disruptor, a Beginner's Guide to Hardcore Concurrency提供了一些很好的例子,说明在并行任务时需要考虑的事项,并且还显示了并行化尝试导致执行时间更长的一些情况。