登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux 怎样为单个进程查看资源限制

来源:17golang原创

时间:2026-10-18 02:26:34 228浏览 收藏

查看单个 Linux 进程的资源限制,可以用 prlimit --pid PID;只查文件描述符限制时加 --nofile,但不要加等号和值。输出中的 SOFT 是软限制,HARD 是硬上限,它们不是当前资源使用量。想看完整文本,也可以读取该进程的 /proc/PID/limits。

util-linux 官方项目地址:https://github.com/util-linux/util-linux;prlimit 上游手册:https://github.com/util-linux/util-linux/blob/master/sys-utils/prlimit.1.adoc。系统调用语义可参照 Linux man-pages:https://man7.org/linux/man-pages/man2/getrlimit.2.html。以下命令未在本机执行,没有真实故障记录或实测数值。

我会先固定 PID,而不是先调高一个数字

以“后台工作进程打开文件失败”这个假设场景来说,我更关心的是工作进程实际继承了什么限制,而不是当前终端允许打开多少文件。这是我的排查取舍,不是一次亲历生产事故的复盘。Shell 与服务可能由不同入口启动,拿终端的 ulimit 代替服务 PID 的结果,容易把问题带偏。

先从现有服务管理或进程记录确认目标 PID、程序身份和启动时间。多工作进程的服务要确认具体工作进程,不能把主进程的一份输出当成所有成员的共同证据。PID 还可能在退出后被复用,查询前后都要注意目标是否还是同一进程。

只查限制时,我保留最少的参数

# 例中 PID 只是占位,先替换成已确认身份且有权查看的目标进程。
resource_pid=24680

# 不带资源赋值,仅列出该进程的资源限制。
prlimit --pid "$resource_pid"

# 只查询文件描述符限制,并明确要求输出列。
prlimit --pid "$resource_pid" --nofile --output RESOURCE,SOFT,HARD,UNITS

# proc 文件提供另一种只读入口,仍需有相应访问权限。
cat "/proc/$resource_pid/limits"

第一条取得总体限制,第二条收窄到 NOFILE,并保留单位。上游手册说明输出列可用 --help 查询;发行版附带版本有差异时,应以本机帮助列出的支持项为准,不要为了一种输出样式直接升级生产工具。proc 入口更适合人工查看,不必为了截一行再拼接脆弱的固定列号解析。

选择适合目的我的取舍
prlimit --pid查看进程资源限制适合作为首次总览
prlimit 加资源选项只追查一项限制保留软值、硬值与单位,减少误读
/proc/PID/limits直接读取进程限制文本适合人工对照,但仍有权限与生命周期约束

静态关系中,PID 标识目标进程;prlimit 和 /proc/PID/limits 是两种查询入口;SOFT 与 HARD 是该进程限制的两个值。图里没有资源当前用量,也没有把命令输出伪造成服务器截图。

目标进程与两种限制查询入口的静态关系
图1:结构说明图。观察入口分组说明 PID 与查询方式,限制对象分组呈现目标进程、软限制和硬限制,连线不表示执行顺序。

最容易让我停下来确认的,是资源含义和单位

我不会把所有限制都叫“进程配额”。NOFILE 对应可打开的文件描述符编号范围上限,并非此刻已经打开的数量;NPROC 虽然出现在某个 PID 的限制表里,Linux 的计数语义涉及真实用户 ID 下的进程或线程,不能直接解释成“这个进程独享这么多个子进程”。

同样,AS 是虚拟地址空间限制,不等于已驻留物理内存;CPU 是累计 CPU 时间限制,不是 CPU 使用率百分比。看到 unlimited 也只意味着该项 rlimit 没有有限数值上限,不意味着机器、服务环境和其他控制层都无限。对我来说,先弄清限制约束的对象,比先判断数字大不大更有价值。

SOFT 通常是对应资源被执行的当前限制,HARD 则约束软限制可以调整到的范围。软值不能超过硬值。当前资源消耗还需用相应观测手段单独查看;仅有 prlimit 一行不能证明文件句柄泄漏,也不能证明某个配置值适合生产负载。

如果确实要调整,我会把它当作独立变更

查询与设置的分界就在资源选项后有没有赋值。--nofile 是查询;--nofile=soft:hard 是设置。单个 value 会同时设置软硬值;soft 后带冒号只改软值,冒号后给 hard 则只改硬值。为了避免误降硬上限,我倾向先只读取得现有值,再按批准的变更目标讨论是否修改。

# 下面函数只展示修改语法,不自动调用;仅限已批准的独立测试进程。
set_demo_soft_limit() {
    demo_pid="$1"
    demo_soft="$2"
    # 尾部冒号表示只改软限制,硬限制保持原值;先确认软值不高于现有硬值。
    prlimit --pid "$demo_pid" --nofile="${demo_soft}:"
}
# 本文不提供调用示例,避免把演示数值当成生产建议。

这段只是语法示意,定义函数并不会修改任何进程。需要执行时,必须另外确认测试 PID、数值、权限、原值记录和恢复方案。普通权限下,降低硬限制后通常不能再自行升回原值;不能把“先降下来试试看”描述成总能无损回退。调高硬限制还受所需能力及系统边界约束,不是加一个更大数字就一定成功。

设置关系可以分成“输入语法”与“约束规则”:soft:、:hard 和 value 分别描述修改哪些值,软限制与硬限制承担不同职责,权限条件决定允许的修改范围。它们不是自动化执行流水线。

资源限制设置语法与软硬上限约束的静态关系
图2:结构说明图。语法分组与约束分组分开阅读,尤其注意 value 同时触及两个值,不能误认为仅修改软限制。

这套方法适合现场观察,不替代启动策略

我的选择是:临时定位用 PID 查询,长期配置回到实际启动入口。修改运行中进程不等于把默认值写进服务配置;进程重启后要观察新的 PID。子进程在创建时继承限制,但不能据此认定修改父进程就追溯修改了所有既有子进程。

查询失败时保留错误本身:进程不存在与权限不足是两类问题。不要通过不断提权来掩盖目标 PID 选错;容器或其他隔离环境中,还要注意自己所处的进程观察范围。本文没有执行修改,也不声称一条命令解决所有资源不足问题。

没有写 --pid,会默认查业务进程吗?

不会自动猜业务进程。没有指定 PID 且没有附加要运行的命令时,prlimit 操作自身运行进程,不能拿结果当作后台服务限制。

SOFT 比 HARD 小,是配置错误吗?

不一定。这本来就是允许的关系,硬值提供软值调整的上界。是否需要提高软值,要结合真实负载与批准的运行策略判断。

限制表里的数值就是当前使用量吗?

不是。限制与消耗要分别记录,并确认它们的单位、计数范围和采样时间,才有条件讨论是否触及上限。

对单进程排查,我会把“PID 身份、资源含义、SOFT/HARD 和单位”作为一组信息保存下来。只读查询先把事实说清楚,设置则留到具备明确目标与恢复条件的独立变更中。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>