必须同时调整ulimit -u(用户级)、/proc/sys/kernel/pid_max(系统PID上限)和kernel.threads-max(内核线程总数),缺一不可;否则高并发时仍会报“Resource temporarily unavailable”或“unable to create new native thread”。

Linux 中调整最大进程数和线程限制,本质是打通三层控制:用户级、内核级 PID 总量、内核级线程总量。只改其中一层,高并发场景下仍会报 Resource temporarily unavailable 或 java.lang.OutOfMemoryError: unable to create new native thread。
一、优先调大用户级进程/线程总数(ulimit -u)
Linux 中线程也占 PID,ulimit -u 限制的是“当前用户所有进程 + 线程总数”,不是纯进程数。Java、Node.js、Go 等多线程应用极易打满该值。
- 临时生效(当前终端及子进程):
ulimit -u 65535 - 永久生效(需新登录或重启服务):
编辑/etc/security/limits.d/90-nproc.conf(推荐新建文件,避免覆盖默认配置),写入:* soft nproc 65535* hard nproc 65535 - 确认 PAM 加载生效:
检查/etc/pam.d/common-session和/etc/pam.d/common-session-noninteractive中是否含:session required pam_limits.so
二、同步提升系统级 PID 上限(pid_max)
/proc/sys/kernel/pid_max 是内核能分配的 PID 总数上限,也是所有进程/线程的“天花板”。若它卡在默认 32768,即使 ulimit -u 设为 65535,也会因 PID 耗尽而 fork 失败。
- 查看当前值:
cat /proc/sys/kernel/pid_max - 临时修改(立即生效):
sysctl -w kernel.pid_max=4194304 - 永久修改:
在/etc/sysctl.d/99-pid-limit.conf中添加:kernel.pid_max = 4194304
然后执行sysctl --system
三、适配 systemd 服务与容器环境
systemd 不读 /etc/security/limits.conf,Docker/K8s 也不自动继承宿主机 ulimit,必须显式声明。
- systemd 单服务配置:
编辑/etc/systemd/system/your-app.service,在[Service]段添加:LimitNPROC=65535 - systemd 全局配置(影响所有新启服务):
编辑/etc/systemd/system.conf,取消注释并修改:DefaultLimitNPROC=65535
再运行systemctl daemon-reload - Docker 容器启动时指定:
docker run --ulimit nproc=65535:65535 your-image - Kubernetes Pod 中配置:
在securityContext.limits.nproc字段设置
四、必要时检查 threads-max(内核线程总数上限)
/proc/sys/kernel/threads-max 表示内核理论上可支撑的全局线程总数,由内存大小自动计算,默认值通常足够。但若手动调高 pid_max 后仍异常,需验证此值是否 ≥ pid_max(否则写入会被静默截断)。
- 查看当前值:
cat /proc/sys/kernel/threads-max - 临时设置(需 root):
echo 2097152 > /proc/sys/kernel/threads-max - 永久设置:
在/etc/sysctl.d/99-thread-limit.conf中添加:kernel.threads-max = 2097152
再运行sysctl --system











