簡介
在系統性能監控方法上,Skywalking 提出了代碼級性能剖析這種在線診斷方法。這種方法基於一個高級語言編程模型共性,即使再復雜的系統,再復雜的業務邏輯,都是基於線程去進行執行的,而且多數邏輯是在單個線程狀態下執行的。
代碼級性能剖析就是利用方法棧快照,並對方法執行情況進行分析和匯總。並結合有限的分布式追蹤 span 上下文,對代碼執行速度進行估算。
優勢
- 精確的問題定位,直接到代碼方法和代碼行
- 無需反復的增刪埋點,大大減少了人力開發成本
- 不用承擔過多埋點對目標系統和監控系統的壓力和性能風險
- 按需使用,平時對系統無消耗,使用時的消耗穩定可能
執行流程:
agent端每隔20秒向服務端發起請求,來向服務端詢問本agent是否有分析任務,如果接受到這個任務之后,就會在當前時間或者將來的某個時間開始監控操作。在服務端如果已經感知到agent端已經知道這個任務的時候,在profile頁面的任務詳情中,點開任務詳情的頁面,在彈出框的下方會展示一條日志:包括:實例信息、操作類型、操作時間等。

使用步驟
使用工程
Live-Demo 工程中 projectB 項目
修改 DatabaseOperateDao#selectUser 方法,設置一個4s的睡眠

在skywalking中新建任務
監控 /projectB/1234 端點,持續5分鍾

需要注意的點
- 一個服務在監控持續時間內只能設置一個端點監控任務
源碼邏輯入口
org.apache.skywalking.oap.server.core.profile.ProfileTaskMutationService``#checkDataSuccess

- 剖析端點的響應時間必須大於監控間隔時間
由於性能棧快照有一定的性能消耗,所以采集周期不宜過密,SkyWalking 目前不支持小於 10ms 的采集間隔。所以如果問題方法執行時間小於 10ms,此方法並不適用。同時剖析端點的響應速度如果小於監控時間間隔,也無法進行監控采集。
發送請求
curl http://localhost:8764/projectB/1234
查看剖析結果

上圖所示的就是鏈路追蹤時的真實執行情況,表格中從左到右分別展示了方法名、開始時間、執行時長、執行時間占比、API類型、服務名和跨度信息。其中可以看到前面設置了4s睡眠的 selectUser 方法執行速度最慢。再點擊分析按鈕,可以查看對應方法的調用棧。

從左右到右分別展示了棧幀名稱、該棧幀總計耗時(包含其下面所有自棧幀)、當前棧幀自身耗時和監控次數
繼續向下查找可以發現 selectUser 的棧楨信息,從這里可以看到方法是真正卡在了線程睡眠邏輯中

參考:https://blog.csdn.net/wb4927598/article/details/119192538