记一次 生产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使用过高。

通过上述的步骤可以定位到具体时间以及哪一次请求,拿到请求的参数。再对项目中的源代码进行分析。

 

posted @   阿瞒123  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示