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

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


当前回答

对于现在看到这个的人来说,在systemd系统上(在我的情况下,特别是Ubuntu 16.04),还有另一个由cgroup pid强制执行的限制。max参数。

默认设置为12288,可以在/etc/systemd/logind.conf中覆盖

其他建议仍然适用,包括pids_max、threads-max、max_maps_count、ulimits等。

其他回答

要检索它:

cat /proc/sys/kernel/threads-max

设置方法:

echo 123456789 | sudo tee -a /proc/sys/kernel/threads-max

123456789 = #线程

Linux对每个进程没有单独的线程限制,只是对系统上进程总数的限制(线程本质上只是在Linux上具有共享地址空间的进程),您可以像这样查看:

cat /proc/sys/kernel/threads-max

默认为内存页数/4。你可以这样增加:

echo 100000 > /proc/sys/kernel/threads-max

对于单个用户可以创建的进程(以及线程)的数量也有限制,有关这些限制的详细信息,请参阅ulimit/getrlimit。

使用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来引发这个问题。但如果这是明智的是另一个讨论…

要永久地固定,

vim /etc/sysctl.conf

并添加

kernel.threads-max = "value"

说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/