假设我有一个4核CPU,我想在最短的时间内运行某个进程。这个过程在理想情况下是可并行的,所以我可以在无数个线程上运行它的块,每个线程花费相同的时间。

因为我有4个内核,所以我不期望通过运行比内核更多的线程来提高速度,因为单个内核在给定时刻只能运行单个线程。我对硬件了解不多,所以这只是一个猜测。

在更多的线程而不是核心上运行并行进程是否有好处?换句话说,如果我使用4000个线程而不是4个线程运行,我的进程会更快、更慢,还是在大约相同的时间内完成?


当前回答

希望这是有意义的,检查CPU和内存利用率,并设置一些阈值。如果超过阈值,不允许创建新的线程,否则允许…

其他回答

一次4000个线程是相当高的。

答案是肯定的,也不是。如果您在每个线程中执行大量阻塞I/O,那么是的,您可以在每个逻辑核心中执行3或4个线程时显示显著的加速。

If you are not doing a lot of blocking things however, then the extra overhead with threading will just make it slower. So use a profiler and see where the bottlenecks are in each possibly parallel piece. If you are doing heavy computations, then more than 1 thread per CPU won't help. If you are doing a lot of memory transfer, it won't help either. If you are doing a lot of I/O though such as for disk access or internet access, then yes multiple threads will help up to a certain extent, or at the least make the application more responsive.

通过运行htop或ps命令(返回机器上的进程数),您将发现可以在机器上运行多少个线程。

您可以使用手册页关于'ps'命令。

man ps

如果你想计算所有用户进程的数量,你可以使用这些命令之一:

Ps -aux| wc -l ps -eLf | wc -l

计算用户进程数:

ps—root用户| wc -l

此外,你还可以使用“htop”[参考]:

在Ubuntu或Debian上安装:

sudo apt-get install htop

在Redhat或CentOS上安装:

yum install htop
dnf install htop      [On Fedora 22+ releases]

如果您想从源代码编译htop,可以在这里找到它。

希望这是有意义的,检查CPU和内存利用率,并设置一些阈值。如果超过阈值,不允许创建新的线程,否则允许…

理想的情况是每个内核有一个线程,只要没有线程会阻塞。

在一种情况下,这可能是不正确的:有其他线程在核心上运行,在这种情况下,更多的线程可能会给您的程序更大的执行时间。

答案取决于程序中使用的算法的复杂性。我提出了一个计算最佳线程数的方法,即对任意数量的线程“n”和“m”进行两次处理时间Tn和Tm的测量。对于线性算法,最佳线程数为N =√((mn(Tm*(N -1) - Tn*(m-1)))/(nTn-mTm))。

请阅读我关于各种算法的最优数计算的文章:pavelkazenin.wordpress.com