[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]优化后结果
后续考虑修改为异步日志后验证下提升的效果。