【发布时间】:2011-01-04 08:31:59
【问题描述】:
有没有办法/程序来找出系统可以产生的最大线程数?我正在创建一个应用程序,我在选择事件循环模型还是多线程模型时处于两难境地。所以想测试系统可以处理多少线程的能力?
【问题讨论】:
-
我们说的是哪个操作系统?
标签: linux multithreading
有没有办法/程序来找出系统可以产生的最大线程数?我正在创建一个应用程序,我在选择事件循环模型还是多线程模型时处于两难境地。所以想测试系统可以处理多少线程的能力?
【问题讨论】:
标签: linux multithreading
“最大线程数”并不像您想象的那么有用:
操作系统或可用硬件资源通常会规定系统范围的最大线程数。
每个进程的最大线程数通常是可配置的,甚至可以即时更改。
在大多数情况下,实际限制来自您的硬件资源,而不是任何强加的限制。就像任何其他资源(例如内存)一样,您必须检查是否成功,而不是依赖某种限制。
一般来说,与事件循环相比,多线程只有两个优点:
它可以使用多个处理器。根据操作系统,您还可以使用多个进程(而不是更轻量级的线程)来执行此操作。
根据操作系统,它可能会提供一定程度的权限分离。
除此之外,多线程通常在内存和处理资源方面都更昂贵。大量线程可能会导致您的系统停止运行,无论它们正在执行的操作是否占用资源。
在大多数情况下,最好的解决方案是两种模型的混合,即多个线程,每个线程都有一个事件循环。
编辑:
在现代 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。
【讨论】:
在 Linux 上,您可以通过检查 /proc/loadavg 来找到正在运行的线程总数
# cat /proc/loadavg
0.02 0.03 0.04 1/389 7017
在上面,389是线程的总数。
【讨论】:
它可以处理操作系统提供的尽可能多的线程,你永远不知道限制。
但作为一般措施,如果一个普通的 LOB 应用程序一次有超过 25 个线程可能会导致问题和严重的设计问题。
【讨论】:
当前的全局上限是 400 万个线程,因为一旦达到,您就用完了 PID(请参阅 futex.h)。
【讨论】: