技术解析

Linux 能创建的最大线程数
0
2021-06-29 08:26:30
idczone
ubuntu 16.04 最新更新 kernel 4.10.x
内存 16g
目前搜索到的 limit.conf 跟 sysctl.conf 的 max-thread,都已经改到 10w+了
使用 python3 threading 模块创建线程,只能创建 12000 左右的线程
还有什么方法能增大这个限制么?
哇,什么要求需要这么多线程啊?

只是闲着没事,看看各种极限

如果换个想法想想,这个数字( 12000 )挺科学的。(前提是是 4 核 CPU )
4CPU = 8 worker = 8 Python 进程 = 8 * 12000 线程 = 96000
跟 10W 差不多了吧。

没啥限制吧,ulimit 随便改

很可惜, 我直觉中应该不是
因为最开始的时候我的这两个限制设置的是 65535 这个值,在 65535 时可以创建的线程数就是 12000 左右
我将限制增大到 10w+之后,可以认为能创建的线程数量并没有因为放开限制而显著增加

限制可能是 PID 不够了
Linux 下 thread 也占 PID

似乎 python 创建 thread 并没有自己限制, _threadmodule.c pythread.h thread.c
NT 用_beginthreadex, unix 用 pthread
是 thread stack 不够?

所以是达到限制了?还是因为硬件资源占满了?其实测试最高线程数,如果没有放入具体应用中的测试时没有太大意义的,毕竟线程具体完成什么工作,对于能够创建的最高数量是有很大影响的。

go grouting

pid 之前设置 65535,改大为 100w 后依旧 12000 线程
cpu,内存的负载都不高,另外跟具体任务没有关系,仅仅是创建线程,然后就 sleep 了,就是看看能创建多少线程,而且目前来说,这个可创建线程数都比较稳定
这个实验中我关注的是操作系统的限制,并不是需要这么多并发

达到限制后创建线程报什么错误?

python 会抛出一场:“ can't start new thread ”,在其他终端执行命令会报:“-bash: fork: retry: No child processes ”

设置_pythread_threadstacksize 重新编译 py 试试?

limits 限制排除了的话,显然是 cgroup 的限制,检查 pids.max

关注,题主挺有想法的

开多进程没用,用多个帐号跑也没用,cgroup 是按 group 限制的,一个 group 内所有用户的所有进程都受控
不是 python 的限制,是内核 cgroup 的限制,像 Ubuntu 一般默认 1 万出头,跟 stacksize 无关
16G 内存正常上限大概是 12 万线程,楼主的测试远远没到硬件限制

UserTasksMax=
Sets the maximum number of OS tasks each user may run concurrently. This controls the TasksMax= setting of
the per-user slice unit, see systemd.resource-control(5) for details. If assigned the special value
"infinity", no tasks limit is applied. Defaults to 33%, which equals 10813 with the kernel's defaults on
the host, but might be smaller in OS containers.

https://stackoverflow.com/questions/344203/maximum-number-of-threads-per-process-in-linux

善用搜索

https://zhuanlan.zhihu.com/p/29192624

动作好快,看来是这个限制,回去试试

内核线程数估计是有限制的吧,内核栈只有那么一点,多了就存不下了。
用户线程的话应该和内存有关。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服