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

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


当前回答

@dragosrsupercool

Linux不使用虚拟内存来计算线程的最大值,而是使用安装在系统上的物理ram

 max_threads = totalram_pages / (8 * 8192 / 4096);

http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/

内核/ fork.c

/* The default maximum number of threads is set to a safe
 * value: the thread structures can take up at most half
 * of memory.
 */
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

所以thread max在每个系统之间是不同的,因为安装的ram可以来自不同的大小,我知道Linux不需要增加虚拟内存,因为在32位上我们有3 GB的用户空间和1 GB的内核,在64位上我们有128 TB的虚拟内存,这发生在Solaris上,如果你想增加虚拟内存,你需要增加交换空间。

其他回答

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.

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

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

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

@dragosrsupercool

Linux不使用虚拟内存来计算线程的最大值,而是使用安装在系统上的物理ram

 max_threads = totalram_pages / (8 * 8192 / 4096);

http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/

内核/ fork.c

/* The default maximum number of threads is set to a safe
 * value: the thread structures can take up at most half
 * of memory.
 */
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

所以thread max在每个系统之间是不同的,因为安装的ram可以来自不同的大小,我知道Linux不需要增加虚拟内存,因为在32位上我们有3 GB的用户空间和1 GB的内核,在64位上我们有128 TB的虚拟内存,这发生在Solaris上,如果你想增加虚拟内存,你需要增加交换空间。

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

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

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

可以通过以下命令查看当前值- 猫/proc/sys/kernel/threads-max

您还可以像这样设置值

Echo 100500 > /proc/sys/kernel/threads-max

您设置的值将根据可用的RAM页进行检查。如果线程结构占用可用RAM页面的1/8以上,则thread-max将相应降低。