0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

进程还在,JSF接口不干活了,这你敢信?

京东云 来源:jf_75140285 作者:jf_75140285 2024-06-14 10:21 次阅读

1、问题背景:

应用在配合R2m升级redis版本的过程中,上游反馈调用接口报错,RpcException:[Biz thread pool of provider has been exhausted],通过监控系统和日志系统定位到现象只出现在一两个节点,并持续出现。第一时间通过JSF将有问题的节点下线,保留现场,业务恢复。

报错日志如下:

24-03-13 02:21:20.188 [JSF-SEV-WORKER-57-T-5] ERROR BaseServerHandler - handlerRequest error msg:[JSF-23003]Biz thread pool of provider has been exhausted, the server port is 22003
24-03-13 02:21:20.658 [JSF-SEV-WORKER-57-T-5] WARN BusinessPool - [JSF-23002]Task:com.alibaba.ttl.TtlRunnable - com.jd.jsf.gd.server.JSFTask@0 has been reject for ThreadPool exhausted! pool:80, active:80, queue:300, taskcnt: 1067777

2、排查步骤:

从现象开始推测原因,系统启动时,会给JSF线程池分配固定的大小,当线程都在工作的时,外部流量又打进来,那么会没有线程去处理请求,此时会有上述的异常。那么JSF线程在干什么呢?

1)借助SGM打印栈信息

wKgaomZrqSSAKZAGAAHSieRip_4994.png

2)分析栈信息

可以用在线分析工具:http://spotify.github.io/threaddump-analyzer/

2.1)分析线程状态

通过工具可以定位到JSF线程大部分卡在JedisClusterInfoCache#getSlaveOfSlotFromDc方法,如图:

wKgZomZrqSWALHCVAAEESOC_sjs486.png

wKgaomZrqSaAPz-bAAdPA86iNic216.png

wKgZomZrqSeAcgAmAADj2W_1lmc681.png

wKgaomZrqSmAK3BxAAdpiHHPDn0573.png

2.2)分析线程夯住的方法

getSlaveOfSlotFromDc在方法入口就需要获取读锁,同时在全局变量声明了读锁和写锁:

wKgZomZrqSyAZXtfAACTLjOmsrk609.png

wKgaomZrqS2AWE1MAAN3gpgONpE291.png

此时对问题有一个大体的了解,大概推测:getSlaveOfSlotFromDc是获取redis连接池,该方法入口处需要获取读锁,由于读锁之间不会互斥,所以猜测有业务获取到写锁后没有释放。同时读锁没有设置超时时间,所以导致杰夫线程处理业务时卡在获取读锁处,无法释放。

2.3)从业务的角度分析持有写锁的逻辑

向中间件研发寻求帮助,经过排查,定位到有个更新拓扑的定时任务,执行时会先获取写锁,根据该消息,定位到任务的栈信息:

wKgZomZrqS-AKQArAAUkCHm-7Lw807.png

代码截图:

wKgaomZrqTCAeOc8AASlhVlA9Go131.png

图1

wKgZomZrqTKAWpEtAAHYws4Gm0Y606.png

图2

wKgaomZrqTOAO4vlAAMd4WsLnGI533.png

图3

从日志验证:日志只打印更新拓扑的日志,没有打印更新成功的日志,且02:20分以后r2m-topo-updater就不在打印日志

wKgZomZrqTWAJ_DmAAzzFfnshIU292.png

2.4)深入挖掘原因

虽然现象已经可以推测出来,但是对问题的原因还是百思不得其解,难道parallelStream().forEach存在bug?难道有远程请求,没有设置超时时间?...

经过查找资料确认,如果没有指定,那么parallelStream().forEach会使用ForkJoinPool.commonPool这个默认的线程池去处理任务,该线程池默认设置(容器核心数-1)个活跃线程。同时caffeine数据过期后会异步刷新数据,如果没有指定线程池,它默认也会使用ForkJoinPool.commonPool()来执行异步线程。那么就有概率出现获取到写锁的线程无法获取执行权,获取执行权的线程无法获取到读锁。

wKgZomZrqTiAbjnNAAI7yJHAu4U895.png

2.5)验证

3个ForkJoinPool.commonPool-worker的确都夯在获取redis连接处,线程池的活跃线程都在等待读锁。

wKgZomZrqTuAINdHAApQ5YRTktA012.png

本地caffeine缓存没有设置自定义线程池

wKgaomZrqTyAVq2bAAN5V4cKenY771.png

topo-updater夯在foreach业务处理逻辑中

wKgZomZrqT6AAcTPAAYESW5jEwc558.png

3.复盘

1)此问题在特定的使用场景下才会小概率出现,非常感谢中间件团队一起协助定位问题,后续也将异步更新拓扑改为同步处理。

2)Java提供了很多异步处理的能力,但是异常处理也代表需要开启线程或者使用共用的线程池,也需要注意。

3)做好监控,能第一时间发现问题并处理问题。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8582

    浏览量

    151072
  • JSF
    JSF
    +关注

    关注

    0

    文章

    11

    浏览量

    7747
收藏 人收藏

    评论

    相关推荐

    自己收集的最新AD版本的软件与学习教程,感觉很实用,我学了几天就上手干活了

    本帖最后由 jf_44510017 于 2024-6-20 17:26 编辑 自己收集的最新AD版本的软件与学习教程,感觉很实用,我学了几天就上手干活了。特分享给大家。 链接:https
    发表于 06-08 14:57

    jsf标签文档

    jsf标签文档导航规则定义了如何在应用程序中从特定页面导航至另一个页面静态导航是单一的结果映射。在静态导航中,单击指定按钮总是选择固定的页面来呈现响应navigation-rule元素最重要的两个
    发表于 12-08 11:23

    DesignSpark激活了

    活了!很好用
    发表于 09-10 14:21

    进程贴】qq416296378的示波器DIY进程

    ``呃进程贴因为元件还在路上 反正早晚都要开帖现在 先开开 元件到了就开始更新现在先灌水几天,等待ing估计 希望我可以一次成功 , 不要有失误嘿嘿``
    发表于 05-23 22:36

    进程帖】xianyoudian的示波器DIY进程帖:见证奇迹的时刻

    `参考【进程帖】zpzdd的示波器DIY进程帖 - STM32/STM8技术论坛 - 中国电子技术论坛 - 最好最受欢迎电子论坛! https://bbs.elecfans.com
    发表于 05-28 11:15

    孤儿进程和僵尸进程

    ,回收掉子进程的资源。2)孤儿进程孤儿进程:父进程结束了,而它的一个或多个子进程还在运行,那么这
    发表于 11-29 14:08

    JSF应用程序的结构

    JSF应用程序的结构:JSF 将表示和应用程序行为明确分开,JSF是一种事件驱动型的组件模型,请求处理生命周期包括6个阶段,JSF页面指向Bean属性,业务逻辑包含在Bean实现代码中
    发表于 12-08 11:06 23次下载

    如何使用JSF导航

    JSF应用程序的用户界面由页面设计人员设计。模型对象是由应用程序开发人员实现的开发一个JSF应用的步骤包括:开发模型对象、开发基于JSF用户界面、编写时间监听器或者导航
    发表于 12-08 11:07 0次下载

    JSF标签库

    JSF标签库:JSF核心标签库,JSF HTML标签库,使用JSF标签标签         &
    发表于 12-08 11:10 39次下载

    jsf标签官方帮助文档

    Tag Library Documentation Generator - Generated DocumentationTag Libraries JSF core tag library.
    发表于 12-08 11:13 36次下载

    jsf标签库文档

    jsf标签库:Tag Library Documentation Generator - Generated DocumentationTag Libraries h  
    发表于 12-08 11:16 29次下载

    基于Hibernate与JSF的企业展台系统设计

    在介绍Hibernate 及JSF 基础上,提出了一种新的Web 系统开发方法。结合企业展台系统设计实例研究如何整合基于MVC 模式的Hibernate 及JSF 技术。关键词:MVC 模式;Hibernate;JSF;企
    发表于 08-22 10:58 14次下载

    浅议基于JSF的Java国际化编程及其实现

    本文从实际操作的角度,讨论了利用JSF 开发Web 应用程序时实现程序的国际化和本地化的方法。提出了解决应用程序国际化的MVC-R 四层框架模型。
    发表于 01-27 13:47 9次下载

    JEB+JSF开发示例(附源代码)

    刚到公司时没有接触过EJB3和JSF,为了熟悉一下做了个EJB+JSF开发示例来入门.一个比较简单的JSF的web工程做页面展现,一个简单的EJB3工程做业务操作,分别部署到Tomcat下和JBoss下,让他们通过
    发表于 04-07 21:56 38次下载

    记一次JSF异步调用引起的接口可用率降低

    前言 本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程,主要介绍了排查思路和JSF异步调用的流程,希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本
    的头像 发表于 08-05 13:40 246次阅读
    记一次<b class='flag-5'>JSF</b>异步调用引起的<b class='flag-5'>接口</b>可用率降低