news 2026/5/5 1:54:46

Linux进程CPU飙高排查手册

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux进程CPU飙高排查手册

前言

服务器CPU突然飙到90%以上,告警响个不停。这时候需要快速定位是哪个进程、哪个线程、哪行代码在吃CPU。

这篇整理一套完整的排查流程,从定位进程到找出具体代码行,覆盖Java、Go、Python等常见语言。


一、先看是哪个进程

上去第一件事,top看一眼:

top

输出里重点看这行:

%Cpu(s): 85.2 us, 3.1 sy, 0.0 ni, 10.5 id, 0.0 wa, 0.0 hi, 1.2 si

us高说明是用户程序在吃CPU,wa高说明在等IO。如果us很高,基本就是业务代码的问题。

P排序,罪魁祸首一目了然:

PID USER %CPU %MEM COMMAND 12345 app 156.0 8.2 java -jar app.jar

好家伙,156%,跑满了一个半核心。

二、定位是哪个线程

Java进程里几百个线程呢,得继续缩小范围:

top-H -p12345

-H显示线程级别。果然有个线程98%:

PID USER %CPU COMMAND 12367 app 98.0 java 12368 app 2.3 java

记下这个线程ID:12367

三、定位具体代码

Java的话用jstack:

jstack12345>/tmp/thread.txt

但是jstack里线程ID是16进制的,先转换一下:

printf"%x\n"12367# 304f

然后搜:

grep-A30"nid=0x304f"/tmp/thread.txt

输出:

"worker-1" #23 nid=0x304f runnable at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658) at java.util.regex.Pattern$Loop.match(Pattern.java:4785) at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717) ...(省略一大堆regex相关的栈) at com.example.service.ContentFilter.filter(ContentFilter.java:89)

破案了,正则在疯狂回溯。

四、常见原因与解决

CPU问题基本就那几种:

1)正则回溯

类似这种正则特别危险:

Stringregex="(a+)+b";// 遇到 "aaaaaaaaaaaaaaac" 直接卡死

2)死循环

最傻的bug:

while(list.size()>0){process(list.get(0));// 忘了remove...}

3)频繁Full GC

表现是好几个GC线程都在吃CPU。用这个看:

jstat -gcutil123451000

FGC列如果一直在涨,就是内存泄漏了。

4)锁竞争

top里sy(系统态)高,jstack一看全是BLOCKED状态。

五、一键排查脚本

一个脚本,出问题直接跑,一键收集信息:

#!/bin/bash# cpu_debug.shPID=$1[-z"$PID"]&&echo"用法:$0<pid>"&&exit1DIR="/tmp/cpu_$(date+%H%M%S)"mkdir-p$DIRecho"收集进程$PID信息..."# 线程CPUps-T -p$PID-o tid,%cpu,time --sort=-%cpu|head-20>$DIR/threads.txt# jstackjstack$PID>$DIR/jstack.txt2>/dev/null# 找最忙的线程TOP_TID=$(head-2 $DIR/threads.txt|tail-1|awk'{print $1}')TOP_TID_HEX=$(printf"%x"$TOP_TID)echo"最忙线程:$TOP_TID(0x$TOP_TID_HEX)"grep-A30"nid=0x$TOP_TID_HEX"$DIR/jstack.txtecho"详细信息:$DIR"

用法:./cpu_debug.sh 12345

直接告诉你哪个线程最忙,在执行什么代码。

六、Go程序的排查

Go比较方便,如果开了pprof:

go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30

进去之后top 10看热点函数,list 函数名看具体代码。

不想用命令行的话,加个-http=:8080参数,浏览器看火焰图,更直观。

七、预防措施

建议加个告警:

-alert:HighCPUexpr:100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)>80for:3m

CPU超过80%持续3分钟就告警。

另外代码里长时间运行的任务最好加个超时,别让一个bug把整个服务拖垮。


总结

CPU排查流程:

1. top/ps 确认哪个进程 ↓ 2. top -H 确认哪个线程 ↓ 3. jstack/pprof/perf 确认哪行代码 ↓ 4. 分析原因(死循环/GC/锁/正则...) ↓ 5. 修复并验证

大多数情况下,问题出在:

  • 业务代码Bug(死循环、正则回溯)
  • 内存问题引发频繁GC
  • 锁竞争严重

掌握这套流程,线上CPU问题基本都能快速定位。


有问题评论区交流。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 13:32:06

项目应用中NX12.0异常处理异常的典型故障模式总结

NX12.0中C++异常为何总在关键时刻“消失”?一位十年NX插件老兵的实战排障手记 去年冬天,我在某主机厂现场调试一个自动焊缝识别插件——它在测试机上稳如磐石,一上产线服务器就隔三差五让NX整个卡死。用户点一下按钮,UGRAF64.EXE进程直接静默退出,连Windows错误报告都不弹…

作者头像 李华
网站建设 2026/5/4 14:19:26

Keil5破解环境配置新手教程

Keil MDK-5&#xff1a;从许可证机制到编译器迁移的深度实践手记 去年冬天调试一个基于STM32H750的电机控制项目时&#xff0c;我连续三天卡在同一个问题上&#xff1a;代码烧录后系统不启动&#xff0c;调试器连接失败&#xff0c; uv4.exe 弹出“License Unavailable”却没…

作者头像 李华
网站建设 2026/5/1 6:23:22

新手教程:AUTOSAR网络管理初学者快速理解指南

AUTOSAR网络管理:一个嵌入式工程师的实战认知手记 你有没有遇到过这样的现场问题? 整车停在地下车库三天后,蓄电池没电了;诊断仪连上BCM,发现它“明明该睡着”,却在后台偷偷发NM报文;或者,碰撞信号触发后,安全气囊ECU响应慢了80ms——查来查去,不是软件逻辑错,也不…

作者头像 李华
网站建设 2026/5/3 6:44:10

mPLUG-VQA一文详解:全本地化、高稳定性、低延迟的VQA服务构建

mPLUG-VQA一文详解&#xff1a;全本地化、高稳定性、低延迟的VQA服务构建 1. 为什么需要一个真正“能用”的本地VQA工具&#xff1f; 你有没有试过在本地跑一个视觉问答模型&#xff0c;结果刚上传一张PNG图就报错&#xff1f;或者等了半分钟&#xff0c;页面还卡在“加载中”…

作者头像 李华
网站建设 2026/5/1 6:42:02

通俗解释UART串口通信中的起始位与停止位作用

UART串口通信中起始位与停止位:不是“填参数”,而是时序锚点与容错缓冲的精密设计 你有没有遇到过这样的情况? UART配置界面里,波特率、数据位、校验位都对得上,线也接好了,示波器上看TX波形规整漂亮,可接收端就是偶尔丢一帧、乱码、甚至直接锁死——重启后又好了。查了…

作者头像 李华
网站建设 2026/5/1 7:14:16

新手必看:STM32使用STLink驱动下载手把手教程

STM32调试链路的“第一公里”&#xff1a;从ST-Link驱动失效到稳定烧录的实战穿透指南 你是否经历过这样的时刻&#xff1f; 刚焊好一块STM32F407最小系统板&#xff0c;接上ST-Link&#xff0c;打开STM32CubeIDE点击Debug——进度条卡在“Connecting to target…”三秒后弹出…

作者头像 李华