有没有一种方法/程序可以找出系统可以产生的最大线程数?我正在创建一个应用程序,我在是否使用事件循环模型或多线程模型方面处于两难境地。所以想要测试系统功能,了解它可以处理多少线程?
最佳答案
“最大线程数”并不像您想象的那样有用:
操作系统或可用硬件资源通常会限制系统范围内的最大线程数。
每个进程的最大线程数通常是可配置的,甚至可以即时更改。
在大多数情况下,实际限制来自您的硬件资源,而不是任何强加的限制。与任何其他资源(例如内存)非常相似,您必须检查您是否成功,而不是依赖某种限制。
一般而言,与事件循环相比,多线程只有两个优势:
它可以使用多个处理器。根据操作系统的不同,您还可以使用多个进程(而不是更轻量级的线程)来执行此操作。
根据操作系统的不同,它可能会提供某种程度的权限分离。
除此之外,多线程通常在内存和处理资源方面都更加昂贵。大量线程会使您的系统停止运行,无论它们正在做的事情是否是资源密集型的。
在大多数情况下,最好的解决方案是两种模型的混合,即多个线程在每个线程中都有一个事件循环。
编辑:
在现代 Linux 系统上,/proc/sys/kernel/threads-max
文件为线程数提供了系统范围的限制。 root 用户可以根据需要更改该值:
echo 100000 >/proc/sys/kernel/threads-max
据我所知,内核并没有明确地对每个进程的线程数施加限制。
sysconf()
可用于查询系统限制。 /usr/include/bits/confname.h
中定义了一些半文档化的线程相关查询变量(_SC_THREAD*
变量)。
getrlimit()
可用于查询每个 session 的限制 - 在这种情况下,RLIMIT_NPROC
资源与线程相关。
glibc
中的线程实现也可能对每个进程施加其自身的限制。
请记住,根据您的硬件和软件配置,这些限制可能都没有用。在 Linux 上,线程数量的一个主要限制因素是每个线程都需要堆栈中的内存 - 如果您开始启动线程,您很容易在其他任何线程之前遇到这个限制。
如果你真的想找到实际的限制,那么唯一的方法就是开始启动线程,直到你不能再这样做为止。即使这样也只会给您一个粗略的限制,该限制仅在您运行程序时有效。如果例如,它可以很容易地改变。您的线程开始执行实际工作并增加它们的资源使用量。
在我看来,如果你是launching more than 3-4 threads per processor你应该重新考虑你的design .
关于linux - 如何找到一个系统产生的最大线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4591772/