核心价值
Woody是一款专注于Java应用性能问题诊断的工具,旨在帮助开发者
- 定位定位高GC频率问题,识别内存分配热点
- 分析CPUCPU使用率过高的代码路径
- 追踪接口耗时瓶颈,定位内部操作耗时占比
- 诊断锁竞争问题,支持精准优化
- 针对特定业务接口/请求的性能问题(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
-
启动工具:
bashjava -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工具学习。