麒麟v10系统高并发下进程创建失败提示“resource temporarily unavailable”,主因是pid_max等内核进程/线程限制触顶;需依次检查pid_max、当前进程数、ulimit -u、threads-max及活跃线程数并按需调优。

如果您在麒麟V10系统中运行高并发服务或大量容器实例时遇到进程创建失败、提示“Resource temporarily unavailable”,则很可能是系统最大进程数限制(即 PID 编号池上限)已触顶。以下是查看与确认该限制的详细步骤:
一、查看当前系统最大进程ID限制(pid_max)
kernel.pid_max 参数定义了内核可分配的 PID 编号范围上限,直接决定系统理论上能同时存在的进程总数。该值并非用户级限制,而是全系统硬性边界。
1、执行命令读取当前生效值:cat /proc/sys/kernel/pid_max
2、若输出为 32768,表明未经过调优;x86_64 架构下典型优化值为 196608 或 4194304(2²²)。
二、查看当前已使用进程数量
仅知上限不足以判断是否临近瓶颈,需同步统计实际占用量,以评估余量压力。
1、统计所有活动进程PID目录数量:ls /proc/[0-9]* | wc -l
2、或使用标准进程计数命令:ps -e --no-headers | wc -l
3、对比二者差值:若已用数持续高于上限的 85%,应立即考虑扩容。
三、查看单个用户最大进程/线程数(nproc)
ulimit -u 限制的是每个用户(含其启动的所有线程)可拥有的进程+线程总数,该值受 pid_max 约束但更细粒度,常成为实际瓶颈点。
1、在目标用户会话中执行:ulimit -u
2、若返回 4096 或更低,而应用需启动数千线程(如 Java 多线程服务),则必须提升此值。
3、注意:该限制对 systemd 启动的服务无效,需额外配置 service 文件中的 LimitNPROC= 字段。
四、验证系统总线程数上限(threads-max)
threads-max 决定了内核允许创建的最大线程总数,其计算逻辑依赖物理内存页数,过高设置可能因内存碎片导致无效。
1、读取当前 threads-max 值:cat /proc/sys/kernel/threads-max
2、检查是否显著低于 pid_max:例如 pid_max=4194304 但 threads-max=1048576,则线程密集型负载将率先触发限制。
3、该参数与 pid_max 应保持合理比例,推荐 threads-max ≤ pid_max × 0.5,避免调度器开销激增。
五、检查当前活跃线程总数
Linux 中线程也占用独立 PID,因此高线程应用会快速消耗 pid_max 资源,需单独统计以识别隐性压力源。
1、执行全系统线程计数:ps -eLf | wc -l
2、对比 ulimit -u 输出:若线程数接近该值,说明某用户下存在线程泄漏或过度并发。
3、定位高线程进程:运行 ps -eo pid,nlwp,comm --sort=-nlwp | head -10,按线程数(NLWP 列)降序列出前十个进程。










