使用“ps aux --sort=-%mem | head -n 10”命令,可直接输出内存占用最高的前10个进程,并按照%MEM字段进行降序排列。此命令不依赖交互,也无需安装额外工具。%MEM指的是进程RSS占系统MemTotal的百分比,当精度有限时,建议使用“--sort=-rss”参数。

直接看 ps aux --sort=-%mem | head -n 10 就能拿到当前内存占用最高的前 10 个进程,这是最轻量、最通用、无需额外安装的方案。
ps aux --sort=-%mem 是怎么排序的
ps aux 会默认展示所有用户的全部进程,包括详细的字段信息。--sort=-%mem 这部分的作用是依据 %mem 字段进行降序排列(其中 - 代表降序,而 +%mem 则是升序)。head -n 10 是用来截取前10行的内容。这种组合方式不依赖交互操作,也不会自动刷新,并且其结果可以通过管道进行后续的处理。
%mem是进程占用物理内存占系统总内存的百分比,计算基于rss和MemTotal,不是虚拟内存(virt)或共享内存(shr)- 如果想按实际物理内存大小(KB)排序,用
--sort=-rss更准,尤其当进程数量多、内存总量大时,%mem可能因精度丢失漏掉中等但绝对值高的进程 - 注意:同一进程的多个线程会单独计为不同
PID,ps默认不合并线程内存,如需按进程名聚合,得用smem或脚本后处理
top 按内存排序的实操要点
运行 top 后按 Shift+M(大写 M)即可按 %MEM 降序,但很多人卡在细节上:
- 默认界面只显示部分列,
%MEM不一定在视野里 —— 按f进入字段管理,用方向键选中%MEM,按空格启用它,再按q返回 - 按
M一次是降序,再按一次切换为升序,容易误判 —— 看顶部状态栏是否显示Mem: sort by %MEM (desc) top的RES(即rss)单位是 KB,但显示时自动缩放(K/M/G),而%MEM是实时计算值,受MemA vailable影响小,更稳定- 退出别用
Ctrl+C,会残留前台进程 —— 务必按q
htop 为什么更直观但要注意兼容性
htop 界面友好,但不是所有系统预装,且排序逻辑和 top 不同:
- 安装后首次运行,默认按 CPU 排序,要按内存需先按
F6,再用方向键选MEM%,回车确认 —— 不是M键 htop默认开启“树状视图”,父子进程折叠显示,可能掩盖真实内存大户;按F5切换平铺模式更利于横向对比- 某些旧版
htop(如 CentOS 7 默认源中的 2.0.2)不支持--sort命令行参数,只能交互操作;新版(≥3.0)才支持htop --sort-key MEM% --no-color直出文本 - 颜色高亮靠终端支持,SSH 连接时若字符乱码,加
--no-color参数可规避
别忽略 /proc/meminfo 里的可用内存含义
查排行只是第一步,判断“是否真缺内存”得看 /proc/meminfo 里的 MemA vailable:
free -h输出的a vailable字段就来自这里,它 ≠free+buff/cache,而是内核估算的、可立即分配给新进程的内存量- 如果
MemA vailable远低于总内存 10%,即使%mem排行里没看到异常进程,也可能存在大量匿名页或 slab 缓存未回收 - 此时
ps或top看到的高%mem进程未必是元凶 —— 得结合cat /proc/meminfo | grep -E "^(Mem|SReclaimable|Slab)"看 slab 占用
真正难的是区分“单个进程吃内存”和“内核缓存吃内存”,ps 排行只解决前者;后者需要交叉验证 /proc/meminfo 和 slabtop,否则容易误杀服务进程。