默认按 CPU 占用实时降序需启动后按 Shift+P,或直接运行 top -o %CPU;ps aux --sort=-%cpu 提供瞬时快照,但统计方式与 top 不同。

top 命令默认排序不直观,怎么让它按 CPU 占用实时降序?
默认 top 启动后按 PID 排序,根本看不出谁在吃 CPU。得手动切到按 %CPU 排——按 Shift + P(大写 P),不是小写 p。这个键位容易按错,按完会看到顶部显示 Sort field: %CPU,且进程列表立刻重排。
注意:top 是动态刷新的,排序状态不会跨会话保留;每次新开 top 都要重新按一次 Shift + P。如果想一启动就按 CPU 排,可以加参数:top -o %CPU。
- 别用
top -p PID查单个进程——它会屏蔽其他进程,反而看不到“谁最高” -
top默认只显示用户态 CPU(%CPU 列),内核态时间含在里面,但不单独拆分 - 刷新间隔太短(如
-d 0.1)会让终端卡顿,生产环境建议保持默认 3 秒或设为-d 1
ps aux --sort=-%cpu 输出一次性快照,但结果为什么和 top 不完全一致?
ps 和 top 统计周期不同:ps 是瞬时采样,top 是过去几秒的滚动平均。所以 ps aux --sort=-%cpu | head -10 拿到的是“此刻 CPU 使用率估算值”,可能漏掉刚爆发又结束的短时峰值。
常用组合命令:ps aux --sort=-%cpu | head -n 11(因为第一行是表头)。注意 --sort=-%cpu 的负号不能丢,否则是升序。
-
ps的 %CPU 是归一化到单核的百分比(比如 4 核机器上满载一个线程显示约 25%),而top默认显示的是“占所有 CPU 时间的百分比”(满载单线程≈100%/核数) - 某些容器环境(如 Docker)中,
ps可能受 cgroups 限制,显示值被截断或偏高 - 避免写成
ps aux | sort -k3 -nr | head——sort解析字段易出错(%CPU 在第 3 列?实际是第 3 列是 %CPU,但字段间空格不固定,用sort可靠性远低于--sort原生参数)
htop 更友好,但为什么装完运行报 command not found?
htop 不是所有 Linux 发行版默认安装的。CentOS/RHEL 需先启用 EPEL:sudo yum install epel-release && sudo yum install htop;Ubuntu/Debian 直接 sudo apt install htop。
装好后,htop 默认就按 CPU 降序,支持鼠标点击列头切换排序,还能直接 F9 杀进程。但它依赖 ncurses,若在极简容器或 recovery shell 中运行失败,就是缺这个库。
- 别用
alias top=htop全局替换——有些运维脚本或监控工具硬编码调用top -b -n1,替换成htop会直接报错退出 -
htop显示的 CPU% 是每个线程单独计算的,多线程进程会拆成多行;而ps默认按进程聚合,数值表现不同 - 如果
htop启动后全是空白或乱码,大概率是终端 $TERM 变量不对,临时设成export TERM=xterm-256color再试
查到高 CPU 进程后,怎么快速定位是哪段代码或哪个线程干的?
光看 PID 和 COMMAND 不够,尤其 Java、Node.js 这类运行时进程。先用 ps -T -p PID 查线程级 CPU 占用(-T 显示线程,-p 指定进程),再结合 top -H -p PID(-H 开启线程视图)确认具体线程 ID(LWP)。
对 Java 进程,下一步通常是:jstack PID > jstack.out,然后搜 java.lang.Thread.State: RUNNABLE 和高 CPU 的 LWP(转成十六进制后匹配 nid);对 Python,可用 py-spy record -p PID -o profile.svg(需提前装 py-spy)。
- 别直接
kill -3 PID对非 Java 进程——这信号语义不统一,可能没日志,甚至被忽略 -
strace -p PID -c能统计系统调用耗时,但开销大,线上慎用;更轻量的是perf top -p PID(需 kernel-debuginfo 支持) - 容器里查宿主机 PID 时,注意 /proc/PID 下看到的是容器视角的 PID,和
docker top输出的 PID 可能不一致——得用docker inspect 容器名 | grep Pid找真实宿主机 PID









