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