prlimit 是什么
prlimit 是 util-linux 提供的资源限制查看与调整工具,可以理解为 ulimit 的进程外版本:它按 PID 读取目标进程当前真正生效的 rlimits,也能在线调整软限与硬限,不必重启服务。排查「服务跑着跑着打不开文件」「创建线程失败」这类问题时,先用它确认 nofile、nproc 的实际值最有说服力。
基本信息
| 所属 | util-linux |
|---|---|
| 语法 | prlimit [--pid PID] [--nofile=软:硬] [--nproc=N] |
| 权限要求 | 查看他人进程、调高硬限需要 root |
| 常用项 | nofile 打开文件数、nproc 进程线程数、memlock 锁定内存、stack 栈大小 |
典型使用场景
- 服务上线后才发现句柄上限偏小,临时调高顶住再妥善重启
- 出现「打开文件过多」「无法创建线程」报错时先确认当前生效值
- 对比同一程序在不同机器上的限制差异,解释行为不一致
- 压测前临时放宽栈或锁定内存限制
- 审计关键服务的资源上限是否符合容量规划
- 定位父子进程限制不一致导致的疑难问题
常用示例
常用示例
prlimit --pid 1234 # 列出该进程的全部限制
prlimit --nofile --pid 1234 # 只看打开文件数限制
prlimit --nofile=65535:65535 --pid 1234 # 在线提高软硬限
prlimit --nproc=8192 --pid 1234 # 提高进程与线程数上限
prlimit --memlock=unlimited --pid 1234 # 放宽锁定内存限制
prlimit --pid $$ # 查看当前 shell 自身的限制
cat /proc/1234/limits | head # 直接读 procfs 的另一种方式
systemctl show app -p LimitNOFILE # 服务限制来自单元配置常用限制项
| 限制项 | 含义 | 常见问题 |
|---|---|---|
| nofile | 可打开文件描述符数 | 偏小会报打开文件过多 |
| nproc | 进程与线程数上限 | 偏小会导致创建线程失败 |
| memlock | 可锁定内存字节数 | 数据库与缓存服务常需调大 |
| stack | 进程栈大小 | 偏小会让深递归程序崩溃 |
| 硬限 | 软限不得超过它 | 降低后普通用户无法提回 |
prlimit 的在线调整是临时的:进程重启后会回到配置文件里的值。救急之后要同步修改 systemd 单元、limits.conf 或启动脚本,才算真正解决。
硬限一旦被调低,非 root 身份就无法再提回:修改前先记录原值,或确认手上有 root 权限可以恢复,否则只能靠重启进程还原。
systemd 管理的服务,其限制来自单元配置(如 LimitNOFILE),改 /etc/security/limits.conf 对它们通常无效;改完要 daemon-reload 并重启服务,再用 prlimit 复核生效值。