/proc 是 Linux 内核提供的虚拟文件系统,动态生成实时状态数据,用于获取 CPU 和内存等底层指标;需通过差分计算 /proc/stat 得 CPU 使用率,用 /proc/meminfo 中 MemAvailable 判断内存压力,结合 /proc/[pid]/stat 和 /proc/[pid]/status 分析进程资源消耗。

/proc 是 Linux 内核提供的虚拟文件系统(procfs),不占用磁盘空间,所有内容由内核在运行时动态生成。它把系统运行状态以“文件”形式暴露给用户空间,是获取 CPU 和内存实时数据最底层、最权威的途径。
关键点在于:这些不是普通文件,而是内核状态的只读快照接口。每次读取都触发内核实时计算并返回当前值,毫秒级更新,无缓存延迟。
/proc/stat:读取CPU总体使用率
该文件第一行以 cpu 开头的数据,记录自系统启动以来各 CPU 模式的累计节拍数(jiffies):
cpu 1234567 890 234567 8901234 56789 1234 5678 0 0
字段依次为:user、nice、system、idle、iowait、irq、softirq、steal、guest(不同内核版本字段数略有差异)。
要算出 CPU 使用率,需两次采样(间隔 ≥100ms),用公式:
CPU使用率 = [ (Δuser + Δnice + Δsystem + Δirq + Δsoftirq + Δsteal) / Δtotal ] × 100%
其中 Δtotal = 所有字段之和的差值;idle 和 iowait 属于空闲时间,不计入分子。
注意:单次读取无法得出利用率,必须做差分计算;直接看某一行数值没有意义。
/proc/meminfo:读取内存实时状态
执行 cat /proc/meminfo 可获得完整内存统计,常用字段包括:
- MemTotal:物理内存总量(不含保留内存,如 BIOS/firmware 占用)
- MemAvailable:内核估算的、可立即用于新进程的内存(含可回收 cache/buffer),Linux 3.14+ 引入,比 MemFree 更真实
- Buffers:块设备 I/O 缓冲区占用
- Cached:页缓存(文件内容缓存)
- SReclaimable:SLAB 分配器中可回收的内核对象缓存(如 dentry/inode)
- SwapTotal / SwapFree:交换分区总容量与剩余空间
推荐精简提取核心字段:
cat /proc/meminfo | grep -E "^(MemTotal|MemAvailable|Buffers|Cached|SReclaimable|SwapTotal|SwapFree)"
MemAvailable 是判断内存是否紧张的核心指标——持续低于总内存 10% 才需警惕;而 MemFree 很小是常态,不代表内存不足。
/proc/[pid]/stat 与 /proc/[pid]/status:查单个进程内存与CPU消耗
每个进程在 /proc/<pid>/ 下都有对应目录,其中:
-
/proc/[pid]/stat:第14、15列分别是该进程的 utime(用户态时间)和 stime(内核态时间),单位为 jiffies;结合 `/proc/stat` 的总时间差,可算出进程级 CPU 占用率 -
/proc/[pid]/status:包含更易读的内存字段,如:
VmRSS(常驻内存,即 RES,单位 KB)
VmSize(虚拟内存大小,即 VIRT)
MMUPageSize 和 MMUHugePageSize 可辅助分析大页使用情况
例如快速查看某进程 RSS:
awk '/VmRSS/ {print $2 " KB"}' /proc/1234/status
编程读取注意事项
在 C 或 Shell 脚本中读取这些文件时需注意:
- 不要假设字段顺序绝对固定——不同内核版本可能增减字段,建议按关键字匹配(如用
grep MemAvailable而非依赖第几行) - 避免频繁轮询 `/proc/stat`——每秒多次读取无意义,且增加内核开销;建议最小采样间隔 200ms
- 读取 `/proc/[pid]/` 下文件前,先检查 PID 是否仍存在(防止进程退出后目录消失导致 read error)
- 权限方面:多数 `/proc` 文件对普通用户可读;但 `/proc/[pid]/` 下部分文件(如 `environ`)需进程属主或 root 权限
本质上,/proc 就是内核运行时状态的“API 文档”。它不提供抽象封装,但足够稳定、轻量、可靠——所有 top、free、htop 工具,底层都靠它喂数据。


















