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

線程池運用不當的一次線上事故

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

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

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

01 業(yè)務背景描述

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

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

02 問題現象和業(yè)務影響

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

關于newFixedThreadPool,核心包括兩點:

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

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

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

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

  1. /**  
  2.  * 執(zhí)行扣費任務  
  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.  * 扣費任務的具體業(yè)務邏輯  
  11.  */  
  12. public class ChargeTaskBll implements Runnable {  
  13.   public void execute(ChargeTask chargeTask) {  
  14.      // 第一步:參數校驗  
  15.      verifyInputParam(chargeTask);  
  16.      // 第二步:執(zhí)行反作弊子任務  
  17.      executeUserSpam(SpamHelper.userConfigs);  
  18.      // 第三步:執(zhí)行扣費  
  19.      handlePay(chargeTask);  
  20.      // 其他步驟:點擊埋點等  
  21.      ...  
  22.   }  
  23.  
  24. /**  
  25.  * 執(zhí)行反作弊子任務  
  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.   }  

通過上述代碼,大家能否發(fā)現死鎖是怎么發(fā)生的呢?根本原因在于:一次扣費行為屬于父任務,同時它又包含了多次子任務:子任務用于并行執(zhí)行反作弊策略,而父任務和子任務使用的是同一個業(yè)務線程池。當線程池中全部都是執(zhí)行中的父任務時,并且所有父任務都存在子任務未執(zhí)行完,這樣就會發(fā)生死鎖。下面通過1張圖再來直觀地看下死鎖的情況:

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

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

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

05 解決方案

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

06 問題總結

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

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

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

--- 結束 --- 

 

責任編輯:龐桂玉 來源: Java編程
相關推薦

2024-06-28 10:01:04

2022-10-25 18:00:00

Redis事務生產事故

2024-09-05 08:07:55

2021-04-13 08:54:28

dubbo線程池事故排查

2022-07-11 13:58:14

數據庫業(yè)務流程系統(tǒng)

2023-01-16 14:49:00

MongoDB數據庫

2022-06-06 11:31:31

MySQL數據查詢

2022-09-07 09:09:13

高并發(fā)架構

2020-06-11 16:15:25

Java線程池代碼

2025-07-28 06:38:07

2025-07-16 07:20:00

開發(fā)代碼并發(fā)

2024-02-04 08:26:38

線程池參數內存

2025-03-11 08:48:35

JVMOOM事故

2019-10-10 15:40:17

redisbug數據庫

2020-08-20 07:37:21

數據庫開源框架

2020-08-24 07:34:39

網絡超時請求

2021-03-05 22:41:55

CDH集群CDH集群

2022-05-12 09:52:09

網絡架構HTTP跨域保護機制

2020-01-18 14:11:13

數據庫線程技術

2019-01-16 09:20:42

架構設計JVM FullGC宕機事故
點贊
收藏

51CTO技術棧公眾號

亚洲av成人无码久久精品| 嫩草影院中文字幕| 97国产成人无码精品久久久| 久久精品影视| 日韩av综合网站| 视频二区一区| 国产口爆吞精一区二区| 日韩一区二区久久| 亚洲激情成人网| 免费看涩涩视频| 韩国成人二区| 亚洲少妇屁股交4| 麻豆成人av| 99热这里只有精品1| 久久久亚洲人| 欧美激情va永久在线播放| 亚洲毛片亚洲毛片亚洲毛片| 9l视频自拍蝌蚪9l视频成人| 亚洲综合精品久久| 欧美深深色噜噜狠狠yyy| 国产裸体无遮挡| 午夜精品久久久久99热蜜桃导演| 日韩一区二区三区四区五区六区| 好色先生视频污| 亚洲a视频在线观看| 日韩 欧美一区二区三区| 色婷婷**av毛片一区| 无码人妻aⅴ一区二区三区| av资源亚洲| 亚洲一区二区av电影| 亚洲精品乱码久久久久久蜜桃91| 97超碰国产在线| 三级久久三级久久久| 91精品国产高清久久久久久久久 | 国产午夜视频在线| 99久久影视| 精品国产青草久久久久福利| 日韩欧美亚洲另类| 福利一区和二区| 91福利在线免费观看| 国产成人黄色片| 136福利第一导航国产在线| 最新热久久免费视频| 亚洲精品日韩成人| eeuss影院在线观看| 久久精品人人爽人人爽| 亚洲综合视频1区| 国产又黄又爽视频| 极品销魂美女一区二区三区| 国产免费亚洲高清| 中文字幕 欧美激情| 在线成人国产| 久久久久久久网站| 亚洲精品天堂网| 成人综合久久| 日韩少妇与小伙激情| 欧美aaa级片| 91麻豆精品国产91久久久平台| 欧美成人一区二区| 四川一级毛毛片| 亚洲精品.com| 欧美特级限制片免费在线观看| 精品成在人线av无码免费看| √天堂资源地址在线官网| 岛国一区二区在线观看| 国产一级特黄a大片99| 五月天久久久久久| 久久精品视频一区二区| 日本一区二区三区四区高清视频 | 国产一区二区三区四区五区美女| 欧美最顶级的aⅴ艳星| 国产suv一区二区三区| 精品久久91| 日韩视频永久免费观看| 免费在线一级片| 亚洲在线成人| 国产精品色视频| 国产ts人妖调教重口男| 97久久精品人人做人人爽50路| 成人免费自拍视频| 亚洲a视频在线| 久久久国产精品午夜一区ai换脸| 国产一区二区无遮挡| 久久电影中文字幕| 中文字幕视频一区| 日韩精品在线中文字幕| 2022成人影院| 欧美一级在线免费| 污污网站免费观看| 成功精品影院| 综合激情国产一区| 国产中文字幕免费| 蜜桃视频在线观看一区| 国产精品久久久久久久app| 国产男男gay网站| 99精品偷自拍| a级黄色片网站| 国产免费拔擦拔擦8x在线播放| 亚洲成av人片| 日本黄大片一区二区三区| 久久久久毛片| 欧美精品一区二区三区蜜桃 | 久久新电视剧免费观看| 中文字幕在线观看一区二区三区| 天堂中文а√在线| 婷婷夜色潮精品综合在线| 国产原创精品在线| 天堂在线精品| 久久久久久国产免费 | 亚洲午夜激情网站| 国产日韩欧美久久| 色婷婷综合久久久久久| 久久亚洲精品网站| 波多野结衣视频免费观看| 国产成人免费网站| 日韩视频在线播放| 麻豆网站免费在线观看| 欧美一区二区三区的| 亚洲最大成人综合网| 日韩视频中文| 国产精品国模大尺度私拍| 天堂在线观看视频| 亚洲三级电影网站| 777av视频| 成人黄色免费短视频| 欧美日韩一区二区在线观看| 北条麻妃亚洲一区| 日韩片欧美片| 国产精品高潮视频| 精品久久久久一区二区三区| 懂色aⅴ精品一区二区三区蜜月| 成人在线激情网| 日韩中出av| 97色在线视频观看| 农村少妇久久久久久久| 国产亚洲综合av| 成人在线免费观看av| 国产欧美自拍一区| 国模精品视频一区二区三区| www.av日韩| 一区二区理论电影在线观看| 亚洲一级片免费观看| 91成人观看| 91久久在线视频| www.久久久久.com| 日韩欧美中文字幕公布| 亚洲欧美一区二区三区四区五区| 久久激情中文| 欧美主播一区二区三区美女 久久精品人 | 免费在线观看av网址| 国产成人精品影视| 男人添女荫道口女人有什么感觉| 澳门av一区二区三区| 亚洲无av在线中文字幕| 伊人久久成人网| 国产精品不卡在线| 亚洲女人在线观看| 欧美激情aⅴ一区二区三区| 3d动漫精品啪啪一区二区三区免费| 天天在线女人的天堂视频| 午夜免费久久看| av在线网站免费观看| 欧美二区视频| 国产欧美一区二区三区不卡高清| 黄色网在线播放| 日韩丝袜情趣美女图片| 日本午夜精品理论片a级app发布| 国产一区999| 成人av在线播放观看| 黄色免费大全亚洲| 日韩av不卡电影| 日本三级在线视频| 欧洲国产伦久久久久久久| 少妇视频在线播放| 国产激情视频一区二区三区欧美| 正在播放亚洲| 成人影院中文字幕| 国产精品成av人在线视午夜片| 亚洲人妻一区二区| 在线观看免费一区| 婷婷在线精品视频| 99国产一区二区三精品乱码| 国产精品igao| 欧美在线亚洲| 欧美亚洲爱爱另类综合| а天堂中文最新一区二区三区| 欲色天天网综合久久| 国产高清第一页| 色婷婷综合久久久久中文一区二区 | 激情五月色婷婷| 欧美国产日产图区| 国产乱国产乱老熟300部视频| 综合在线一区| 免费看成人片| 日韩视频在线直播| 日韩美女在线看| 污片视频在线免费观看| 亚洲一区第一页| 日本黄色不卡视频| 欧美日韩黄色一区二区| 国产麻豆视频在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 丰满少妇被猛烈进入高清播放| 色综合www| 91九色蝌蚪成人| 国产精成人品2018| 51视频国产精品一区二区| av在线麻豆| 在线视频欧美性高潮| 熟妇高潮一区二区高潮| 91麻豆精品国产91久久久久久久久 | 四虎884aa成人精品最新| 成人性生交大片免费看小说 | 成人知道污网站| 成人网欧美在线视频| 成人午夜精品| 欧美在线视频免费播放| 幼a在线观看| 国产午夜精品全部视频在线播放| 一级黄色a毛片| 色哟哟国产精品| 国产一级片免费| 亚洲精品欧美在线| 国产91在线播放九色| 国产成人在线网站| 午夜一级免费视频| 麻豆久久久久久久| 嫩草av久久伊人妇女超级a| 国产一区二区三区久久久久久久久 | 亚洲av无码国产综合专区| 欧美少妇bbb| 人人妻人人爽人人澡人人精品| 成人免费小视频| 伊人影院综合网| 国产婷婷色一区二区三区在线| 一区二区三区国产好的精华液| 夜夜夜久久久| 国产精品999视频| 在线观看的日韩av| www在线观看免费| 99精品热6080yy久久| 日韩五码在线观看| 99国产精品| 97国产精东麻豆人妻电影| 99热精品在线观看| 午夜精品久久久久久久无码 | 18岁网站在线观看| 亚洲黄色免费| 欧美精品久久久久久久免费| 日韩午夜免费视频| 无码人妻丰满熟妇区毛片18| 午夜国产一区| 妞干网在线播放| 亚洲精品视频啊美女在线直播| ijzzijzzij亚洲大全| 久久最新网址| 亚洲国产精品久久久久婷婷老年| 欧美韩一区二区| 久久国产精品一区二区三区四区| 国模大尺度视频一区二区| 日本一本a高清免费不卡| 日韩欧美精品一区二区综合视频| 国内伊人久久久久久网站视频 | 欧美丰满熟妇bbbbbb百度| 欧美亚洲视频| gogogo高清免费观看在线视频| 久久国产高清| 亚洲人辣妹窥探嘘嘘| 国产一区二区三区在线观看免费| 日本三级黄色网址| 国产精品一区一区三区| 久久久老熟女一区二区三区91| 国产一区二区视频在线播放| 免费一区二区三区在线观看| 国产经典欧美精品| 美女又爽又黄视频毛茸茸| 成人18视频日本| 欧美大波大乳巨大乳| 亚洲男人电影天堂| 51精品免费网站| 亚洲18女电影在线观看| 国产suv精品一区二区33| 91精品国产综合久久婷婷香蕉| 伊人精品在线视频| 欧美精品一区二区不卡| 邻居大乳一区二区三区| 久久天天躁夜夜躁狠狠躁2022| 久久99精品久久久久久野外| 高清一区二区三区四区五区| а√在线中文网新版地址在线| 欧美精品videossex性护士| 久久久久黄久久免费漫画| 午夜日韩在线观看| 久久久国产精品免费| 国产精品视频一二区| 亚洲国产黄色片| 午夜视频成人| www.日韩免费| 免费在线小视频| 91免费在线视频网站| 亚洲人成亚洲精品| 国产一区二区三区播放| 日韩在线一区二区三区| 91亚洲一线产区二线产区| 欧美国产精品一区二区三区| 国产一级片播放| 欧美一区二区三区人| 黄色一级大片在线免费看国产| 精品国免费一区二区三区| 国产福利第一视频在线播放| 欧美激情三级免费| 亚洲伦理网站| 小说区图片区图片区另类灬| 国产午夜久久| 麻豆免费在线观看视频| 国产精品丝袜在线| 天堂网视频在线| 亚洲国产精品字幕| 青草在线视频| 亚洲精品免费av| 欧美高清在线| 亚洲免费一级视频| 国产一区二区三区四| 亚洲毛片亚洲毛片亚洲毛片| 伊人夜夜躁av伊人久久| 亚洲天堂自拍偷拍| 国产一区二区三区在线播放免费观看| 日韩专区在线| 国产精品视频久久| 97精品久久| 激情六月天婷婷| 国产91精品免费| 青青草免费av| 亚洲图片在线视频| 亚洲精品视频网上网址在线观看 | 2024国产精品| 在线看成人av| 欧美日韩卡一卡二| 天天综合天天综合| 日日狠狠久久偷偷四色综合免费| av在线加勒比| 极品校花啪啪激情久久| 欧美亚韩一区| 国产真实乱人偷精品| 亚洲午夜激情网站| 深夜福利视频网站| 97碰在线观看| 免费国产自久久久久三四区久久| 五月天激情图片| 国产99精品在线观看| 麻豆一区二区三区精品视频| 精品va天堂亚洲国产| 草草在线视频| 欧美日韩三区四区| 青青草国产精品亚洲专区无| 久久噜噜色综合一区二区| 777午夜精品免费视频| 日韩av激情| 91久久精品日日躁夜夜躁欧美| 成人午夜激情av| 91老司机福利 在线| 无码人妻aⅴ一区二区三区有奶水 无码免费一区二区三区 | 欧美aaaaaa| 国产又黄又爽免费视频| 国产精品影视网| 久久人妻无码aⅴ毛片a片app| 一本色道久久综合亚洲91| 成人av毛片| 91九色在线免费视频| 一本久道久久综合狠狠爱| 国产精成人品免费观看| 欧美美女bb生活片| 羞羞视频在线观看不卡| 国产日本欧美一区| 欧美日韩午夜| 精品人妻无码一区| 在线播放国产精品二区一二区四区 | 成人在线免费av| 97超碰在线视| 久久亚洲精精品中文字幕早川悠里| 91国产丝袜播放在线| 一本大道亚洲视频| 国产精品字幕| 久久天天东北熟女毛茸茸| 韩国成人精品a∨在线观看| 国产精品suv一区二区69| 亚洲人成伊人成综合网久久久 | 免费a在线看| 国产亚洲自拍偷拍| 久久国产麻豆精品| 日本黄色录像视频| 亚洲国产日韩欧美在线99| 欧亚在线中文字幕免费| 一本久久a久久精品vr综合| 高清视频一区二区| 国产午夜福利一区二区| 亚洲第一福利网| 婷婷久久免费视频| 久久国产乱子伦免费精品| 亚洲乱码精品一二三四区日韩在线|