雨翔河
首页
列表
关于
循环逻辑导致容器负载过高持续扩容问题排查
2022-08-25 12:43
某应用在测试环境部署上联调出现扩容,且扩容节点数一直在增长,新扩容的节点也全部都是CPU暴涨。 ![](https://cdn.yuxianghe.net/image/blog/87-1.png) 1. 随机登录了其中一个节点查看CPU情况 `top` ![](https://cdn.yuxianghe.net/image/blog/87-2.png) 2.根据直觉判断是java应用新上了某个测试功能导致了cpu占用最高,查看所在java应用的进程的线程情况.(图片来自随机截图,与实际数据不一样,这里可以假设还原当时的场景,前面几个线程id都是3507) `top -Hp 2864839` ![](https://cdn.yuxianghe.net/image/blog/87-3.png) 3.可以看到前几个占用CPU最高的线程情况,占用最高的前三个都是30%+,且都是id为`3507`的线程(图片来自随机截图,与实际数据不一样,这里可以假设还原当时的场景,前面几个线程id都是3507),可以猜测这个线程在执行一个大循环需要一直计算的逻辑。 这个时候快速的将java的线程堆栈信息导出来: `jstack 2864839 > 1.txt` 4.然后将之前看到的CPU占用最高的线程id转换为十六进制,`3507`转换为十六进制是`db3`,那么只需要在线程堆栈信息文件里搜索`0xdb3`,就能大致找到线程目前的执行信息。 如图所示: ![](https://cdn.yuxianghe.net/image/blog/87-4.png) 5.找到测试分支定位到的所在的代码行: ![](https://cdn.yuxianghe.net/image/blog/87-5.png) > 第一个continue, for后面分号部分写到最后了,结果continue一直循环 改好之后发布测试,问题解决。
类型:工作
标签:jstack,java
Copyright © 雨翔河
我与我周旋久
独孤影
开源实验室