ps aux --sort=-%cpu | head -n 10 可列出CPU占用最高的前10个进程;ps aux显示完整字段,--sort=-%cpu按CPU使用率降序排列,head -n 10限制输出行数。

直接用 ps aux --sort=-%cpu | head -n 10 就能列出 CPU 占用最高的前 10 个进程。
关键参数说明
ps aux:显示所有用户的所有进程,包含完整字段(USER、PID、%CPU、%MEM、VSZ、RSS、TTY、STAT、START、TIME、COMMAND)
--sort=-%cpu:按 %CPU 列降序排列(减号表示倒序)
head -n 10:只取前 10 行,避免输出过长
为什么不用 ps -ef?
ps -ef 默认不显示 %CPU、%MEM 等资源使用率字段,它侧重进程关系(PPID、C、STIME),适合查启动链路,不适合资源排序。
若硬要用 -ef 格式查 CPU,必须配合 -o 自定义输出,例如:
ps -eo pid,%cpu,%mem,comm --sort=-%cpu | head -n 10
注意 %CPU 的真实含义
%CPU 是 ps 在采样瞬间计算出的**平均值**,单位是“CPU 时间占比”,不是瞬时峰值。
它基于 /proc/[pid]/stat 中的 utime 和 stime,再结合系统启动以来的总 jiffies 推算得出。
所以可能出现 top 显示 92%,而 ps 显示 0.0 的情况——那是因为该进程刚启动不久,累计时间太短,分母太大导致比值极小。
进阶:定位 Java 或多线程程序的真实热点
默认 ps aux 只显示主线程(线程组 leader),无法反映多线程并发占用。
要看到每个线程的 CPU 消耗,需加 -T 参数:
ps -eLf --sort=-%cpu | head -n 10
其中 L 表示显示线程,F 表示全格式,TID 列即为线程 ID,可配合 jstack 或 perf 追踪具体栈帧。


















