3

我的目标是提出可以并行运行的最大线程数。谷歌向我指出了许多链接,它们通过划分 RAM/StackSize 给出了简单的数学计算。在 64 位 Linux 中,我们将线程堆栈大小定义为 10 MB(ulimit -s = 10240kb),RAM 为 4GB,为操作系统留出 1 GB 空间,根据这个数学计算,我可以拥有大约 300 个线程,但我的测试应用程序很小写到〜32297,然后给出内存不足错误。

我用 -Xss 尝试了不同的值,但这些值对线程数几乎没有任何影响,它与 ~32297 相同)。

这给了我一个印象,堆栈大小是可变的,由操作系统决定,并在需要时达到我们定义的最大值,但无论我在哪里阅读,它们的堆栈大小都是静态的

我到底在这里想念什么?

4

5 回答 5

5

尝试使用检查/更改 linux 最大堆栈大小

ulimit -s

还要检查 linux 线程限制

cat /proc/sys/kernel/threads-max  
于 2011-08-03T08:14:51.520 回答
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/

于 2012-02-09T13:52:02.640 回答
3

我还发现 Java 中线程的限制约为 32K。如果你有这么多线程,使用不同的方法通常是一个更好的主意。在我的机器上,32K 线程执行while(true) Thread.sleep(1000)将消耗 3 个内核,只是上下文切换。

Java:您可以创建的线程数有多少限制?

于 2011-08-03T13:41:29.927 回答
0

当限制为地址空间 (2^32) 时,您所阅读的内容仅在 32 位架构中有效。您实际上有类似的东西:Xmx + MaxPermSize + (Xss * 线程数) < 操作系统允许用户进程的最大地址空间。取决于操作系统和物理硬件,你有像你说的 3Go 之类的东西。但这与 RAM 无关。

对于 64 位架构,您的地址空间不会是限制 (2^64)。您应该像上面所说的那样查看操作系统限制。

于 2011-08-03T08:06:10.990 回答
0

这是因为 pid_max 内核变量默认为 32768,但对于 64 位系统,可能会增加到 4 百万。解释很简单 1 个线程 = 1 个进程,它将有 1 个 PID(进程 ID),所以没有更多的 pid,没有更多的线程。

于 2018-03-07T23:41:07.007 回答