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

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


当前回答

linux上合适的100k线程:

ulimit -s  256
ulimit -i  120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max 

 ./100k-pthread-create-app

来自@Thomas的2018年更新,关于systemd系统:

/etc/systemd/logind.conf: UserTasksMax=100000

其他回答

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

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

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

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

如果使用Suse操作系统,则需要选择其中一种方法

https://www.suse.com/support/kb/doc/?id=000015901

全球性的,

/etc/systemd/system.conf
    DefaultTasksMax=Value

对于特定的ssh服务

/etc/systemd/system/sshd.service.d/override.conf
    TasksMax=Value

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.

线程数限制:

$ cat /proc/sys/kernel/threads-max 

计算方法:

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

和: x86_64页大小(PAGE_SIZE)为4K; 像所有其他体系结构一样,x86_64为每个活动线程都有一个内核堆栈。这些线程栈是THREAD_SIZE (2*PAGE_SIZE)大;

备忘录:

cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}';

因此,实际上这个数字与线程内存堆栈大小的限制(ulimit -s)无关。

注:线程内存堆栈限制是10M在我的rhel虚拟机,1.5G内存,这个虚拟机只能提供150个线程?