核心價值
Woody是一款專注于Java應用性能問題診斷的工具,旨在幫助開發者
- 定位高GC頻率問題,識別內存分配熱點
- 分析CPU使用率過高的代碼路徑
- 追蹤接口耗時瓶頸,定位內部操作耗時占比
- 診斷鎖競爭問題,支持精準優化
- 針對特定業務接口/請求的性能問題(CPU、內存、耗時)進行深度分析
代碼倉庫
https://github.com/happy-profiler/woody
目前發布第一版,后續會不斷豐富功能,不斷完善,歡迎感興趣同行使用,提建議,bug,issue和pr。
適用環境
- JDK版本:支持JDK 1.8及以上
- 操作系統:
- macOS
- Linux x64/arm64
- 低版本JDK和其他操作系統暫不支持
核心特性
- 基于命令行交互,集成async-profiler生成采樣樣本和火焰圖
- 實現業務請求與火焰圖樣本的精確關聯
- 支持手動過濾無關業務入口,提高采樣精準率
- 極低性能損耗,適合生產環境使用
- 代碼少量借鑒自Arthas
支持中間件
- SpringMVC
- Dubbo
- Grpc
- Kafka
- RocketMQ
后續將持續擴展支持更多中間件
快速開始
- 從項目release頁面下載最新版本的
woody-boot-xxx.jar
- 啟動工具:
java -jar woody-boot-1.0.0.jar
- 選擇目標Java進程編號,進入命令交互界面,輸入stop結束退出
命令參考
單橫杠-
表示命令操作,雙橫杠--
表示參數,后續要接參數值
pr(profiling resource)- 選擇分析的業務入口
用于指定需要分析的業務入口資源,可同時選擇多種中間件的多個入口。
參數 | 說明 |
---|---|
-ls | 列舉當前應用的所有業務入口資源 |
-lt | 列舉當前應用支持的業務資源類型 |
-s | 選擇業務入口資源 |
-us | 移除已選中的業務入口資源 |
-lst | 列舉已選擇的業務入口資源類型列表(未選擇時為空) |
-lss | 列舉已選擇的業務入口資源 |
–type | 指定中間件類型(支持上述5種類型) |
–order | 指定中間件業務入口的資源編號(多編號用英文逗號分隔) 不指定時表示選擇該類型的所有入口資源 |
pe(profiling event)- 選擇采集事件類型
用于指定需要采集的性能事件類型,對應async-profiler的4種火焰圖類型。
參數 | 說明 |
---|---|
-l | 列舉當前應用支持的事件類型 (注:部分應用可能不支持alloc,取決于JDK版本和操作系統) |
-s | 選擇要采集的事件類型 |
–cpu | CPU事件,參數為采樣間隔(ms) |
–alloc | 內存分配事件,參數為采樣閾值(kb) |
–wall | 耗時事件,參數為采樣間隔(ms) |
–lock | 鎖競爭事件,參數為采樣間隔(ms) |
-c | 清除已選中的事件類型 |
支持同時選擇多個事件類型,將生成對應類型的火焰圖
pf(profiling)- 操作性能分析過程
用于控制async-profiler的啟動、停止和狀態查詢。
參數 | 說明 |
---|---|
start | 啟動性能分析 (啟動后需在30秒內觸發已選擇的業務入口請求,否則啟動失敗) |
stop | 結束性能分析 |
status | 查詢當前性能分析狀態(未運行/已運行時長) |
–duration | 設置分析持續時間(秒),時間到后自動結束 (非必須,可通過stop命令提前結束) |
–file | 指定分析結束后生成的火焰圖文件名 (默認生成在工具運行目錄,多事件時會自動添加類型前綴) (未指定時,采樣結果將被緩存,供ts命令使用) |
ts(trace sample)- 檢索分析業務請求和樣本,生成火焰圖
用于檢索性能分析樣本,支持通過traceId定位特定請求,或查看資源消耗TopN的請求。
參數 | 說明 |
---|---|
-l | 列出采樣樣本(需配合–id或–top參數) |
-f | 生成火焰圖(需配合–id或–top參數) |
-c | 清除緩存的前次分析樣本數據 |
–file | 指定生成的火焰圖文件名(配合-f參數使用) |
–event | 指定分析事件類型 (當pe命令選擇多個事件時必須指定,單個事件時可省略) |
–id | 指定traceId(業務請求唯一標識),檢索對應請求的樣本 |
–top | 指定數量N,檢索資源消耗最多的前N個請求ID (將顯示樣本數量、起止時間等信息) |
traceId默認生成規則:1~Long.MAX_VALUE間的隨機數
可通過修改ParametricIdGenerator
實現自定義traceId生成邏輯(從業務上下文/參數/入口對象提取),下個版本可通過命令及表達式從業務請求生成
如何本地編譯及調試
本地編譯: clone工程,執行 mvn clean package -DskipTests
,boot模塊生成的jar包就是工具包,直接運行即可
調試: 待分析應用添加遠程debug參數和端口 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Xdebug
,woody工程直接遠程關聯debug即可
火焰圖查看
火焰圖的具體查看方法請參考相關文檔或通過AI工具學習。