效能分析工具
總結最近工作中在使用多執行緒處理業務邏輯時遇到了問題,程式執行期初,與之前未使用多執行緒沒有任何差別,但是當對應的執行緒處理佇列開始擁堵時,處理速度開始愈來愈慢,為解決該效能問題,投入多日並作出如下總結
判定原因:某方法耗時較長,拖垮整個業務流程,導致效能下降
驗證過程:在整個業務流程的主方法中加入方法耗時日誌,發現所有方法耗時整體偏慢,且耗時頗長的方法並不唯一,存在隨機性(正常方法耗時在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 全...