为什么多线程应用程序一般规模不好?

时间:2012-04-27 08:48:57

标签: multithreading parallel-processing multicore

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

我所知道的两个原因和我一直在争斗的原因是:

  1. 线程之间的通信不能很好地完成并降低速度
  2. 芯片上的内核数量和与cpu的内存带宽不成比例增加。这导致每个内核的内存带宽变慢,芯片上的内核使用率越来越高。
  3. 还有什么问题?

5 个答案:

答案 0 :(得分:1)

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

然而,

(2)只影响一组多线程应用程序 - 那些并行运行CPU绑定线程的应用程序。如果一个应用程序使用许多I / O绑定的线程,(2)并不重要。

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

如果它只有一个核心,那么我的盒子目前运作得相当好。当然,点击一个关闭我的浏览器的链接可能会慢一点,但是并不多。

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

尽量不要陷入认为先发制人的多任务操作系统都是“并行执行CPU绑定任务”的陷阱 - 他们实际上通过强制锁定,同步,信令等的需要来实现这一点。它更多的是关于高性能I / O,合作调度程序非常糟糕。

答案 1 :(得分:1)

对于第1点),它们不一定“做得不好”,但在大多数情况下,有一些关键部分,进程/线程必须彼此等待,例如,更新一些关键数据。阿姆达尔定律很好地描述了这一点。

我想补充的另一点是任务本身的可扩展性。如果任务(输入)不可扩展,则增加处理能力(核心/线程)不能提高整个吞吐量。例如,应用程序是处理数据流,但是存在一个约束,即来自同一流的数据包不能并行处理(由于排序考虑),那么可伸缩性将受到流的数量的限制。

此外,考虑到O(1)和O(n)算法之间的差异,算法的可扩展性更为重要。当然,这里的主题可能侧重于处理能力的可扩展性,而不是数据大小。

答案 2 :(得分:1)

许多多线程应用程序围绕“一个用户一个线程”概念构建,这意味着一旦需要处理用户或家务,就会将一个线程分配给该任务。每个额外的线程都会增加调度程序的负载,导致所有处理都完成,以确定此时应该运行哪个线程。将此称为“调度程序饱和度”。

Windows(多线程引擎,而不是95/98 / Me等)有一种称为I / O完成端口的机制,它建议每个处理器使用一个线程以获得最佳性能。基于IOCP的应用程序通常非常快,但一如既往地,瓶颈会出现在其他地方,例如用完某些类型的OS内存或等待通信介质。

您可以在此处搜索IOCP,它有自己的标记。

答案 3 :(得分:0)

我想补充一下:

  1. 线程越多,它们的CPU缓存份额就越小。典型的现代CPU可能有3级缓存:L1,L2和L3。 L1可能是该核心的私有,但L2和L3可能在裸片上的核心之间共享。因此,单个线程可以使用整个L2& L3,但是如果你有很多线程,那么你会得到更多的缓存未命中,具体取决于算法的配置文件。
  2. 另见:

    many-core CPU's: Programming techniques to avoid disappointing scalability

答案 4 :(得分:0)

它可能受到主内存固定最大带宽的限制,您的程序已用完内存带宽,但是您创建更多线程无法创建更多可用内存带宽。这与您的特定应用程序有关,无论是内存限制还是计算限制,请参阅 roofline model