V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
V2EX  ›  Linux

Linux 能创建的最大线程数

  •  
  •   jingniao · 75 天前用 Android 发布 · 2281 次点击
    这是一个创建于 75 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ubuntu 16.04 最新更新 kernel 4.10.x
    内存 16g
    目前搜索到的 limit.conf 跟 sysctl.conf 的 max-thread,都已经改到 10w+了
    使用 python3 threading 模块创建线程,只能创建 12000 左右的线程
    还有什么方法能增大这个限制么?
    第 1 条附言  ·  74 天前
    我在虚拟机上进行了测试:
    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 参数,基本上无效(会有一点点变化,但变化很小,主要还是受到内存限制)
    第 2 条附言  ·  74 天前
    首先感谢#16 #18 的 @sagaxu 确实是 cgroup 限制
    要永久设置 cgroup 的 pids.max ,就是#17 楼的 @abmin521 贴的中一个答案提到的 /etc/systemd/logind.conf 文件中 UserTasksMax 参数,之前搜到这个问题,但是没有仔细将所有答案过一遍……
    20 回复  |  直到 2017-09-09 19:11:55 +08:00
        1
    misaka19000   75 天前 via Android
    哇,什么要求需要这么多线程啊?
        2
    jingniao   75 天前 via Android
    @misaka19000 只是闲着没事,看看各种极限
        3
    Kilerd   75 天前
    如果换个想法想想,这个数字( 12000 )挺科学的。(前提是是 4 核 CPU )

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

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

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

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

    @abujj 这个实验中我关注的是操作系统的限制,并不是需要这么多并发
        11
    mdzz   75 天前
    达到限制后创建线程报什么错误?
        12
    jingniao   74 天前
    @mdzz python 会抛出一场:“ can't start new thread ”,在其他终端执行命令会报:“-bash: fork: retry: No child processes ”
        13
    lrxiao   74 天前
    设置_pythread_threadstacksize 重新编译 py 试试?
        14
    sagaxu   74 天前
    limits 限制排除了的话,显然是 cgroup 的限制,检查 pids.max
        15
    jeffson   74 天前
    关注,题主挺有想法的
        16
    sagaxu   74 天前   ♥ 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.
        19
    jingniao   74 天前 via Android
    @sagaxu 动作好快,看来是这个限制,回去试试
        20
    pynix   74 天前
    内核线程数估计是有限制的吧,内核栈只有那么一点,多了就存不下了。
    用户线程的话应该和内存有关。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   534 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 53ms · UTC 20:18 · PVG 04:18 · LAX 12:18 · JFK 15:18
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1