如何找到一个系统产生的最大线程数?

时间:2011-01-04 08:31:59

标签: linux multithreading

是否有方法/程序可以找出系统可以生成的最大线程数?我正在创建一个应用程序,无论是使用事件循环模型还是多线程模型,我都处于两难境地。那么想测试一下它可以处理多少个线程的系统功能呢?

4 个答案:

答案 0 :(得分:4)

“最大线程数”并不像您想象的那样有用:

  • 操作系统或可用硬件资源通常会产生系统范围的最大线程数。

  • 每个进程的最大线程数通常是可配置的,甚至可以即时更改。

  • 在大多数情况下,实际限制来自您的硬件资源 - 而不是任何强加的限制。就像任何其他资源(例如记忆)一样,你必须检查你是否成功,而不是依赖某种限制。

通常,与事件循环相比,多线程只有两个优点:

  • 它可以使用多个处理器。根据操作系统的不同,您还可以使用多个进程(而不是更轻量级的线程)来执行此操作。

  • 根据操作系统的不同,它可能会提供一定程度的私密性分离。

除了多线程在内存和处理资源中通常更昂贵。无论他们正在做什么都是资源密集型的,大量的线程都可以让你的系统停止运行。

在大多数情况下,最好的解决方案是两种模型的混合,即每个模型中都有一个事件循环。

编辑:

在现代Linux系统上,/proc/sys/kernel/threads-max文件提供了线程数量的系统范围限制。 root用户可以根据需要更改该值:

echo 100000 > /proc/sys/kernel/threads-max

据我所知,内核并没有特别强加每个进程的线程数限制。

sysconf()可用于查询系统限制。在/usr/include/bits/confname.h_SC_THREAD*变量)中定义了一些半文档化的与线程相关的查询变量。

getrlimit()可用于查询每个会话的限制 - 在这种情况下,RLIMIT_NPROC资源与线程相关。

glibc中的线程实现也可能会对每个进程施加自己的限制。

请注意,根据您的硬件和软件配置,这些限制都不一定有用。在Linux上,线程数量的一个主要限制因素来自于每个线程需要堆栈中的内存 - 如果你开始启动线程,你可以轻松地在任何其他线程之前达到这个限制。

如果你真的想找到实际的限制,那么唯一的方法就是开始启动线程,直到你再也不能这样做了。即使这只会给你一个粗略的限制,只有在你运行程序时才有效。它可以很容易改变,例如,你的线程开始做实际的工作并增加他们的资源使用。

在我看来,如果你launching more than 3-4 threads per processor,你应该重新考虑你的design

答案 1 :(得分:3)

在Linux上,您可以通过检查/ proc / loadavg

找到运行的线程总数
    # cat /proc/loadavg
    0.02 0.03 0.04 1/389 7017

在上面,389是线程总数。

答案 2 :(得分:0)

它可以提供操作系统提供的多个线程,你永远不会知道限制。

但是作为一般措施,如果一次具有超过25个线程的普通LOB应用程序可能导致问题并且存在严重的设计问题。

答案 3 :(得分:0)

当前的全局上限是400万个线程,因为一旦达到,就会耗尽PID(参见futex.h)。