1
misaka19000 2017-09-08 18:48:40 +08:00 via Android
哇,什么要求需要这么多线程啊?
|
2
jingniao OP @misaka19000 只是闲着没事,看看各种极限
|
3
Kilerd 2017-09-08 21:37:45 +08:00
如果换个想法想想,这个数字( 12000 )挺科学的。(前提是是 4 核 CPU )
4CPU = 8 worker = 8 Python 进程 = 8 * 12000 线程 = 96000 跟 10W 差不多了吧。 |
4
jhaohai 2017-09-08 21:42:32 +08:00 via iPhone
没啥限制吧,ulimit 随便改
|
5
jingniao OP @Kilerd 很可惜, 我直觉中应该不是
因为最开始的时候我的这两个限制设置的是 65535 这个值,在 65535 时可以创建的线程数就是 12000 左右 我将限制增大到 10w+之后,可以认为能创建的线程数量并没有因为放开限制而显著增加 |
6
ryd994 2017-09-08 21:56:35 +08:00 via Android
限制可能是 PID 不够了
Linux 下 thread 也占 PID |
7
lrxiao 2017-09-08 22:08:01 +08:00
似乎 python 创建 thread 并没有自己限制, _threadmodule.c pythread.h thread.c
NT 用_beginthreadex, unix 用 pthread 是 thread stack 不够? |
8
NoAnyLove 2017-09-08 23:11:12 +08:00
所以是达到限制了?还是因为硬件资源占满了?其实测试最高线程数,如果没有放入具体应用中的测试时没有太大意义的,毕竟线程具体完成什么工作,对于能够创建的最高数量是有很大影响的。
|
9
abujj 2017-09-08 23:15:21 +08:00 via Android
go grouting
|
10
jingniao OP |
11
mdzz 2017-09-08 23:32:06 +08:00
达到限制后创建线程报什么错误?
|
12
jingniao OP @mdzz python 会抛出一场:“ can't start new thread ”,在其他终端执行命令会报:“-bash: fork: retry: No child processes ”
|
13
lrxiao 2017-09-09 08:50:29 +08:00
设置_pythread_threadstacksize 重新编译 py 试试?
|
14
sagaxu 2017-09-09 11:39:02 +08:00
limits 限制排除了的话,显然是 cgroup 的限制,检查 pids.max
|
15
jeffson 2017-09-09 12:08:54 +08:00
关注,题主挺有想法的
|
16
sagaxu 2017-09-09 12:39:46 +08:00 2
@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. |
17
abmin521 2017-09-09 13:41:39 +08:00 1
|
18
sagaxu 2017-09-09 14:51:42 +08:00
|
20
pynix 2017-09-09 19:11:55 +08:00
内核线程数估计是有限制的吧,内核栈只有那么一点,多了就存不下了。
用户线程的话应该和内存有关。 |