線上問題——2021-12-27 父子線程共用線程池導致死鎖故障

一、事故現象

在這里插入圖片描述

在這里插入圖片描述
從早上6點開始edu-wings-admin的timer-task和mq就開始報警任務堆積,且數量持續上升,到6點50左右mq也開始告警,8點左右發現問題,開始排查,直到11點才找到問題,任務開始正常消費。

二、事故影響范圍

從27號0點4分到早上11點4分班級專欄、表彰發放以及監聽mq的班級、完課事件都被堵住,11點04分修改配置重啟后任務才陸續執行完畢。

三、事故原因分析

我們的任務是每秒掃描執行的,正常情況下,高峰期即使堆積也會立馬被消費,除非有大任務卡住情況(一般卡住的都是timer-task,而這次mq-task也同步出現問題,不過當時沒有意識到這個問題),所以根據以往經驗,查數據庫發現0點的任務就沒有執行了,而這批任務都是給用戶發表彰,但是從日志上沒有找到問題,數據庫也沒有慢sql,后面從應用行為大盤上只能看到xxl-job從0點開始就沒有執行了,也就是從0點開始任務就堵住了,由于任務堆積超過2000條才會告警,所以直到6點群里才開始報警。
在這里插入圖片描述
數據庫、pod CPU都很正常,但業務線程卻卡住,于是開始懷疑業務上是不是產生了死鎖,下載線程堆棧進行分析。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
從上圖我們可以發現線程最終都是卡在了ParallelUtils.invokeAll方法上(看到這個其實應該立馬反應過來線程池中線程被卡住了,導致線程資源耗盡,但實際上我們還走了不少彎路),這個類是我們執行并行任務的一個工具類,里面維護了一個單例的線程池。
在這里插入圖片描述
核心線程數只有8個,最大線程數雖然設置了200,但隊列長度設置為50000,而我們并行任務是達不到50000的,所以一直都只會有8個線程在跑,但是為什么線程會卡住呢?
從上面堆棧日志圖中可以看到UserRpcClient.listUserBabyInfo這個方法,在發用戶表彰時就需要調用這個方法查詢寶貝昵稱,而這個方法之前是串行調用的,由于單次傳入參數太多,所以使用IterateUtil.spiltIterateParallel并行分批調用,問題就在這里,spiltIterateParallel內部也是調用工具類方法ParallelUtils.invokeAll,這就相當于是在父任務中開辟了子任務,父子任務用的又是同一個線程池,同一時間只要有8個父任務在執行,那子任務去獲取線程就會卡住,而父任務又要等子任務返回,導致死鎖。

四、解決方案

  1. 臨時解決方案:修改timer-task占用線程數為1,默認配置為8,重啟。這樣在同一個pod上同一時間只會有一個父任務在跑,也就只會占用一個線程,剩余7個留給子任務
  2. 最終解決方案:修改公用組件,隔離timer-task、mq-task和業務線程的線程池,避免相互影響。目前wings-admin已升級并上線,其余服務后續逐步升級發布。

五、反思

  1. 這次問題其實在0點就發生了,但經過了6小時才告警,這是由于異步任務告警閾值目前僅根據數量(固定2000)觸發,需要加入任務執行時間等因素。
  2. 使用線程池時需要考慮使用場景,核心線程數、最大線程數、阻塞隊列長度、拒絕策略的配置以及是否需要隔離線程。,此次事故中最大線程數完全沒起作用就是因為阻塞隊列長度過長導致。后續考慮實現動態可監測線程池,做到線程池統一管理、可動態配置,出現問題及時告警等

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717513.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

haproxy集成國密ssl功能[下]

上接[haproxy集成國密ssl功能上 4. 源碼修改解析 以下修改基本圍繞haproxy的ssl_sock.c進行修改來展開的,為了將整個實現邏輯能夠說明清楚,下述內容有部分可能就是直接摘抄haproxy的原有代碼沒有做任何修改,而大部分增加或者修改的內容則進行了特別的說明。 4.1 為bind指令…

基于springboot+vue的疾病防控綜合系統

博主主頁:貓頭鷹源碼 博主簡介:Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰,歡迎高校老師\講師\同行交流合作 ?主要內容:畢業設計(Javaweb項目|小程序|Pyt…

計算機設計大賽 深度學習貓狗分類 - python opencv cnn

文章目錄 0 前言1 課題背景2 使用CNN進行貓狗分類3 數據集處理4 神經網絡的編寫5 Tensorflow計算圖的構建6 模型的訓練和測試7 預測效果8 最后 0 前言 🔥 優質競賽項目系列,今天要分享的是 🚩 **基于深度學習貓狗分類 ** 該項目較為新穎&a…

Python測試框架pytest介紹用法

1、介紹 pytest是python的一種單元測試框架,同自帶的unittest測試框架類似,相比于unittest框架使用起來更簡潔、效率更高 pip install -U pytest 特點: 1.非常容易上手,入門簡單,文檔豐富,文檔中有很多實例可以參考 2.支持簡單的單…

C++內存模型與內存序

寫在前面 在真正了解Memory Order的作用之前,曾經簡單地將Memory Order等同于mutex和atomic來進行線程間數據同步,或者用來限制線程間的執行順序,其實這是一個錯誤的理解。直到后來仔細研究了Memory Order之后,才發現無論是功能還…

Android 12 設置默認的屏幕亮度百分比

1、安卓每個版本的更新, 其核心代碼也會隨之更新,本次為Android 12 版本默認屏幕亮度的修改。 其中涉及的核心代碼主要有: packages\apps\Settings\src\com\android\settings\display\BrightnessLevelPreferenceController.java frameworks…

力扣706:設計哈希映射

題目: 不使用任何內建的哈希表庫設計一個哈希映射(HashMap)。 實現 MyHashMap 類: MyHashMap() 用空映射初始化對象void put(int key, int value) 向 HashMap 插入一個鍵值對 (key, value) 。如果 key 已經存在于映射中&#x…

【GPU驅動開發】- mesa編譯與鏈接過程詳細分析

前言 不必害怕未知,無需恐懼犯錯,做一個Creator! 一、總體框架圖 暫時無法在飛書文檔外展示此內容 二、Mesa API 處理 OpenGL 函數調用 Mesa API 負責實現 OpenGL 和其他圖形 API 的函數接口。Mesa API 表是一個重要的數據結構&#xf…

c# 獲得進程的標題

使用 System.Diagnostics.Process 類來獲取所有 Internet Explorer 進程的標題。以下是如何做到這一點的代碼示例: using System; using System.Diagnostics;class Program {static void Main(){foreach (Process process in Process.GetProcessesByName("iex…

數據中臺的演進與實踐——構建企業的數字核心_光點科技

數據中臺,一個在近年來被頻繁提及的概念,已經成為眾多企業數字化轉型的核心組成部分。然而,盡管它的重要性被業界廣泛認可,對于數據中臺的深入理解和有效實踐仍然是許多企業面臨的挑戰。在本文中,我們將從數據中臺的演…

從租完ecs云服務器 使用docker建立用戶 全過程

一 登錄root用戶 ssh root公網ip 輸入密碼,若沒有密碼可以前往阿里云設置服務器root密碼 二 創建新用戶 并賦予 新用戶sudo權限 adduser $USER usermod -aG sudo $USER 三 Ubuntu安裝docker sudo apt-get remove docker docker-engine docker.io containerd ru…

藍橋杯:門牌制作

題目 小藍要為一條街的住戶制作門牌號。 這條街一共有2020 位住戶,門牌號從1 到2020 編號。 小藍制作門牌的方法是先制作0 到9 這幾個數字字符,最后根據需要將字符粘貼到門牌上,例如門牌1017 需要依次粘貼字符1、0、1、7,即需要1…

反向代理原理

反向代理是一種網絡應用架構模式,主要用于將對一個或多個后端服務器的請求進行轉發、負載均衡和緩存,以提高系統的安全性、性能和可靠性。 其原理如下: 1. 客戶端向反向代理發送請求。 2. 反向代理服務器接收請求,并根據預設的規…

基于window安裝Elasticsearch詳細教程

目錄 一、安裝Java環境1.1 Java版本選擇 二、下載和安裝ES2.1 下載地址2.2 文件目錄 3、啟動服務3.1 以管理員身份打開cmd3.2 首次登錄會有密碼,需要記住3.3 訪問 一、安裝Java環境 1.1 Java版本選擇 官網地址:https://www.elastic.co/cn/support/matr…

9個接口性能優化方案,RT從9000ms到180ms

昨天接到生產 SkyWalking 鏈路監控告警: 服務的百分位數響應時間在過去的 10 分鐘內超過 2000 毫秒的次數達到 3 次。 經過不斷的優化,將接口從 9000ms 優化到 180ms,先看結果 優化前: 優化后: 廢話不多我們開始 一、定位性能差的…

Maven實戰(2)之搭建maven私服

一, 背景: 如果使用國外鏡像,下載速度比較慢; 如果使用阿里云鏡像,速度還算OK,但是假如網速不好的時候,其實也是比較慢的; 如果沒有網的情況下更加下載不了. 二, 本地倉庫、個人/公司私服、遠程倉庫關系如下: 三, 下載安裝nexus私服 略

Notepad3:告別Windows記事本,輕松進行文本編輯

名人說:莫道桑榆晚,為霞尚滿天。——劉禹錫(劉夢得,詩豪) 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊) 目錄 一、什么是Notepad3?①Notepad3②核…

openGauss學習筆記-234 openGauss性能調優-系統調優-資源負載管理-資源管理準備-設置控制組

文章目錄 openGauss學習筆記-234 openGauss性能調優-系統調優-資源負載管理-資源管理準備-設置控制組234.1 背景信息234.2 前提條件234.3 操作步驟234.3.1 創建子Class控制組和Workload控制組234.3.2 更新控制組的資源配額234.3.3 刪除控制組 234.4 查看控制組的信息 openGauss…

第八節 龍晰Anolis 8.8 安裝 DDE 桌面環境

一、前言 最小化安裝的龍晰 Anolis OS 8.8 是不帶圖形化界面的,只能使用命令行,有些時候需要用到桌面環境,而DDE (Deepin Desktop Enviroment) 就是很好的桌面環境,它是指龍晰 Anolis 所搭載的中國自主桌面環境,用起來…

客戶快遞信息管理系統——導入文件識別存儲

客戶快遞信息管理系統背景: 目前不少公司都提供網購服務,為了將商品快遞給客戶,就必須保存和管理客戶的姓名、電話號碼、郵寄地址等信息。為此,本項目要求完成一個小型客戶快遞信息管理系統,完成對客戶快遞信息的建立…