10

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

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

4 回答 4

18

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

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

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

如果您对应用程序的速度感兴趣- 永远记住阿姆达尔定律,它为您的应用程序将花费的时间(加速)提供了严格的限制,即使有无限数量的工作内核也是如此。

于 2012-10-15T09:43:22.820 回答
5

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

  • 应用程序使用的 CPU 时间(CPU 秒数)不能超过可用内核数乘以它运行的(挂钟)秒数,并且
  • 单个线程每秒不能使用超过一个 CPU 秒。

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

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

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

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

于 2012-10-15T09:44:30.160 回答
1

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

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

于 2012-10-15T09:43:09.177 回答
1

正如其他答案已经指出的那样,“这取决于”。在理想的世界中,对于 n 个内核,您将获得因子 n 的吞吐量,因为您在每个内核上的单独线程中执行相同的工作(这已经包含一个错误的假设,因为您需要以某种方式同步线程时它们从同一个队列中读取)。

了解 Disruptor,硬核并发初学者指南给出了一些很好的例子,你需要在并行任务时考虑什么,并且还展示了一些尝试并行化导致执行时间更长的情况。

于 2012-10-15T09:51:53.267 回答