记一次 生产cpu飙高问题排查
背景
2022-12-01日,早上8:56运维的同事发给我一张监控异常的图片,图片信息显示我负责的系统有一台服务器使用率超过了100%,并且持续时间已经超过10小时。
排查过程
排查过程也和大部网上的帖子差不多
1、通过top命令查看使用cpu最多的线程,输入top命令后,同时按Alt+P两个按键,让进程排序。发现java进程 占用cpu最多,进程的PID 是130999
2、通过 top -H -p 130999 查看130999进程里面哪几个线程占用cpu最多,最后发现四个线程的占用率达到 90%以上。
四个线程的PID分别是 66085 364 368 109965
3、采用 jstack 命令记录当前进程的执行栈,jstack 130999 >> javaStack.txt
4、采用printf 命令或者在线工具,把四个线程的线程id转换成16进制,
printf "%x\n" 66085 结果是 10225
printf "%x\n" 364 结果是 16c
printf "%x\n" 364 结果是 170
printf "%x\n" 109965 结果是 1ad8d
5、用这个四个十六进制数据去刚才保存的进程栈文件(javaStack.txt)中查询 ,最后查到响应的四个线程调用栈
分析过程
线程的调用栈可以得到如下信息:
1、线程的名称是 : http-nio-0.0.0.0-8080-exec-6
2、业务代码的位置
at xxx.xxx.xxx.xxx.xxx.xxx.xxx(xxx.java:146)
at xxx.xxx.xxx.xxx.xxx.xxx.xxx(xxx.java:486)
at xxx.xxx.xxx.xxx.xxx.xxx$$FastClassBySpringCGLIB$$d786e840.invoke(<generated>)
因为涉及公司代码,所以业务代码都采取xxx代替。
通过业务代码,我们可以知道是是哪一个接口造成了cpu使用率过高,再使用线程的名称与接口的请求路径到生产的日志中去查询,确定具体哪个请求造成cpu使用过高。
通过上述的步骤可以定位到具体时间以及哪一次请求,拿到请求的参数。再对项目中的源代码进行分析。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!