直接用top命令就能快速定位cpu占用最高的进程,这是最常用、最有效的第一步;它默认按%cpu降序排列,排在最上面的就是当前最“吃”cpu的进程,结合%cpu(s)行中us/sy/wa等指标可区分真实瓶颈。

直接用 top 命令就能快速定位 CPU 占用最高的进程,这是最常用、最有效的第一步。它默认按 %CPU 降序排列,排在最上面的就是当前最“吃” CPU 的进程。
看懂 top 头部的 CPU 状态行
启动 top 后,第三行显示类似 %Cpu(s): 12.5 us, 3.1 sy, 0.0 wa, 84.4 id 的信息。这不是进程数据,而是系统整体 CPU 时间分配快照:
- us:用户态程序(如 Java、Python、Nginx)占用 CPU 的比例;长期高于 70% 表明业务逻辑密集
- sy:内核态时间,高 sy 通常意味着频繁系统调用(如大量小文件读写、内存分配)
- wa:等待磁盘或网络 I/O,此时 %CPU 可能不高,但系统响应慢,不能只盯 %CPU
- id:空闲时间,低于 10% 就该介入排查了
确保按 %CPU 正确排序并聚焦目标进程
虽然 top 默认按 CPU 排序,但实际使用中容易被误切到其他字段。稳妥做法是:
- 运行
top后,直接按大写 P 键(注意大小写敏感),强制按 %CPU 降序重排 - 按 Shift+H 切换线程视图(显示 LWP 列),可发现某个进程 %CPU 很高,但其实是其中某条线程在霸占资源
- 按 u 输入用户名(如
www-data或java),快速过滤非业务进程,避免被系统守护进程干扰 - 按 O 进入字段排序菜单,输入
P再次确认排序依据为 %CPU,防止误操作导致排序失效
结合关键字段识别真实问题进程
进程列表中不光要看 %CPU,还要交叉验证其他字段才能判断是否真有问题:
- PID 和 %CPU:最直观指标,但需结合 TIME+ 判断——TIME+ 很小而 %CPU 突然冲高,可能是短时任务,未必异常
- STATE(S/R/D/Z):R 表示运行中,D 表示不可中断睡眠(常卡在 IO),Z 是僵尸进程(不耗 CPU,但会占 PID)
- PR/NI:低 PR(如 0–10)表示高优先级,可能更“抢” CPU;若 NI 为负值,说明被手动提权过
-
COMMAND:按 c 键展开完整命令行,能看清是
java -jar app.jar还是python3 sync.py,便于后续归因
定位后别急着 kill,先做轻量诊断
找到可疑 PID(比如 12345)后,建议按顺序执行以下几步再决定是否终止:
- 查线程分布:
top -Hp 12345,看是否单一线程占满(如 99.5%),再记下高负载线程 ID(LWP) - 转十六进制并查 Java 栈:
printf "%x\n" 12345→jstack 12345 | grep -A 10 "nid=0x[hex]" - 看内核栈(需 root):
cat /proc/12345/stack,若停在mutex_lock或wait_event,说明卡在锁或等待事件 - 统计系统调用:
strace -p 12345 -c -s 64 -T 2(运行 2 秒),观察是否高频 futex、read、write











