为什么使用更多线程比使用更少线程慢

为什么使用更多线程比使用更少线程慢

尝试使用运行程序 X8 个线程一切都结束了n 分钟
尝试使用运行相同的程序50 个线程一切都结束了n*10 分钟

为什么会发生这种情况以及如何获得可以使用的最佳线程数?

答案1

“为什么会这样?”很容易回答。想象一下,您有一条走廊,可以并排容纳四个人。你想把一端的所有垃圾移到另一端。最有效率的人数是4人。

如果您有 1-3 人,那么您就错过了使用一些走廊空间的机会。如果你有 5 个人或更多人,那么其中至少有一个人基本上一直在另一个人后面排队。添加越来越多的人只会堵塞走廊,并不能加快活动速度。

因此,您希望容纳尽可能多的人,而不会造成任何排队。 为什么您是否有排队(或瓶颈)取决于 slm 答案中的问题。

答案2

你问的这个问题很复杂。如果不了解更多关于线程性质的信息,就很难说。诊断系统性能时需要考虑的一些事项:

是进程/线程

  • CPU 限制(需要大量 CPU 资源)
  • 内存限制(需要大量 RAM 资源)
  • I/O 限制(网络和/或硬盘资源)

所有这三种资源都是有限的,任何一种资源都会限制系统的性能。您需要了解您的具体情况消耗的是哪一个(可能是 2 个或 3 个)。

您可以使用ntopiostat、 和vmstat来诊断发生的情况。

答案3

常见的建议是 n+1 个线程,n 是可用 CPU 核心的数量。这样,n 个线程可以使用 CPU,同时 1 个线程正在等待磁盘 I/O。线程数较少不会充分利用 CPU 资源(在某些时候总会有 I/O 需要等待),线程数较多会导致线程争夺 CPU 资源。

线程不是免费的,但会产生上下文切换等开销,并且 - 如果必须在线程之间交换数据(通常是这种情况) - 各种锁定机制。只有当您实际上有更多专用 CPU 内核来运行代码时,这才是值得的。在单核 CPU 上,单个进程(没有单独的线程)通常比任何线程完成的速度更快。线程并不会神奇地让你的 CPU 运行得更快,它只是意味着额外的工作。

答案4

这里的罪魁祸首应该是“上下文切换”。它是保存当前线程的状态以开始执行另一个线程的过程。如果多个线程被赋予相同的优先级,则它们需要进行切换,直到完成执行。

在您的例子中,当有 50 个线程时,与仅运行 10 个线程相比,会发生大量上下文切换。

由于上下文切换而引入的时间开销导致程序运行缓慢

相关内容