您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
一次简单的JAVA进程到线程资源使用率异常分析
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
一次简单的JAVA进程到线程资源使用率异常分析
自猿其说Tech
2021-07-26
IP归属:未知
43240浏览
测试
### 1 前言导读 开发&测试人员在应用运行&测试过程中会遇到以下常见问题 - 在测试&调试过程中,应用会出现卡顿或接口响应失败问题,不知如何入手? - 开发&测试人员在排查响应失败问题时发现CPU&内存异常性飙高,究竟是哪个进程?哪个线程? - 针对进程&线程的异常资源使用,是否有具体的方法定位至代码层面,节约测试&开发时间? 一般遇到此类资源使用异常类问题,很多人会采取重新部署或重启应用的方式解决,其实并没有解决当前应用的真实痛点,如果后面调用量持续增长,当前操作并不会从根本上解决当前问题。 以下就是通过对物流客服中某个应用出现的异常资源使用率的分析,作为具体的操作实例,按照进程->线程->异常堆栈->代码 的逻辑过程,为各位提供参考。 ### 2 整体思路 针对分析过程,参考如下的重要节点的逻辑过程图 ![](//img1.jcloudcs.com/developer.jdcloud.com/316b936a-2a72-4c8a-ad45-15b36208d0df20210726114054.png) ### 3 分析过程 #### 3.1 问题来源 开发在测试环境中调试代码时,发现应用basic-platform的CPU资源使用率一直处于700%左右,分析思路如下图所示 ![](//img1.jcloudcs.com/developer.jdcloud.com/a9ae07b8-1c35-4e42-81b8-be7bcb43c2ba20210726114127.png) #### 3.2 实例分析 ##### 步骤一:定位至进程 ![](//img1.jcloudcs.com/developer.jdcloud.com/4b016a73-cffe-43bd-9a72-e70409cd967920210726114148.png) 通过命令:top 查找出资源消耗异常的进程,如图所示,PID:21944 ##### 步骤二:打印异常堆栈 ![](//img1.jcloudcs.com/developer.jdcloud.com/9fe00579-bb25-4317-9140-e243c38679bf20210726114205.png) 通过命令:jstack 21944 >/home/admin/ps.txt 将该异常进程对应的错误堆栈信息输入到文件ps.txt中 ##### 步骤三:定位至线程 ![](//img1.jcloudcs.com/developer.jdcloud.com/5b1d6935-6743-414a-a402-b78dffe0100f20210726114247.png) 通过命令:ps -mp 21944 -o THREAD,tid,time 查看当前进程21944 对应的线程数资源使用情况,并找出CPU使用率较高的线程号,如图所示 ##### 步骤四:异常堆栈日志搜索定位 ![](//img1.jcloudcs.com/developer.jdcloud.com/44a7e904-4307-4703-8d42-3c6d1e4f649c20210726114309.png) 选取使用率异常的线程号,并将线程号10进制的转为16进制,比如:31098 转为 797a,ps.txt堆栈文件中搜索16进制线程号797a,以上截图即为当前线程运行过程中,对应的异常堆栈信息 ##### 步骤五:通过异常信息定位代码 ![](//img1.jcloudcs.com/developer.jdcloud.com/297f42f1-4c53-4575-acf0-c80827abe54620210726114330.png) 以上截图异常信息给开发或者自己有能力可以通过异常堆栈信息对应的代码行数来进行问题分析 通过步骤4中的前两行异常,可定位至代码文件中如下图所示处:递归中缺失if语句缺失对应的else导致 ### 4 踩坑实录 #### 4.1 hsperfdata_${USER}文件说明 jvm运行时会生成一个目录hsperfdata_USER(USER(USER是启动java进程的用户),在linux中默认是/tmp,目录下会有些 pid文件,存放jvm进程信息,而jmap,jstack等工具会读取/tmp/hsperfdata_$USER下的pid文件获取连接信息.---jstack的数据来源 ![](//img1.jcloudcs.com/developer.jdcloud.com/b3255b3c-055b-4fda-9b81-25251a5d467c20210726114403.png) #### 4.2 使用Jstack过程遇到问题 - 命令行输入jps命令,出现process information unavailable ![](//img1.jcloudcs.com/developer.jdcloud.com/3b732bbe-f1fe-484a-bf38-198e3457954e20210726114441.png) - 需要考虑原因两个 a. 监控的进程在/tmp/hsperfdata_${USER}目录下是否有对应的进程号 ![](//img1.jcloudcs.com/developer.jdcloud.com/d5df527e-0a42-4b60-bc5f-dc46c2827cf620210726114501.png) 如图所示: hsperfdata_root目录下文件为空 hsperfdata_admin目录下文件为当前进程21215 b. 解决方案:切换admin用户,然后执行jstack命令 c. 解决原因:当前进程号21215对应的Java进程,启动权限为admin用户,所以通过jstack监控的数据仅能在admin用户目录下看到 d. 也说明一个问题:通过Qone平台部署的Java应用,启动权限都为admin用户,在这里要注意手动启动权限与Qone保持一致 ![](//img1.jcloudcs.com/developer.jdcloud.com/66282968-5c39-4e86-b233-964735e1e8dc20210726114521.png) ### 5 其他周边知识 ![](//img1.jcloudcs.com/developer.jdcloud.com/011a3192-83ca-4a82-996a-25829cbcde4120210726114543.png) 借着本次问题定位的机会,对java中内存的模型进行了再次的查缺补漏。 ------------ ###### 自猿其说Tech-JDL京东物流技术发展部 ###### 稿件来源:西安CS测试小分队 傅世嘉
原创文章,需联系作者,授权转载
上一篇:从代码圈复杂度控制到TDD,我们怎么把一个功能拆分到极致
下一篇:即时配送的现在与未来
相关文章
安全测试之探索windows游戏扫雷
Jmeter压测实战:Jmeter二次开发之JSF采样器实现
Laputa自动化测试框架介绍
自猿其说Tech
文章数
426
阅读量
2149963
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149963
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号