我的目标是提出可以并行运行的最大线程数。谷歌指出了许多链接,他们通过划分RAM / StackSize来提供简单的数学运算。在64位Linux中,我们将线程堆栈大小定义为10 MB(ulimit -s = 10240kb),RAM为4GB,为操作系统留下1 GB并且使用此数学运算我可以拥有~300个线程,但是小型测试应用程序,我写到最高~32297,然后给出内存不足错误。
我用-Xss尝试了不同的值,但是这些值对线程数几乎没有任何影响,它仍然与~32297相同)。
这给我的印象是堆栈大小是可变的并且由OS决定并且在我需要的时候达到我们定义的最大值,但无论我在哪里阅读,它们的堆栈大小都是静态的
我到底错过了什么?
答案 0 :(得分:4)
尝试使用
检查/更改linux最大堆栈大小ulimit -s
同时检查linux线程限制
cat /proc/sys/kernel/threads-max
答案 1 :(得分:3)
我还发现Java中的线程限制大约为32K。如果你有这么多线程,通常使用不同的方法更好。在我的机器上,执行while(true) Thread.sleep(1000)
的32K线程将消耗3个核心,只需上下文切换。
Java: What is the limit to the number of threads you can create?
答案 2 :(得分:3)
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/
答案 3 :(得分:0)
当限制为地址空间(2 ^ 32)时,您所阅读的内容仅在32位架构中有效。你实际上有类似的东西:Xmx + MaxPermSize +(Xss *线程数)&lt;最大地址空间OS允许用户进程。根据操作系统和物理硬件的不同,你就像3Go一样。但这与RAM无关。
对于64位架构,您的地址空间不会受到限制(2 ^ 64)。您应该像上面有人所说的那样查看操作系统限制。
答案 4 :(得分:0)
这是因为pid_max内核变量默认为32768,但对于64位系统,可能会增加到4百万。 解释很简单1 thread = 1进程将有1个PID(进程ID)所以不再有pid,没有更多的线程。