Linux 能创建的最大线程数

2017-09-08 18:45:57 +08:00
 jingniao
ubuntu 16.04 最新更新 kernel 4.10.x
内存 16g
目前搜索到的 limit.conf 跟 sysctl.conf 的 max-thread,都已经改到 10w+了
使用 python3 threading 模块创建线程,只能创建 12000 左右的线程
还有什么方法能增大这个限制么?
7382 次点击
所在节点    Linux
20 条回复
misaka19000
2017-09-08 18:48:40 +08:00
哇,什么要求需要这么多线程啊?
jingniao
2017-09-08 18:49:21 +08:00
@misaka19000 只是闲着没事,看看各种极限
Kilerd
2017-09-08 21:37:45 +08:00
如果换个想法想想,这个数字( 12000 )挺科学的。(前提是是 4 核 CPU )

4CPU = 8 worker = 8 Python 进程 = 8 * 12000 线程 = 96000

跟 10W 差不多了吧。
jhaohai
2017-09-08 21:42:32 +08:00
没啥限制吧,ulimit 随便改
jingniao
2017-09-08 21:44:21 +08:00
@Kilerd 很可惜, 我直觉中应该不是
因为最开始的时候我的这两个限制设置的是 65535 这个值,在 65535 时可以创建的线程数就是 12000 左右
我将限制增大到 10w+之后,可以认为能创建的线程数量并没有因为放开限制而显著增加
ryd994
2017-09-08 21:56:35 +08:00
限制可能是 PID 不够了
Linux 下 thread 也占 PID
lrxiao
2017-09-08 22:08:01 +08:00
似乎 python 创建 thread 并没有自己限制, _threadmodule.c pythread.h thread.c
NT 用_beginthreadex, unix 用 pthread

是 thread stack 不够?
NoAnyLove
2017-09-08 23:11:12 +08:00
所以是达到限制了?还是因为硬件资源占满了?其实测试最高线程数,如果没有放入具体应用中的测试时没有太大意义的,毕竟线程具体完成什么工作,对于能够创建的最高数量是有很大影响的。
abujj
2017-09-08 23:15:21 +08:00
go grouting
jingniao
2017-09-08 23:27:02 +08:00
@ryd994 pid 之前设置 65535,改大为 100w 后依旧 12000 线程

@NoAnyLove cpu,内存的负载都不高,另外跟具体任务没有关系,仅仅是创建线程,然后就 sleep 了,就是看看能创建多少线程,而且目前来说,这个可创建线程数都比较稳定

@abujj 这个实验中我关注的是操作系统的限制,并不是需要这么多并发
mdzz
2017-09-08 23:32:06 +08:00
达到限制后创建线程报什么错误?
jingniao
2017-09-09 07:49:12 +08:00
@mdzz python 会抛出一场:“ can't start new thread ”,在其他终端执行命令会报:“-bash: fork: retry: No child processes ”
lrxiao
2017-09-09 08:50:29 +08:00
设置_pythread_threadstacksize 重新编译 py 试试?
sagaxu
2017-09-09 11:39:02 +08:00
limits 限制排除了的话,显然是 cgroup 的限制,检查 pids.max
jeffson
2017-09-09 12:08:54 +08:00
关注,题主挺有想法的
sagaxu
2017-09-09 12:39:46 +08:00
@Kilerd 开多进程没用,用多个帐号跑也没用,cgroup 是按 group 限制的,一个 group 内所有用户的所有进程都受控

@lrxiao 不是 python 的限制,是内核 cgroup 的限制,像 Ubuntu 一般默认 1 万出头,跟 stacksize 无关

@NoAnyLove 16G 内存正常上限大概是 12 万线程,楼主的测试远远没到硬件限制

@jingniao
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.
abmin521
2017-09-09 13:41:39 +08:00
sagaxu
2017-09-09 14:51:42 +08:00
jingniao
2017-09-09 15:01:08 +08:00
@sagaxu 动作好快,看来是这个限制,回去试试
pynix
2017-09-09 19:11:55 +08:00
内核线程数估计是有限制的吧,内核栈只有那么一点,多了就存不下了。
用户线程的话应该和内存有关。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/389270

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX