This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/EVMK2H:root 用户进程的 pthread_create()最大限制

Guru**** 2562920 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/594660/linux-evmk2h-max-pthread_create-limit-for-root-user-process

器件型号:EVMK2H

工具/软件:Linux

您好!

我们将 EVMK2H REV4.0板与 SDK ti-processor-sdk-linux-k2hk evm-03.02.00.05-linux-x86配合使用。

我们在前面提交了一个问题、该问题涉及在单个根进程中创建线程时遇到的限制、我们在那里

限制为创建509个线程。  事实证明、问题与虚拟内存无关。

我们发现问题与我们在根 ssh shell 下运行线程创建程序有关。
事实证明、我们受到与 dropbear 相关的 PID cgroup 限制的限制。
我们发现、如果我们将在/sys/fs/cgroup/pids/system.slice/system-dropbear.slice 下创建的 dropbear 条目设置为"max"、那么我们就能够创建数千个线程。


示例: 在此示例中,ssh 会话的 pid 为46408。  如果我们执行以下命令:
   echo "max">/sys/fs/cgroup/pids/system.slice/system-dropbear.slice/dropbear@0-10.10.10.24:22-10.10.10.2:46408.service/pids.max
然后、我们能够创建所需的线程数。

在进行更改之前、此条目的 PIDS.max 限制为512。
到目前为止、我们无法找到如何更改此默认值。

如何 更改512的默认值?

如有必要、我也可以将其发布到 Linux 组、但它似乎与 k2hk EVM SDK 密切相关。

感谢您的所有帮助。

谢谢、

Bob

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob:

    查看内核源代码(pid.c)、您可以看到最大 pid 设置为:
    int pid_max = PID_MAX_DEFAULT;

    进一步跟踪、您可以看到如何在 include/linux/threads.h 中设置 PID_MAX_DEFAULT:
    /*
    *这控制分配给进程的默认最大 pid
    *
    #define PID_MAX_DEFAULT (CONFIG_BASE_SABLE? 0x1000:0x8000)

    /*
    *一段时间内、最多400万个 PID 就足够了。
    *[注:PID/TID ~ 2^29 = 500+百万、请参阅 futex.h]
    *
    #define PID_MAX_LIMIT (CONFIG_BASE_Small? Page_size * 8:\
    (sizeof (long)> 4? 4 * 1024 * 1024:PID_MAX_DEFAULT)

    然后、arch/arm/configs/tisdk_k2g-evm_defconfig 会设置 CONFIG_BASE_Small = 0、因此 PID_MAX_DEFAULT 会设置为0x8000。

    从用户空间的角度来看、您可以跟踪 pid_max 的 sysctl 设置:
    sysctl kernel.pid_max

    希望这对您有所帮助。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!

    非常感谢您为此付出的努力。
    我认为我遇到的问题与内核源代码中"pid_max"的值没有关系。

    相反、它必须与动态创建的与 dropbear 相关的 cgroup 下给定 pid_max 参数的默认设置有关。

    当我向 EVMK2H ARM 处理器执行 ssh 时、会在 cgroup/PID 层次结构下创建以下条目:
    /sys/fs/cgroup/pids/system.slice/system-dropbear.slice/dropbear@0-10.10.10.24:22-10.10.10.2:46408.service/pids.max

    请注意,IP 地址部分(0-10.10.10.24:22-10.10.10.2)和进程 ID 部分(46408)对于此会话是唯一的。

    检查此条目的内容时,发现它等于512。

    $ cat /sys/fs/cgroup/pids/system.slice/system-dropbear.slice/dropbear@0-10.10.10.24:22-10.10.10.2:46408.service/pids.max
    512

    此时、如果我运行我的线程创建程序、它能够创建的最大线程数为509。

    如果我将此值更改为更大的值、即"max"、则我的线程创建程序能够创建更多的线程。

    $ echo "max">/sys/fs/cgroup/pids/system.slice/system-dropbear.slice/dropbear@0-10.10.10.24:22-10.10.10.2:46408.service/pids.max

    通过调试内核、我能够确定这是问题所在、这导致了以下调用跟踪:

    DO _叉()-/kernel/fork.c
    _do_fork ()-/kernel/fork.c
    copy_process()-/kernel/fork.c
    cgroup_can_fork ()-/kernel/cgroup.c
    PIDS_CAN_fork ()-/kernel/cgroup_pids.c
    PIDS_TTRY ()-/kernel/cgroup_pids.c
    返回-EAGAIN

    此时、我正在尝试确定是否有配置设置或可以更新的内容、以便在创建 dropbear cgroup 条目时将 PIDs.max 的值设置为我选择的值。 到目前为止、我无法确定如何实现这一点、但我认为不需要更改内核源代码。

    非常感谢、
    Bob
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob:

    很抱歉耽误你的时间。 我将对此进行研究。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob:

    在启动服务时、我还在寻找是否有任何限制线程数量的因素。

    [引用]此时,我正在尝试确定是否有配置设置或可以更新的内容,以便在创建 dropbear cgroup 项时,将 PIDs.max 的值设置为我选择的值[/引用]

    解决方法是、您是否尝试创建一个服务文件来设置所需的 PID 数量? 在此处查看如何创建 systemd 服务:
    e2e.ti.com/.../561065
    通过这种方式、服务将配置:
    回显"number_for_PIDs">/sys/fs/cgroup/pids/system.slice/system-dropbear.slice/dropbear@0-10.10.10.24:22-10.10.10.2:46408.service/pids.max
    每个内核启动。

    此致、
    Yordan