为什么多线程应用程序通常会扩展不良?

Eri*_*rik 5 parallel-processing multithreading multicore

我目前正在思考多线程应用程序可能无法很好扩展的原因。

我知道并一直与之抗争的两个原因是:

  1. 线程之间的通信没有做好,导致速度变慢
  2. 芯片上的内核数和内存带宽与 CPU 不成比例地增加。这导致每个内核的内存带宽越慢,芯片上使用的内核越多。

还有什么问题?

Mar*_*mes 1

我认为,在 (1) 中,您已经确定了可能对多线程应用程序的性能产生负面影响的最重要因素之一。特别是。谷歌“虚假分享”。

(2),但是仅影响一组多线程应用程序 - 那些并行运行 CPU 密集型线程的应用程序。如果应用程序使用许多 I/O 绑定线程,则 (2) 并不重要。

看看我的盒子,它有 100 个进程和 1403 个线程,CPU 使用率为 3%。100 个进程中只有 7 个是单线程的。因此,大多数应用程序都是多线程的,但 I/O 等待。

目前,如果我的盒子只有一个核心,它就能很好地工作。当然,点击一个链接来打开我的浏览器可能会慢一些,以打开一个复杂的页面,但不会太慢。

在最常见的情况下,应用程序是多线程的,以利用抢占式多任务处理程序的高 I/O 性能,即使在单核 CPU 上,应用程序也确实可以很好地扩展。

尽量不要陷入这样的陷阱:认为抢占式多任务操作系统都是“并行执行 CPU 密集型任务”——它们实际上通过强制需要锁定、同步、信号发送等使这变得困难。它更多的是关于高性能I/O,这是协作调度程序非常不擅长的事情。