PID 编号空间是什么
kernel.pid_max 规定系统可用的进程标识符上限,默认 32768,允许调整的上限是 4194304。PID 是循环复用的编号,用满之后内核会从头开始分配尚未占用的编号。需要注意线程也会消耗 PID 空间:一个多线程进程的每个线程都是一个任务,都要占用一个编号。高密度容器或多线程场景下,PGID 空间可能先于内存耗尽,表现为创建进程或线程失败。
基本信息
| 参数 | kernel.pid_max |
|---|---|
| 默认值 | 32768,许多发行版已上调,以本机回读为准 |
| 取值上限 | 4194304 |
| 消耗者 | 进程与线程都会占用编号 |
| 典型报错 | 创建进程或线程失败,错误为资源暂时不可用 |
| 相关限制 | 容器内的任务数限制由 cgroup 的 pids 控制器决定 |
典型使用场景
- 高密度节点:容器与线程数量大,编号空间需要评估
- 排查创建失败:区分是编号空间不足、线程泄漏还是容器任务数限制
- 容量规划:按线程峰值乘以实例数量估算所需编号空间
- 交付基线:在自动化装机流程中固化该参数,避免逐台调整
- 故障复盘:结合当时的任务总数与编号使用情况分析
查看与调整
查看与调整
sysctl kernel.pid_max # 读当前上限
ps -eLf | wc -l # 当前任务(进程加线程)总量
ls /proc | grep -E '^[0-9]+$' | wc -l # 当前存在的进程编号数量
sysctl -w kernel.pid_max=4194304 # 临时调整
cat /proc/sys/kernel/threads-max # 线程上限,需一并核对落盘与回读
落盘与回读
# /etc/sysctl.d/99-pid.conf
kernel.pid_max = 4194304 # 放宽编号空间,适配高密度线程场景
# 回读命令:sysctl kernel.pid_max相关限制对照
| 限制 | 作用范围 | 触发表现 |
|---|---|---|
| kernel.pid_max | 系统整体编号空间 | 创建任务失败,错误为资源暂时不可用 |
| threads-max | 系统线程总数上限 | 线程创建失败,与编号空间叠加判断 |
| cgroup pids.max | 容器的任务数上限 | 容器内创建任务被拒,宿主此时可能仍有余量 |
| RLIMIT_NPROC | 单用户可创建任务数 | 同一用户下的进程创建失败 |
触顶表现为创建进程或线程失败,但在调整参数之前应先排除线程泄漏:任务总量持续增长而不回落,通常说明应用存在线程管理缺陷,抬高上限只会推迟故障。
容器内的任务数限制与这个参数不是同一层:容器被限制时的证据在 cgroup 的 pids 控制器里,宿主编号空间可能还很充裕。排查时应先确认到底在哪一层被拒绝。