0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

進程還在,JSF接口不干活了,這你敢信?

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-06-14 10:21 ? 次閱讀

1、問題背景:

應用在配合R2m升級redis版本的過程中,上游反饋調用接口報錯,RpcException:[Biz thread pool of provider has been exhausted],通過監(jiān)控系統(tǒng)和日志系統(tǒng)定位到現象只出現在一兩個節(jié)點,并持續(xù)出現。第一時間通過JSF將有問題的節(jié)點下線,保留現場,業(yè)務恢復。

報錯日志如下:

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、排查步驟:

從現象開始推測原因,系統(tǒng)啟動時,會給JSF線程池分配固定的大小,當線程都在工作的時,外部流量又打進來,那么會沒有線程去處理請求,此時會有上述的異常。那么JSF線程在干什么呢?

1)借助SGM打印棧信息

wKgaomZrqSSAKZAGAAHSieRip_4994.png

2)分析棧信息

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

2.1)分析線程狀態(tài)

通過工具可以定位到JSF線程大部分卡在JedisClusterInfoCache#getSlaveOfSlotFromDc方法,如圖:

wKgZomZrqSWALHCVAAEESOC_sjs486.png

wKgaomZrqSaAPz-bAAdPA86iNic216.png

wKgZomZrqSeAcgAmAADj2W_1lmc681.png

wKgaomZrqSmAK3BxAAdpiHHPDn0573.png

2.2)分析線程夯住的方法

getSlaveOfSlotFromDc在方法入口就需要獲取讀鎖,同時在全局變量聲明了讀鎖和寫鎖:

wKgZomZrqSyAZXtfAACTLjOmsrk609.png

wKgaomZrqS2AWE1MAAN3gpgONpE291.png

此時對問題有一個大體的了解,大概推測:getSlaveOfSlotFromDc是獲取redis連接池,該方法入口處需要獲取讀鎖,由于讀鎖之間不會互斥,所以猜測有業(yè)務獲取到寫鎖后沒有釋放。同時讀鎖沒有設置超時時間,所以導致杰夫線程處理業(yè)務時卡在獲取讀鎖處,無法釋放。

2.3)從業(yè)務的角度分析持有寫鎖的邏輯

向中間件研發(fā)尋求幫助,經過排查,定位到有個更新拓撲的定時任務,執(zhí)行時會先獲取寫鎖,根據該消息,定位到任務的棧信息:

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()來執(zhí)行異步線程。那么就有概率出現獲取到寫鎖的線程無法獲取執(zhí)行權,獲取執(zhí)行權的線程無法獲取到讀鎖。

wKgZomZrqTiAbjnNAAI7yJHAu4U895.png

2.5)驗證

3個ForkJoinPool.commonPool-worker的確都夯在獲取redis連接處,線程池的活躍線程都在等待讀鎖。

wKgZomZrqTuAINdHAApQ5YRTktA012.png

本地caffeine緩存沒有設置自定義線程池

wKgaomZrqTyAVq2bAAN5V4cKenY771.png

topo-updater夯在foreach業(yè)務處理邏輯中

wKgZomZrqT6AAcTPAAYESW5jEwc558.png

3.復盤

1)此問題在特定的使用場景下才會小概率出現,非常感謝中間件團隊一起協(xié)助定位問題,后續(xù)也將異步更新拓撲改為同步處理。

2)Java提供了很多異步處理的能力,但是異常處理也代表需要開啟線程或者使用共用的線程池,也需要注意。

3)做好監(jiān)控,能第一時間發(fā)現問題并處理問題。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8372

    瀏覽量

    150568
  • JSF
    JSF
    +關注

    關注

    0

    文章

    11

    瀏覽量

    7736
收藏 人收藏

    評論

    相關推薦

    自己收集的最新AD版本的軟件與學習教程,感覺很實用,我學了幾天就上手干活了。

    本帖最后由 jf_44510017 于 2024-6-20 17:26 編輯 自己收集的最新AD版本的軟件與學習教程,感覺很實用,我學了幾天就上手干活了。特分享給大家。 鏈接:https
    發(fā)表于 06-08 14:57

    jsf標簽文檔

    jsf標簽文檔導航規(guī)則定義了如何在應用程序中從特定頁面導航至另一個頁面靜態(tài)導航是單一的結果映射。在靜態(tài)導航中,單擊指定按鈕總是選擇固定的頁面來呈現響應navigation-rule元素最重要的兩個
    發(fā)表于 12-08 11:23

    DesignSpark激活了!

    活了!很好用
    發(fā)表于 09-10 14:21

    進程貼】qq416296378的示波器DIY進程

    ``呃進程貼因為元件還在路上 反正早晚都要開帖現在 先開開 元件到了就開始更新現在先灌水幾天,等待ing估計 希望我可以一次成功 , 不要有失誤嘿嘿``
    發(fā)表于 05-23 22:36

    進程帖】xianyoudian的示波器DIY進程帖:見證奇跡的時刻

    `參考【進程帖】zpzdd的示波器DIY進程帖 - STM32/STM8技術論壇 - 中國電子技術論壇 - 最好最受歡迎電子論壇! https://bbs.elecfans.com
    發(fā)表于 05-28 11:15

    孤兒進程和僵尸進程

    ,回收掉子進程的資源。2)孤兒進程孤兒進程:父進程結束了,而它的一個或多個子進程還在運行,那么這
    發(fā)表于 11-29 14:08

    JSF應用程序的結構

    JSF應用程序的結構:JSF 將表示和應用程序行為明確分開,JSF是一種事件驅動型的組件模型,請求處理生命周期包括6個階段,JSF頁面指向Bean屬性,業(yè)務邏輯包含在Bean實現代碼中
    發(fā)表于 12-08 11:06 ?23次下載

    如何使用JSF導航

    JSF應用程序的用戶界面由頁面設計人員設計。模型對象是由應用程序開發(fā)人員實現的開發(fā)一個JSF應用的步驟包括:開發(fā)模型對象、開發(fā)基于JSF用戶界面、編寫時間監(jiān)聽器或者導航
    發(fā)表于 12-08 11:07 ?0次下載

    JSF標簽庫

    JSF標簽庫:JSF核心標簽庫,JSF HTML標簽庫,使用JSF標簽標簽         &
    發(fā)表于 12-08 11:10 ?39次下載

    jsf標簽官方幫助文檔

    Tag Library Documentation Generator - Generated DocumentationTag Libraries JSF core tag library.
    發(fā)表于 12-08 11:13 ?36次下載

    jsf標簽庫文檔

    jsf標簽庫:Tag Library Documentation Generator - Generated DocumentationTag Libraries h  
    發(fā)表于 12-08 11:16 ?29次下載

    基于Hibernate與JSF的企業(yè)展臺系統(tǒng)設計

    在介紹Hibernate 及JSF 基礎上,提出了一種新的Web 系統(tǒng)開發(fā)方法。結合企業(yè)展臺系統(tǒng)設計實例研究如何整合基于MVC 模式的Hibernate 及JSF 技術。關鍵詞:MVC 模式;Hibernate;JSF;企
    發(fā)表于 08-22 10:58 ?14次下載

    淺議基于JSF的Java國際化編程及其實現

    本文從實際操作的角度,討論了利用JSF 開發(fā)Web 應用程序時實現程序的國際化和本地化的方法。提出了解決應用程序國際化的MVC-R 四層框架模型。
    發(fā)表于 01-27 13:47 ?9次下載

    JEB+JSF開發(fā)示例(附源代碼)

    剛到公司時沒有接觸過EJB3和JSF,為了熟悉一下做了個EJB+JSF開發(fā)示例來入門.一個比較簡單的JSF的web工程做頁面展現,一個簡單的EJB3工程做業(yè)務操作,分別部署到Tomcat下和JBoss下,讓他們通過
    發(fā)表于 04-07 21:56 ?38次下載

    記一次JSF異步調用引起的接口可用率降低

    前言 本文記錄了由于JSF異步調用超時引起的接口可用率降低問題的排查過程,主要介紹了排查思路和JSF異步調用的流程,希望可以幫助大家了解JSF的異步調用原理以及提供一些問題排查思路。本
    的頭像 發(fā)表于 08-05 13:40 ?194次閱讀
    記一次<b class='flag-5'>JSF</b>異步調用引起的<b class='flag-5'>接口</b>可用率降低