Linux下一个进程可以创建的最大线程数是多少?

如何(如果可能的话)修改这个值?


当前回答

取决于您的系统,只需编写一个示例程序[通过在循环中创建进程],并使用ps axo pid,ppid,rss,vsz,nlwp,cmd检查。当它不能再创建线程时,检查nlwp计数[nlwp是线程数],瞧,你得到了你的傻瓜证明的答案,而不是通过书籍

其他回答

在实际应用中,限制通常由堆栈空间决定。如果每个线程获得1MB的堆栈(我不记得这是否是Linux上的默认值),那么32位系统将在3000个线程后耗尽地址空间(假设最后gb留给内核)。

但是,如果使用几十个以上的线程,您很可能会遇到糟糕的性能。迟早,您会得到太多的上下文切换开销、调度程序开销等等。(创建大量线程只会消耗大量内存。但是很多有实际工作要做的线程会减慢你的速度,因为它们在争夺可用的CPU时间)

你在做什么,这个极限甚至是相关的?

使用ulimit检查每个线程的堆栈大小,在我的情况下Redhat Linux 2.6:

    ulimit -a
...
    stack size              (kbytes, -s) 10240

你的每个线程将得到这个数量的内存(10MB)分配给它的堆栈。一个32位的程序,最大地址空间为4GB,最大只有4096MB / 10MB = 409个线程!!减去程序代码,减去堆空间可能会导致观察到的最大值。300个线程。

您应该能够通过在64bit上编译和运行或设置ulimit -s 8192甚至ulimit -s 4096来引发这个问题。但如果这是明智的是另一个讨论…

使用nbio 非阻塞i / o 库之类的,如果你需要更多的线程来做I/O调用那个块

说LINUX没有每个进程单独的线程限制是错误的。

Linux间接实现了每个进程最大线程数!!

number of threads = total virtual memory / (stack size*1024*1024)

因此,可以通过增加总虚拟内存或减小堆栈大小来增加每个进程的线程数。但是,当最大虚拟内存等于交换内存时,过多地减小堆栈大小会导致代码失败,因为堆栈溢出。

检查你的机器:

总虚拟内存:ulimit -v(默认值是无限的,因此您需要增加交换内存来增加它)

总堆栈大小:ulimit -s(默认为8Mb)

命令来增加这些值。

ulimit -s newvalue

ulimit -v newvalue

*将新值替换为您想要放置的限制值。

引用:

http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/

Yes, to increase the threads number you need to increase the virtual memory or decrease the stack size. In Raspberry Pi I didn’t find a way to increase the virtual memory, if a decrease the stack size from default 8MB to 1MB It is possibly get more than 1000 threads per process but decrease the stack size with the “ulimit -s” command make this for all threads. So, my solution was use “pthread_t” instance “thread class” because the pthread_t let me set the stack size per each thread. Finally, I am available to archive more than 1000 threads per process in Raspberry Pi each one with 1MB of stack.