用top或ps命令定位CPU占用最高的进程,top实时查看并按P键排序,ps aux结合sort和head快速筛选前N名,再用top -H -p PID查具体线程,Java应用可进一步用jstack定位问题代码。

当你发现服务器响应变慢、风扇狂转或系统明显卡顿时,首先要确认是不是有程序在疯狂抢占CPU资源。这时候不能靠猜,得用命令直接揪出真凶。
用 top 实时揪出 CPU 大户
打开终端,直接输入:
top
界面刷新后,【默认就按 %CPU 降序排列】,排在最上面的进程就是当前最“吃”CPU的那个。重点关注 PID(进程编号)和 %CPU 这两列——PID 后续杀进程或查线程都要用,%CPU 在多核机器上可能超过 100%,比如 243.5 表示占满了 2.4 个核心。
运行中按 P 键可强制按 CPU 排序(虽然默认就是,但按一下更安心);按 q 立即退出。
用 ps 一次性筛选前 N 名
如果只需要快照式结果(比如写进监控脚本、发给同事看一眼),用这条命令更轻量:
ps aux --sort=-%cpu | head -10
它会列出 CPU 占用率最高的 10 个进程,字段清晰,含 USER、PID、%CPU、%MEM 和完整 COMMAND。注意:head -10 是默认显示前 10 行,若只要前 5 个,把 10 改成 5 即可。
想过滤特定服务?直接加管道:
ps aux --sort=-%cpu | grep nginx
【grep 会把匹配行和它的父进程(如 bash -c)都列出来,记得结合 PID 和 CMD 判断哪行才是真正的 nginx 主进程】
进一步锁定是哪个线程在捣鬼
很多高 CPU 问题其实不是整个进程的问题,而是某个线程疯跑。确认高 CPU 进程的 PID 后,执行:
第一步:top -H -p 【PID】
这会切换到线程视图,同样按 CPU 排序,TID(线程 ID)列就是关键。找到 TID 最高的那个线程。
第二步:printf "%x\n" 【TID】
把十进制线程 ID 转成十六进制,为后续分析 Java 堆栈做准备。
第三步:jstack 【PID】 | grep -A 10 【十六进制TID】
这一步只适用于 Java 应用——它能定位到具体哪一行代码在死循环或密集计算。如果不是 Java 进程,跳过此步。

















