开发&测试人员在应用运行&测试过程中会遇到以下常见问题
一般遇到此类资源使用异常类问题,很多人会采取重新部署或重启应用的方式解决,其实并没有解决当前应用的真实痛点,如果后面调用量持续增长,当前操作并不会从根本上解决当前问题。
以下就是通过对物流客服中某个应用出现的异常资源使用率的分析,作为具体的操作实例,按照进程->线程->异常堆栈->代码 的逻辑过程,为各位提供参考。
针对分析过程,参考如下的重要节点的逻辑过程图
开发在测试环境中调试代码时,发现应用basic-platform的CPU资源使用率一直处于700%左右,分析思路如下图所示
步骤一:定位至进程
通过命令:top 查找出资源消耗异常的进程,如图所示,PID:21944
步骤二:打印异常堆栈
通过命令:jstack 21944 >/home/admin/ps.txt 将该异常进程对应的错误堆栈信息输入到文件ps.txt中
步骤三:定位至线程
通过命令:ps -mp 21944 -o THREAD,tid,time 查看当前进程21944 对应的线程数资源使用情况,并找出CPU使用率较高的线程号,如图所示
步骤四:异常堆栈日志搜索定位
选取使用率异常的线程号,并将线程号10进制的转为16进制,比如:31098 转为 797a,ps.txt堆栈文件中搜索16进制线程号797a,以上截图即为当前线程运行过程中,对应的异常堆栈信息
步骤五:通过异常信息定位代码
以上截图异常信息给开发或者自己有能力可以通过异常堆栈信息对应的代码行数来进行问题分析
通过步骤4中的前两行异常,可定位至代码文件中如下图所示处:递归中缺失if语句缺失对应的else导致
jvm运行时会生成一个目录hsperfdata_USER(USER(USER是启动java进程的用户),在linux中默认是/tmp,目录下会有些 pid文件,存放jvm进程信息,而jmap,jstack等工具会读取/tmp/hsperfdata_$USER下的pid文件获取连接信息.---jstack的数据来源
4.2 使用Jstack过程遇到问题
a. 监控的进程在/tmp/hsperfdata_${USER}目录下是否有对应的进程号
如图所示:
hsperfdata_root目录下文件为空
hsperfdata_admin目录下文件为当前进程21215
b. 解决方案:切换admin用户,然后执行jstack命令
c. 解决原因:当前进程号21215对应的Java进程,启动权限为admin用户,所以通过jstack监控的数据仅能在admin用户目录下看到
d. 也说明一个问题:通过Qone平台部署的Java应用,启动权限都为admin用户,在这里要注意手动启动权限与Qone保持一致