直接用 ps -eo pid,%mem,comm --sort=-%mem | head -20 获取进程内存占用比,%mem 字段即“rss/系统总内存×100”,精度高、免手动计算;可加 awk 过滤非 root 用户且 %mem > 0.1 的活跃进程,或导出含 vsz/rss 的 csv 表格。

要批量获取进程的内存占用比(即每个进程占系统总物理内存的百分比),关键不是靠人工算,而是用 ps 直接输出标准化的 %MEM 字段——它本身就是按“进程 RSS / 系统总内存 × 100”自动计算好的百分比值,精度高、开销低、无需额外解析。
直接用 ps 输出所有进程的 %MEM 和关键信息
执行以下命令,可一次性列出全部进程的内存占用比、PID、命令名等核心字段:
ps -eo pid,%mem,comm --sort=-%mem | head -20
-
-e表示所有进程;-o自定义输出列:pid(进程ID)、%mem(内存占用百分比)、comm(简短命令名) -
--sort=-%mem按内存占比降序排列(-表示倒序),head -20只看前 20 名,避免刷屏 - 输出的
%MEM是实时、归一化的值,比如2.3表示该进程当前占用了系统总物理内存的 2.3%
排除干扰项,只看用户级活跃进程
系统中常有大量内核线程(如 kthreadd、ksoftirqd)或僵尸进程,它们的 %MEM 通常为 0 或极小,但会挤占列表。如需聚焦真实应用进程,可加过滤:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
ps -eo pid,%mem,comm,user --sort=-%mem | awk '$2 > 0.1 && $4 != "root" {print}' | head -15
-
$2 > 0.1筛出内存占比超 0.1% 的进程(排除噪声) -
$4 != "root"跳过 root 用户的系统服务(按需调整,比如保留www-data或nginx) - 结果更贴近运维或开发关注的实际“内存大户”
导出为表格供进一步分析
若需批量处理或存档,可用 tab 分隔格式导出 CSV:
ps -eo pid,%mem,vsz,rss,comm --sort=-%mem | sed '1s/^/PID\t%MEM\tVSZ(KB)\tRSS(KB)\tCOMMAND/' | column -t -s $'\t' > mem_top.csv
- 包含
VSZ(虚拟内存)和RSS(实际物理内存)便于交叉验证 -
column -t对齐显示,sed加表头,适合用 Excel 或awk后续统计 - 注意:
%MEM和RSS数值逻辑一致,但%MEM更适合横向比较占比,RSS更适合看绝对内存大小
为什么不用 free + 手动计算?
有人尝试用 free | awk '/Mem:/ {total=$2}' 获取总内存,再配合 ps aux 中的 RSS 列去算百分比,这容易出错:
-
free的 total 是 KB 单位,而ps aux的 RSS 默认是 KB,但部分系统或选项下单位可能不一致 -
ps aux包含标题行和 grep 自身进程,易引入干扰 -
%MEM字段由内核直接提供,已做四舍五入与归一化,权威且省心










