【问题标题】:How to find the max no of threads spawned by one system?如何找到一个系统产生的最大线程数?
【发布时间】:2011-01-04 08:31:59
【问题描述】:

有没有办法/程序来找出系统可以产生的最大线程数?我正在创建一个应用程序,我在选择事件循环模型还是多线程模型时处于两难境地。所以想测试系统可以处理多少线程的能力?

【问题讨论】:

  • 我们说的是哪个操作系统?

标签: linux multithreading


【解决方案1】:

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

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

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

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

一般来说,与事件循环相比,多线程只有两个优点:

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

  • 根据操作系统,它可能会提供一定程度的权限分离。

除此之外,多线程通常在内存和处理资源方面都更昂贵。大量线程可能会导致您的系统停止运行,无论它们正在执行的操作是否占用资源。

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

编辑:

在现代 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

【讨论】:

  • 如果是硬件限制,有没有办法找出线程在执行之后或执行时消耗的资源?
  • 我想要实现的是可扩展性。每次客户端机器请求服务时,我都会生成一个线程,我想看看我能把它推到多远,即阈值水平,同时我试图用均匀循环方法编写代码,并检查它的规模有多远.它更像是我在做的比较。
  • @Rahul:事件循环可能能够处理更多请求,具体取决于实际实现。但是,它只能单独使用一个处理器。每个处理器有一个或两个线程可以获得最佳的可扩展性,每个线程都有自己独立的事件循环。
  • 您错过了另一个线程优势 - 能够一次对文件系统“进行中”的多个请求。这在 NFS 上尤为明显。
【解决方案2】:

在 Linux 上,您可以通过检查 /proc/loadavg 来找到正在运行的线程总数

    # cat /proc/loadavg
    0.02 0.03 0.04 1/389 7017

在上面,389是线程的总数。

【讨论】:

  • 如前所述,/proc/sys/kernel/threads-max 包含最大值。这可以使用 sysctl 命令进行修改。
【解决方案3】:

它可以处理操作系统提供的尽可能多的线程,你永远不知道限制。

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

【讨论】:

  • 但是有什么程序可以提供阈值限制左右吗?
【解决方案4】:

当前的全局上限是 400 万个线程,因为一旦达到,您就用完了 PID(请参阅 futex.h)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多