微服务占用了很多句柄,留存10多万FIFO,pipe,可能存在风险

在这里插入图片描述
1:这是甲方的测试 发来的bug,说是第一项句柄异常
2:图中用的指令 我没用过 而且在我的开发环境上 这个指令没法用 估计 要下什么插件 我就自己在服务器上下了 lsof插件进行查看句柄 这里我就不复制了 自己去搜.
3:我自己根据pid也就是上图的21018 查询到具体哪个模块 出现的句柄增多.
4:锁定异常模块为项目中的一个微服务
5:优先排查线程 两种方式 一用jstack -l 21018 >> /usr/local/Client/log20180116.log 保存路径和文件名字 自己写
6:在这里插入图片描述
这是我的线程,我发现 huami线程 以 名为0 1 2 3 的形式进行循环 每组循环等待的资源不一样 但循环组内的 循环 等待的资源是一样的 等待资源位置详见下图在这里插入图片描述
拿到这个线程详细时 就够了 多的 我也看不懂 知道是线程池问题,无非就是异常导致 线程池无法正常关闭 造成阻塞 我选择自己写一个controller 里面调用 线程池方法 写好后启动项目 这时我选择另一样工具 jmc
在这里插入图片描述
jmc能实时监测项目的线程状态 多的 我也不知道 上图在这里插入图片描述
选择 要监测的项目 点bean 建议启动两个微服务一个正常的项目 一个不正常的项目点最下面的线程
在这里插入图片描述
什么死锁 监测 都有 ,但又很多东西我也不知道 对不对 ,所以就和一个正常的微服务 进行对比, 找到异常线程池, 我的异常就是huami线程池在这上面有4条记录 每条记录阻塞 有60条线程左右 然后我打开代码看线程池设置 最大线程为30,然后打开用命令导出的线程txt在这里插入图片描述
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 说明在LinkedBlockingQueue取一个东西的时候 造成阻塞, 重点关注一下他,我由于调用了huamiapi 调用线程池api ,经过debug 发现 到了这句Optional any = allAsList.get().stream()
.filter(result -> result.getStatus().equals(ERROR)).findAny();抛空指针401异常 ,所以就没能执行到 shutdownnow(关闭线程池方法 ) 这句代码 我问同事 说是 收集线程状态 并返回结果集进行输出的 是在回调函数那儿做了抛异常处理,经查询401是huami授权过期异常,在原先的catch上并没有捕获该异常,所以我直接用excption进行捕获,再次启动微服务 调用方法,看huami线程 是正常状态.一般线程问题,都优先检查关闭线程语句是否执行到,其次看有没有自旋锁或者cas

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值