解決多執行緒效能問題技巧分享

2021-09-01 23:33:14 字數 2310 閱讀 3750

效能分析工具

總結最近工作中在使用多執行緒處理業務邏輯時遇到了問題,程式執行期初,與之前未使用多執行緒沒有任何差別,但是當對應的執行緒處理佇列開始擁堵時,處理速度開始愈來愈慢,為解決該效能問題,投入多日並作出如下總結

判定原因:某方法耗時較長,拖垮整個業務流程,導致效能下降

驗證過程:在整個業務流程的主方法中加入方法耗時日誌,發現所有方法耗時整體偏慢,且耗時頗長的方法並不唯一,存在隨機性(正常方法耗時在3ms左右,異常時方法耗時平均90ms,更有甚者耗時上百上千毫秒)

判定原因:同步日誌輸出拖慢系統整體效能

驗證過程:針對日誌輸出方式,分別對同步和非同步日誌進行兩次壓測,但是效果雖有改善但是整體影響不大,整體還是偏慢,該原因並不是導致系統問題的主要原因,壓測資料如下

日誌輸出方式

速率(5min)

速率(10min)

速率(15min)

速率(20min)

速率(25min)

速率(30min)

同步34972

9628

11485

15927

1758~非同步

45595

48460

28836

9930

1746

判定原因:改造後,業務邏輯處理多了31個執行緒,懷疑執行緒數量過多,導致執行緒之間切換時間大於執行緒工作時間

驗證方式:減少啟動執行緒數,啟動16個執行緒進行壓測,結果速率恢復正常,但是通過對系統監控,31個執行緒對於系統整體200多原有執行緒數來說並不算多,執行緒數過多是原因之一但不是主要原因

判定原因:31個執行緒在分別處理31個佇列,並不是每個佇列都有值,但是31個執行緒需要常駐,並時刻判斷佇列是否有值,此時空值佇列的消費執行緒無限空轉判斷,造成cpu秘籍,嚴重影響效能

驗證方式:重新啟動31個執行緒,在消費時隊列為空,執行緒強制睡眠5s,結果效果顯著,速率恢復正常,壓測結果如下

執行緒休眠對照

日誌輸出方式

速率(5min)

速率(10min)

速率(15min)

速率(20min)

速率(25min)

速率(30min)

不睡眠同步

34972

9628

11485

15927

1758

~不睡眠

非同步45595

48460

28836

9930

1746

睡眠同步

45716

46013

46521

43581

47421

45658

睡眠非同步

43655

49189

45319

47910

47761

結論:空跑執行緒會嚴重影響系統效能,針對於系統常駐執行緒,在不做業務處理時,需要讓對應執行緒先休息,釋放響應系統資源
31執行緒-同步日誌-執行緒不睡眠

31執行緒-同步日誌-執行緒不睡眠

使用top 定位到占用cpu高的程序pid

top通過ps aux | grep pid命令

獲取執行緒資訊,並找到占用cpu高的執行緒

ps -mp pid -o thread,tid,time | sort -rn

將需要的執行緒id轉換為16進製制格式

printf 「%x\n」 tid

列印執行緒的堆疊資訊

jstack pid |grep tid -a 30

第一步查程序內線程

第二部執行緒id轉換

分析堆疊

效能問題分析應該從四個維度:

多執行緒解決匯出excel效能問題

多執行緒解決匯出excel效能問題 第一步 controller 發起匯出資料請求 第二步 計算總記錄數,根據總記錄數分配執行緒數和每個執行緒處理的記錄數。override public string exportotherhardexcelall string statdate,int mode,...

多執行緒 基礎多執行緒學習分享

程序 程式是靜止,其真正執行時的程式才稱之為程序 執行緒 輕量級程序 light weight process 程序與執行緒區別 執行緒的組成 建立執行緒 主要的兩種方式 a 繼承thread類方法 步驟 1.編寫類 繼承thread 2.重寫run方法 3.建立執行緒物件 4.呼叫start方法啟...

多執行緒解決方案及效能

程式操作的開銷 取自 深入理解並行程式設計 表3.1 操 作 開 銷 ns 比 率 單週期指令 0.61.0 最好情況的cas 37.9 63.2 最好情況的鎖 65.6 109.3 單次快取未命中 139.5 232.5 cas快取未命中 306.0 510.0 光纖通訊 3,000 5000 全...