Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
jingniao
V2EX  ›  Linux

Linux 能创建的最大线程数

  •  
  •   jingniao · Sep 8, 2017 via Android · 8634 views
    This topic created in 3342 days ago, the information mentioned may be changed or developed.
    ubuntu 16.04 最新更新 kernel 4.10.x
    内存 16g
    目前搜索到的 limit.conf 跟 sysctl.conf 的 max-thread,都已经改到 10w+了
    使用 python3 threading 模块创建线程,只能创建 12000 左右的线程
    还有什么方法能增大这个限制么?
    Supplement 1  ·  Sep 9, 2017
    我在虚拟机上进行了测试:
    ubuntu server 16.04.3 默认安装 kernel 4.4.0 1cpu
    limit.conf 默认未修改

    内存 可创建线程 threads-max "max user processes(ulimit -a 里显示)" pid_max
    1G 3761 7479 3739 131072
    2G 7794 15858 7771 131072
    3G 11826 23922 11803 131072
    4G 12308 31470 15577 131072
    5G 12308 39534 19609 131072
    6G 12308 47598 23641 131072
    唯一变量是内存

    thread-max 跟 max user processes 与内存大小是线性关系,另外尝试过在 sysctl.conf 里手动增大过 threads-max 参数,基本上无效(会有一点点变化,但变化很小,主要还是受到内存限制)
    Supplement 2  ·  Sep 9, 2017
    首先感谢#16 #18 的 @sagaxu 确实是 cgroup 限制
    要永久设置 cgroup 的 pids.max ,就是#17 楼的 @abmin521 贴的中一个答案提到的 /etc/systemd/logind.conf 文件中 UserTasksMax 参数,之前搜到这个问题,但是没有仔细将所有答案过一遍……
    20 replies  •  2017-09-09 19:11:55 +08:00
    misaka19000
    misaka19000
    Sep 8, 2017 via Android
    1
    哇,什么要求需要这么多线程啊?
    jingniao
    jingniao
    OP
    Sep 8, 2017 via Android
    2
    @misaka19000 只是闲着没事,看看各种极限
    Kilerd
    Kilerd
    Sep 8, 2017
    3
    如果换个想法想想,这个数字( 12000 )挺科学的。(前提是是 4 核 CPU )

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

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

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

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

    @abujj 这个实验中我关注的是操作系统的限制,并不是需要这么多并发
    mdzz
    mdzz
    Sep 8, 2017
    11
    达到限制后创建线程报什么错误?
    jingniao
    jingniao
    OP
    Sep 9, 2017
    12
    @mdzz python 会抛出一场:“ can't start new thread ”,在其他终端执行命令会报:“-bash: fork: retry: No child processes ”
    lrxiao
    lrxiao
    Sep 9, 2017
    13
    设置_pythread_threadstacksize 重新编译 py 试试?
    sagaxu
    sagaxu
    Sep 9, 2017
    14
    limits 限制排除了的话,显然是 cgroup 的限制,检查 pids.max
    jeffson
    jeffson
    Sep 9, 2017
    15
    关注,题主挺有想法的
    sagaxu
    sagaxu
    Sep 9, 2017❤️2
    16
    @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.
    jingniao
    jingniao
    OP
    Sep 9, 2017 via Android
    19
    @sagaxu 动作好快,看来是这个限制,回去试试
    pynix
    pynix
    Sep 9, 2017
    20
    内核线程数估计是有限制的吧,内核栈只有那么一点,多了就存不下了。
    用户线程的话应该和内存有关。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5057 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 05:59 · PVG 13:59 · LAX 21:59 · JFK 00:59
    ♥ Do have faith in what you're doing.