精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

又一起線上事故,線程池千萬別亂用!

開發 后端
今天遇到了一個比較典型的線上問題,剛好和線程池有關,另外涉及到死鎖、jstack命令的使用、JDK不同線程池的適合場景等知識點,同時整個調查思路可以借鑒,特此記錄和分享一下。

在高并發、異步化等場景,線程池的運用可以說無處不在。線程池從本質上來講,即通過空間換取時間,因為線程的創建和銷毀都是要消耗資源和時間的,對于大量使用線程的場景,使用池化管理可以延遲線程的銷毀,大大提高單個線程的復用能力,進一步提升整體性能。

今天遇到了一個比較典型的線上問題,剛好和線程池有關,另外涉及到死鎖、jstack命令的使用、JDK不同線程池的適合場景等知識點,同時整個調查思路可以借鑒,特此記錄和分享一下。

01 業務背景描述

該線上問題發生在廣告系統的核心扣費服務,首先簡單交代下大致的業務流程,方便理解問題。

綠框部分即扣費服務在廣告召回扣費流程中所處的位置,簡單理解:當用戶點擊一個廣告后,會從C端發起一次實時扣費請求(CPC,按點擊扣費模式),扣費服務則承接了該動作的核心業務邏輯:包括執行反作弊策略、創建扣費記錄、click日志埋點等。

02 問題現象和業務影響

12月2號晚上11點左右,我們收到了一個線上告警通知:扣費服務的線程池任務隊列大小遠遠超出了設定閾值,而且隊列大小隨著時間推移還在持續變大。詳細告警內容如下:

相應的,我們的廣告指標:點擊數、收入等也出現了非常明顯的下滑,幾乎同時發出了業務告警通知。其中,點擊數指標對應的曲線表現如下:

該線上故障發生在流量高峰期,持續了將近30分鐘后才恢復正常。

03 問題調查和事故解決過程

下面詳細說下整個事故的調查和分析過程。

第1步:收到線程池任務隊列的告警后,我們第一時間查看了扣費服務各個維度的實時數據:包括服務調用量、超時量、錯誤日志、JVM監控,均未發現異常。

第2步:然后進一步排查了扣費服務依賴的存儲資源(mysql、redis、mq),外部服務,發現了事故期間存在大量的數據庫慢查詢。

上述慢查詢來自于事故期間一個剛上線的大數據抽取任務,從扣費服務的mysql數據庫中大批量并發抽取數據到hive表。因為扣費流程也涉及到寫mysql,猜測這個時候mysql的所有讀寫性能都受到了影響,果然進一步發現insert操作的耗時也遠遠大于正常時期。

第3步:我們猜測數據庫慢查詢影響了扣費流程的性能,從而造成了任務隊列的積壓,所以決定立馬暫定大數據抽取任務。但是很奇怪:停止抽取任務后,數據庫的insert性能恢復到正常水平了,但是阻塞隊列大小仍然還在持續增大,告警并未消失。

第4步:考慮廣告收入還在持續大幅度下跌,進一步分析代碼需要比較長的時間,所以決定立即重啟服務看看有沒有效果。為了保留事故現場,我們保留了一臺服務器未做重啟,只是把這臺機器從服務管理平臺摘掉了,這樣它不會接收到新的扣費請求。

果然重啟服務的殺手锏很管用,各項業務指標都恢復正常了,告警也沒有再出現。至此,整個線上故障得到解決,持續了大概30分鐘。

04 問題根本原因的分析過程

下面再詳細說下事故根本原因的分析過程。

第1步:第二天上班后,我們猜測那臺保留了事故現場的服務器,隊列中積壓的任務應該都被線程池處理掉了,所以嘗試把這臺服務器再次掛載上去驗證下我們的猜測,結果和預期完全相反,積壓的任務仍然都在,而且隨著新請求進來,系統告警立刻再次出現了,所以又馬上把這臺服務器摘了下來。

第2步:線程池積壓的幾千個任務,經過1個晚上都沒被線程池處理掉,我們猜測應該存在死鎖情況。所以打算通過jstack命令dump線程快照做下詳細分析。 

  1. #找到扣費服務的進程號    
  2. $ jstack pid > /tmp/stack.txt    
  3. # 通過進程號dump線程快照,輸出到文件中   
  4. $ jstack pid > /tmp/stack.txt   

在jstack的日志文件中,立馬發現了:用于扣費的業務線程池的所有線程都處于waiting狀態,線程全部卡在了截圖中紅框部分對應的代碼行上,這行代碼調用了countDownLatch的await()方法,即等待計數器變為0后釋放共享鎖。

第3步:找到上述異常后,距離找到根本原因就很接近了,我們回到代碼中繼續調查,首先看了下業務代碼中使用了newFixedThreadPool線程池,核心線程數設置為25。針對newFixedThreadPool,JDK文檔的說明如下:

創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。如果在所有線程處于活躍狀態時提交新任務,則在有可用線程之前,新任務將在隊列中等待。

關于newFixedThreadPool,核心包括兩點:

    1、最大線程數 = 核心線程數,當所有核心線程都在處理任務時,新進來的任務會提交到任務隊列中等待;

    2、使用了無界隊列:提交給線程池的任務隊列是不限制大小的,如果任務被阻塞或者處理變慢,那么顯然隊列會越來越大。

所以,進一步結論是:核心線程全部死鎖,新進的任務不對涌入無界隊列,導致任務隊列不斷增加。

第4步:到底是什么原因導致的死鎖,我們再次回到jstack日志文件中提示的那行代碼做進一步分析。下面是我簡化過后的示例代碼: 

  1. /**    
  2.  * 執行扣費任務    
  3.  */    
  4. public Result<Integer> executeDeduct(ChargeInputDTO chargeInput) {    
  5.   ChargeTask chargeTask = new ChargeTask(chargeInput);    
  6.   bizThreadPool.execute(() -> chargeTaskBll.execute(chargeTask ));   
  7.   return Result.success();    
  8. }    
  9. /*    
  10.  * 扣費任務的具體業務邏輯    
  11.  */    
  12. public class ChargeTaskBll implements Runnable {   
  13.   public void execute(ChargeTask chargeTask) {    
  14.      // 第一步:參數校驗    
  15.      verifyInputParam(chargeTask);    
  16.      // 第二步:執行反作弊子任務    
  17.      executeUserSpam(SpamHelper.userConfigs);  
  18.      // 第三步:執行扣費    
  19.      handlePay(chargeTask);    
  20.      // 其他步驟:點擊埋點等    
  21.      ...    
  22.   }    
  23. }    
  24. /**    
  25.  * 執行反作弊子任務    
  26.  */    
  27. public void executeUserSpam(List<SpamUserConfigDO> configs) {    
  28.   if (CollectionUtils.isEmpty(configs)) {    
  29.     return;    
  30.   }    
  31.   try {    
  32.     CountDownLatch latch = new CountDownLatch(configs.size());    
  33.     for (SpamUserConfigDO config : configs) {    
  34.       UserSpamTask task = new UserSpamTask(config,latch);    
  35.       bizThreadPool.execute(task);    
  36.     }    
  37.     latch.await();    
  38.   } catch (Exception ex) {    
  39.     logger.error("", ex);    
  40.   }    
  41. }   

通過上述代碼,大家能否發現死鎖是怎么發生的呢?

根本原因在于:一次扣費行為屬于父任務,同時它又包含了多次子任務:子任務用于并行執行反作弊策略,而父任務和子任務使用的是同一個業務線程池。

當線程池中全部都是執行中的父任務時,并且所有父任務都存在子任務未執行完,這樣就會發生死鎖。下面通過1張圖再來直觀地看下死鎖的情況:

假設核心線程數是2,目前正在執行扣費父任務1和2。另外,反作弊子任務1和3都執行完了,反作弊子任務2和4都積壓在任務隊列中等待被調度。因為反作弊子任務2和4沒執行完,所以扣費父任務1和2都不可能執行完成,這樣就發生了死鎖,核心線程永遠不可能釋放,從而造成任務隊列不斷增大,直到程序OOM crash。

死鎖原因清楚后,還有個疑問:上述代碼在線上運行很長時間了,為什么現在才暴露出問題呢?另外跟數據庫慢查詢到底有沒有直接關聯呢?

暫時我們還沒有復現證實,但是可以推斷出:上述代碼一定存在死鎖的概率,尤其在高并發或者任務處理變慢的情況下,概率會大大增加。數據庫慢查詢應該就是導致此次事故出現的導火索。

05 解決方案

弄清楚根本原因后,最簡單的解決方案就是:增加一個新的業務線程池,用來隔離父子任務,現有的線程池只用來處理扣費任務,新的線程池用來處理反作弊任務。這樣就可以徹底避免死鎖的情況了。

06 問題總結

回顧事故的解決過程以及扣費的技術方案,存在以下幾點待繼續優化:

1、使用固定線程數的線程池存在OOM風險,在阿里巴巴Java開發手冊中也明確指出,而且用的詞是『不允許』使用Executors創建線程池。而是通過ThreadPoolExecutor去創建,這樣讓寫的同學能更加明確線程池的運行規則和核心參數設置,規避資源耗盡的風險。

2、廣告的扣費場景是一個異步過程,通過線程池或者MQ來實現異步化處理都是可選的方案。另外,極個別的點擊請求丟失不扣費從業務上是允許的,但是大批量的請求丟棄不處理且沒有補償方案是不允許的。后續采用有界隊列后,拒絕策略可以考慮發送MQ做重試處理。 

 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2017-07-12 20:25:35

災備

2024-11-07 10:04:48

2019-06-26 08:30:32

計算機互聯網iOS

2012-02-21 09:22:45

2020-11-16 12:35:25

線程池Java代碼

2023-07-11 08:34:25

參數流程類型

2010-09-09 16:16:28

數據中心事故

2011-02-22 09:24:30

諾基亞微軟

2009-07-03 16:21:58

IT系統數據中心運維管理

2025-02-28 08:46:24

框架微服務架構

2024-12-10 00:00:25

2021-08-06 09:20:41

IT管理IT領導者CIO

2021-10-27 06:49:34

線程池Core函數

2024-06-04 07:52:04

2011-07-08 13:34:16

2022-03-08 09:00:00

Kubernetes容器技術

2025-01-09 10:57:54

2020-12-18 15:08:17

微信詐騙移動應用

2018-03-27 10:15:58

微信紅包個人信息

2014-09-10 10:14:14

點贊
收藏

51CTO技術棧公眾號

干日本少妇首页| 国产日韩欧美综合精品| 国产日韩精品中文字无码| 亚洲一区二区三区久久久| 国产精品二区影院| 91成人网在线| 亚洲精品成人自拍| a天堂中文在线观看| 在线视频日韩| 中文字幕亚洲一区在线观看| 特级特黄刘亦菲aaa级| 在线精品亚洲欧美日韩国产| 国产精品久久久一区麻豆最新章节| 亚洲影影院av| 国产又大又黄又粗| 亚洲九九视频| 亚洲免费视频观看| 国产美女视频免费看| 天堂av中文字幕| 日韩中文字幕av电影| 欧美成人免费一级人片100| 亚洲啪av永久无码精品放毛片| 九九九伊在线综合永久| 一区二区三区在线免费视频| 欧美一区二区三区精美影视| 亚洲成人精品女人久久久| 日韩av中文字幕一区二区三区| 欧美精品在线免费| 天天摸日日摸狠狠添| 精品女人视频| 日韩欧美色综合网站| 日本熟妇人妻中出| h片视频在线观看| 国产大陆a不卡| 国产精品久久久久久久久久尿| 国产一级在线免费观看| 欧美国产一区二区三区激情无套| 日韩美女av在线| 亚洲av无码一区东京热久久| 国产精久久久| 欧美日韩情趣电影| 50路60路老熟妇啪啪| av电影院在线看| 亚洲精品美腿丝袜| 一区二区免费在线观看| 国产98在线| 久久只精品国产| 国产有色视频色综合| www香蕉视频| 国产一区二区免费视频| 九九热99久久久国产盗摄| av不卡中文字幕| 精品国产亚洲一区二区三区大结局| 欧美综合亚洲图片综合区| 啊啊啊一区二区| bbw在线视频| 亚洲成人综合网站| 久久人人爽人人爽人人av| 呦呦在线视频| 亚洲自拍另类综合| 日韩精品一区二区在线视频 | 午夜精品一区二区三区在线观看| 国产区一区二区三| 亚洲看片一区| 欧美在线欧美在线| 丰满人妻老熟妇伦人精品| 在线亚洲观看| 青青草原一区二区| 五月天婷婷导航| 日韩不卡手机在线v区| 国产精品日韩电影| 国产农村妇女毛片精品久久| 国产一本一道久久香蕉| 99re资源| 无码人妻精品一区二区三区9厂| 久久狠狠婷婷| 国产精品久久久久久久美男| 一区二区国产欧美| 国产裸体歌舞团一区二区| 波多野结衣久草一区| 人妻91麻豆一区二区三区| 91啪亚洲精品| 亚洲成人精品电影在线观看| 国内外激情在线| 亚洲国产乱码最新视频| 国产日产欧美视频| 激情小说亚洲| 欧美草草影院在线视频| 魔女鞋交玉足榨精调教| 欧美电影一区| 国内成人精品视频| 国产性生活视频| 久久99热这里只有精品| 69av在线视频| 中文字幕在线播| 激情图片小说一区| 国产日韩精品推荐| 在线观看免费网站黄| 一区二区三区在线免费视频| 免费高清在线观看免费| 成人免费在线观看视频| 日韩欧美色综合网站| 丝袜美腿中文字幕| 外国成人免费视频| 亚洲国产精品久久久天堂 | 一区二区三区资源| 国产欧美在线一区| 麻豆国产一区二区三区四区| 亚洲美女喷白浆| 国产黄色的视频| 天堂精品中文字幕在线| 91av一区二区三区| 国产在线资源| 亚洲国产日韩精品| 中文av一区二区三区| 91探花在线观看| 欧洲精品一区二区三区在线观看| 中文字幕在线观看视频www| 亚洲欧美校园春色| 色综合视频网站| 亚洲男人天堂网址| eeuss国产一区二区三区| 亚洲精品中文字幕在线| 中文在线а√在线8| 日韩一区二区中文字幕| www激情五月| 国产精品午夜一区二区三区| 高清亚洲成在人网站天堂| 亚洲一区二区人妻| 国产欧美一区二区三区鸳鸯浴| 成人精品视频在线播放| 亚洲欧洲日韩精品在线| 国产亚洲精品成人av久久ww| 日韩精品一区二区在线播放 | 国产精品一香蕉国产线看观看| 网站黄在线观看| 成人丝袜18视频在线观看| 亚洲成人18| 亚洲精品成人区在线观看| 婷婷视频一区二区三区| 日韩久久精品成人| 日韩av一区二区在线播放| 国产精品亚洲成人| 日本黄色播放器| 国产一区二区三区四区五区3d| 国产亚洲欧美日韩美女| 亚洲av无码精品一区二区| 26uuu精品一区二区三区四区在线| 国产肉体ⅹxxx137大胆| 在线播放一区二区精品视频| 欧美成人一二三| 国产乱人乱偷精品视频a人人澡| 中文字幕中文字幕在线一区| 中文字幕第100页| 98精品久久久久久久| 国产在线精品播放| xvideos国产在线视频| 欧美高清视频一二三区 | 久久精品水蜜桃av综合天堂| av黄色在线网站| 亚洲va久久久噜噜噜久久| 51午夜精品视频| 国产一二三区在线视频| 欧美自拍丝袜亚洲| 国产喷水在线观看| 精品一区二区三区免费播放 | 91精彩刺激对白露脸偷拍| 午夜亚洲视频| 日本一区高清在线视频| 91精品韩国| 中文字幕在线观看日韩| 国产三级午夜理伦三级| 一卡二卡欧美日韩| 国产精品扒开腿做爽爽爽a片唱戏| 99国产一区| 欧美高清视频一区二区三区在线观看| 日本精品另类| www.xxxx欧美| 人妻丰满熟妇av无码区hd| 一本到不卡免费一区二区| 91精品国自产在线| 国产原创一区二区三区| 日韩国产欧美亚洲| 精品九九在线| 92看片淫黄大片欧美看国产片| 精品日韩av| 伊人久久男人天堂| 国产aⅴ爽av久久久久成人| 午夜精品久久一牛影视| a资源在线观看| 国产成人aaaa| 少妇性l交大片| 综合久久十次| 欧美在线一区二区三区四区| 亚洲国产精选| 2019亚洲男人天堂| 乱人伦中文视频在线| 欧美xxxx老人做受| 在线免费一区二区| 亚洲一区在线播放| 亚洲性猛交xxxx乱大交| 国产成人午夜精品5599| 五月天婷婷激情视频| 在线日韩成人| 国产精品99久久久久久白浆小说| 国产黄色在线观看| 亚洲片av在线| 亚洲精品久久久久avwww潮水| 色狠狠一区二区| 懂色av.com| 自拍偷拍亚洲综合| 免费看黄色aaaaaa 片| 国产一区二区三区在线观看免费视频 | 成人欧美一区二区三区黑人麻豆 | 国产亚洲欧美日韩日本| 91精品人妻一区二区三区四区| 日韩主播视频在线| 国产av人人夜夜澡人人爽麻豆| 99九九热只有国产精品| 久久久一本精品99久久精品| 视频精品一区| 国产精品网站视频| 超碰一区二区| 高清欧美性猛交xxxx| 国产视频中文字幕在线观看| 亚洲午夜色婷婷在线| 五月婷婷丁香网| 欧美成人vr18sexvr| 国产视频一区二区三区四区五区| 欧洲精品中文字幕| 中文字幕在线播| 欧美日韩中文字幕| 一区二区免费在线| 日韩专区第三页| 日韩一区电影| 欧美日韩在线高清| 美女主播精品视频一二三四| 欧美日韩在线直播| 成年人网站国产| 99精品综合| 亚洲巨乳在线观看| 欧美色图国产精品| 日韩精品一区二区三区外面| 久操视频在线观看| 中文字幕精品一区久久久久| 免费人成在线观看网站| 精品伊人久久97| 视频二区在线| 亚洲精品电影久久久| 少妇无码一区二区三区| 日韩一二三区视频| 亚洲精品911| 精品久久国产97色综合| 亚洲乱码精品久久久久.. | 艳妇乳肉豪妇荡乳av无码福利 | 久久久久www| 日韩专区在线| 不卡中文字幕av| 天堂成人在线观看| 亚洲精品美女久久久| 日漫免费在线观看网站| 亚洲乱亚洲乱妇无码| 国产中文字幕在线看| 在线视频免费一区二区| 日韩在线免费电影| 久久99精品国产99久久6尤物| 色呦呦网站在线观看| 高清亚洲成在人网站天堂| 综合久久2023| 国产乱人伦真实精品视频| 亚洲精品66| av资源站久久亚洲| 狼人精品一区二区三区在线 | 久久高清免费| 韩国黄色一级大片| 亚洲图片在线| 国产精品视频一区二区三区四区五区 | 99re这里只有精品首页| 国精产品一区二区三区| 国产精品久久久久一区| 五月天丁香激情| 精品久久久久久久久久久| 91丨九色丨海角社区| 337p亚洲精品色噜噜噜| 人妻精品一区一区三区蜜桃91| 亚洲欧美国产一本综合首页| 国产素人视频在线观看| 4438全国成人免费| 亚州精品国产| 精品一区二区三区日本| 日韩情爱电影在线观看| 996这里只有精品| 日韩一区欧美二区| 精品人妻一区二区乱码| 久久精品视频一区二区三区| 老女人性淫交视频| 一本久久精品一区二区| 国产黄色一区二区| 亚洲精品国产精品乱码不99按摩| 婷婷在线视频观看| 国色天香2019中文字幕在线观看| 国产精品xxx| 91视频免费进入| 欧美精品一区二区久久| 国产91视频一区| 日韩av不卡一区二区| 一本色道久久hezyo无码| 国产精品日韩成人| 男人的天堂一区二区| 91精品久久久久久久久99蜜臂| 欧美精品久久久久久久久久丰满| 欧美另类极品videosbest最新版本| 欧美18—19sex性hd| 国产精品久久国产精品| 97精品国产| 国产一区亚洲二区三区| 成人一区二区三区| 青青操在线视频观看| 色狠狠色狠狠综合| 台湾av在线二三区观看| 欧美日韩高清区| 亚洲成人1区| 色综合影院在线观看| 亚洲麻豆av| 熟女人妻一区二区三区免费看| 1区2区3区精品视频| 亚洲 小说区 图片区| 亚洲乱码国产乱码精品精| 18video性欧美19sex高清| 亚洲r级在线观看| 99精品视频在线观看免费播放| 天天干天天干天天干天天干天天干| 久久久久久99久久久精品网站| 国产中文字幕免费| 精品国产伦一区二区三区观看方式| 国产福利视频在线观看| 国产精品视频永久免费播放| 国产日产一区| 国产淫片免费看| 久久综合狠狠综合久久综合88| 久久久久久久99| 精品第一国产综合精品aⅴ| 欧美videosex性欧美黑吊| 亚洲一区二区三区视频播放| 香蕉久久网站| 国产一区二区在线观看免费视频| 国产精品毛片无遮挡高清| 久久久久久av无码免费看大片| 亚洲欧洲国产一区| 久久91导航| 视频一区二区综合| 麻豆91精品91久久久的内涵| 长河落日免费高清观看| 欧美日韩精品一区二区三区四区 | 日韩在线xxx| 国产清纯白嫩初高生在线观看91 | 视频在线观看成人| 日韩极品在线观看| 人人人妻人人澡人人爽欧美一区| 欧美在线free| 精品孕妇一区二区三区| 99porn视频在线| 亚洲国产电影| 欧美老熟妇乱大交xxxxx| 欧美亚洲一区二区在线| 久操视频在线观看| 动漫一区二区在线| 国产欧美日韩一区二区三区在线| 搡老熟女老女人一区二区| 一本大道av伊人久久综合| www.久久热.com| 91精品视频网站| 好看的日韩av电影| 成人网站免费观看| 欧美亚洲图片小说| 亚洲第一图区| 久久精品综合一区| 免费看欧美美女黄的网站| 全网免费在线播放视频入口| 亚洲国产欧美一区二区丝袜黑人| 日本少妇一区| 2018中文字幕第一页| 久久影音资源网| 国产麻豆免费观看| 91国产精品电影| 青青草97国产精品麻豆| av影片在线播放| 欧美中文字幕一二三区视频| 最爽无遮挡行房视频在线| 九九九九精品九九九九| 久久精品免费看| 国产精品白浆一区二小说| 尤物yw午夜国产精品视频明星| 国产精品亚洲综合在线观看| 久久久噜噜噜www成人网| 亚洲欧美一区二区三区久本道91| 波多野结衣视频在线观看| 久久亚洲国产精品| 在线成人动漫av| 中国特级黄色片|