使用jstack定位CPU消耗问题

 


[if !supportLists]1、 [endif]问题现象描述

个人银行用户开户调用短信验证接口,当大于20用户并发时usercenter服务的CPU使用率超过100%。


[if !supportLists]2、 [endif]问题定位过程

2.1、查看usercenter服务资源使用情况

使用率超过100%

2.2、进入usercenter服务控制台,jps查看当前运行服务进程PID

2.3、使用top -p 1 -H查看进入对应的线程占用CPU情况

2.4、先通过jdk自带的工具jstack保存一下JVM进程对应的栈信息,具体的命令是:

jstack 47453> 1-stack,记录对应线程的PID,多记录几次线程堆栈的快照,方面后续在快照中找对应的线程调用内容。

2.5、然后通过top命令找到占用CPU较多时间的线程,具体的命令如下:


Top -p 46421 -H,


2.6、找到目标线程的PID为b7ca,然后将PID转换为16进制,可以使用printf命令,具体命令如下:printf "%x\n"47050


然后转化结果如下:

2.7、然后在之前保存的JVM进程的栈信息的文件中找到nid=b7ca的线程的栈信息,结果如下:

通过线程的栈信息,我们可以找到该线程在执行的代码,然后通过排查这段代码找出问题所在。


[if !supportLists]3、 [endif]问题解决方案

3.1、CPU占用问题通过分析代码的方法,com.zatech.bank.framework.log.pattern.ZaFileOfCallerConverter.convert

为日志组件占用,logback组件比较消耗CPU,此问题由于开发需要更详细的日志来定位生产问题。生产环境暂时不能进行处理优化。


[if !supportLists]4、 [endif]优化后结果

 

后续考虑修改为异步日志后验证下提升的效果。

你可能感兴趣的:(使用jstack定位CPU消耗问题)