使用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]优化后结果

 

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    时光清浅03阅读 572评论 0 0
  • Java基础面试 Java基础面试... 1 1. Java基础知识... 5 1.1. Java源程序的扩展名是...
    来着何人阅读 1,292评论 0 1
  • [if !supportLists]1.1.1[endif]安装环境 redis是C语言开发,安装redis需要先...
    三万_chenbing阅读 682评论 0 1
  • 第一讲:类、对象 1、OC简史 1)NextStep公司的由来,cocoa的由来 NeXT是由苹果公司的创办人乔...
    SmallWhiteMouse阅读 1,674评论 0 0
  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,334评论 0 23

友情链接更多精彩内容