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

news/2024/10/7 12:19:44

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打印栈信息

 

2)分析栈信息

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

2.1)分析线程状态

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

 


 

 


 

 


 

 


 

2.2)分析线程夯住的方法

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

 


 

 


 

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

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

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

 


 

代码截图:

 


 

图1

 


 

图2

 


 

图3

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

 


 

2.4)深入挖掘原因

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

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

 


 

2.5)验证

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

 


 

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

 


 

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

 


 

3.复盘

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/43476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

第四届计算机技术与信息科学国际研讨会(ISCTIS 2024)

【连续3年稳定EI,IEEE独立出版丨高校主办】第四届计算机技术与信息科学国际研讨会(ISCTIS 2024)将于2024年7月12-14日在中国西安举行。【连续3年稳定EI,IEEE独立出版丨十余所高校联合支持】第四届计算机技术与信息科学国际研讨会(ISCTIS 2024) 2024 4th International Symp…

第七届计算机信息科学与应用技术国际学术会议(CISAT 2024)

第七届计算机信息科学与应用技术国际学术会议(CISAT 2024)定于2024年7月12-14日在中国杭州召开,会议由浙江工业大学主办、浙江工业大学计算机科学与技术学院承办。【IEEE独立出版 | 快速稳定EI检索】第七届计算机信息科学与应用技术国际学术会议(CISAT 2024) 2024 7th Int…

如何实现网络隔离后,军工单位内网数据导出的安全性?

在现代信息化战争中,军工单位在信息安全方面的需求尤为突出。通常会采用物理隔离,将网络隔离成内网和外网,防止外部网络的恶意入侵和数据窃取。隔离后的数据仍存在内外网交换的需求,即涉及到内网数据导出,因此每日会面临网络带宽限制、数据安全风险、合规性要求和传输稳定…

2024年高考报名条件

2024年高考报名条件 更新:2024-3-20 19:38:10 发布:大学生必备网 纠错https://www.dxsbb.com/news/17828.html 教育部公布的2024年高考报名条件如下,供大家参考。 1.符合下列条件的人员,可以申请报名: (1)遵守中华人民共和国宪法和法律; (2)高级中等教育学校…

【日记】电脑这种机器总是有十分诡异的情况发生(946 字)

正文崔忽然又说他不来了,草。他说他突然来了个单子,要马上滚回去拟合同签单子。妈耶。我只能说还好我没急着订餐馆、宾馆和车票。看来今晚又能去跳舞了。昨晚梦到了紫。梦见她在学校附近的一个地方卖着什么东西。住处似乎在一个很高的出租屋里。梦里的她很漂亮。我没把这件事…

linux环境 kafka3.4.0 刚搭建好(用kraft替代zookeeper) 怎么建个topic测试一下消费有没有成功

在使用 Kafka 3.4.0 并且用 Kraft (Kafka Raft) 替代 Zookeeper 的情况下,步骤会有一些变化。这是因为 Kraft 模式下 Kafka 自身管理元数据,而不再依赖 Zookeeper。 以下是使用 Kraft 模式的 Kafka 3.4.0 创建 topic 并进行生产和消费测试的具体步骤: ### 1. **启动 Kafka 集…

如何确保数据跨域交换安全、合规、可追溯性?

数据跨域交换是指在不同的组织、系统或网络之间进行数据的传输和共享。随着数字经济的发展,数据跨域交换在促进数据流通和创新融合方面发挥着重要作用。然而,这一过程也面临着诸多挑战和风险,例如数据安全、合规性、完整性以及责任不清晰等问题。在进行不同地域文件传输时,…