使用多个线程时应用程序运行速度较慢

使用多个线程时应用程序运行速度较慢

我有一台运行 Ubuntu 14.04 LTS 的 40 核服务器。我正在使用具有多线程功能的应用程序。我发现,运行应用程序时增加线程数可以提高运行时间,直到超过一定数量,此时运行时间再次开始增加。这个线程数远低于我拥有的核心数。以下是一些示例(这些是“实际”时间):

8 threads: 1m45.992s
16 threads: 1m7.494s
24 threads: 1m45.174s
32 threads: 3m10.819s
40 threads: 6m12.194s
80 threads: 25m22.937s

我没有耗尽内存(128 Gb 中只使用了 4 Gb),也没有使用交换空间。在这些测试期间,没有运行其他占用大量 CPU 的进程。

有趣的是,当我在具有 8 个内核的 PowerMac 上运行从 OS X 中的相同源编译的相同应用程序版本并使用相同数据时,我获得了高达 16 个线程的稳定运行时间改进,而在 32 个和 64 个线程时仅出现轻微(几秒钟)的减速,因此我认为这不是应用程序软件的问题。事实上,当我在 Ubuntu 服务器上使用具有与第一个功能类似的功能的另一个多线程应用程序时,我看到了类似的结果,尽管结果并不那么引人注目:

16 threads: 4m4.795s
40 threads: 2m31.430s
60 threads: 3m7.007s
80 threads: 5m6.946s 

我通常需要对数百个数据集连续运行这些分析,因此任何效率的提高都会产生很大的影响。我的问题是,这是否与系统软件配置问题有关,还是与我的硬件问题有关。如果您能提供任何关于从哪里开始解决这个问题并充分利用我的所有处理器的想法,我将不胜感激。

谢谢。

答案1

您可能会遇到代码中的争用点,例如锁定(通过 futexes 或类似方式)发生代码序列化并因此停止性能扩展。

此外,x86 CPU 可能有 N 个内核,每个内核有 2 个线程,但这并不能为您提供 2 x N 的性能,因为超线程在某些执行块可用时才会执行。我相信对于单插槽 x86 处理器,使用超线程最多可以获得 30% 的额外性能。

此外,您可能会遇到内存争用问题,无论是缓存(L1、L2 或 L3)还是内存本身。因此,您可能会遇到吞吐量限制、缓存停滞或 TLB 限制。

当 N 进程 > N CPU 时,最终将得到比可运行进程更多的进程,因此调度程序必须执行更多工作来抢占可运行进程,这又是另一个影响性能的损失。

您可以使用 perf 等工具获取低级性能指标。使用以下命令安装:

sudo apt-get install linux-tools 

并使用 perf 运行你的应用程序来获取一些性能测量结果:

perf stat your-program

您可以使用 perf record 和 perf report 进行更深入的分析,例如

sudo perf record your-program
sudo perf report

或者,运行你的程序,并在运行时使用 perf top 来获取系统活动的交互式实时视图:

sudo perf top

希望这可以让您了解瓶颈出现的位置。

相关内容