繁体   English   中英

超过 6 个线程的性能下降

[英]Performance degrades for more than 6 Threads

我在基于 Ubuntu 19 的服务器上的 C++ 中编写了多线程代码。 该服务器有 8 个内核,每个内核 2 个线程和 126 GB 的可用 memory。 C++ 代码中的每个线程都会独立进行一些处理,然后写入单个文件。 由于该文件是共享资源,因此可以通过互斥锁访问它。 每个线程完成的处理计算成本很高,并且在将结果写入共享文件之前需要数小时(如果是 6 个线程,则需要 8 小时)来执行。

如果我创建六个线程,执行是最快的。 如果我创建超过六个线程,则需要更多时间来执行。 这是我用于创建线程的代码,我使用了默认参数。 这会引起一些问题吗?

pthread_create(&id[i],NULL,&myFunc, (void*)&param[i])==-1

C++ 代码的六个线程运行。 运行线程的 CPU 被充分利用

C++ 代码的十六个线程运行。 CPU 未充分利用,因为 kernel 进程(红色条)使用的百分比高于用户线程(绿色条)。 这是最坏的情况,但即使我运行 7 个线程,性能也会大大降低,并且我可以看到一些红条

在另一个实验中,我创建了两个进程,每个进程包含 6 个线程,并在服务器上同时运行它们。 总共有 12 个线程在两个进程中运行。 它执行没有任何问题(没有红条)。

总而言之,我无法理解,为什么在有可用资源的情况下超过 6 个线程会造成麻烦。 而另一方面,每个包含六个线程的两个进程可以毫无问题地执行。

  • 线程数多于内核数会适得其反,因为您失去了 CPU 位置——即线程开始不断地从一个 CPU 移动到另一个 CPU。 Linux 尽最大努力保护局部性,如果内核可用,您一定会像以前一样在同一个内核上执行。 但是如果线程不断地互相等待,你就会失去这种优化。

  • 具有 2 个线程的 CPU 内核是一种有点欺诈性的营销方式。 您仍然只有固定数量的执行单元,并且这 2 个线程竞争它们。 在极少数情况下,一个线程只做加法/乘法而另一个线程只做加载/存储,你可能会得到一些好处。 但是大多数情况下,如果它们彼此等待,这两个线程不会运行得更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM