JVM监控: async-profiler与Flame Graphs

async-profiler

async-profiler是一个对系统性能影响很少的Java采样分析器,它的实现是基于HotSpot特有的API,通过这些特有的API收集堆栈跟踪和跟踪内存分配。
Async-profiler可以跟踪以下类型的事件:

  • CPU周期
  • 硬件和软件性能计数器,如缓存未命中、分支未命中、页面错误、上下文切换等
  • Java堆中的分配
  • Java对象监视器和可重入锁等

github地址:https://github.com/jvm-profiling-tools/async-profiler

async-profiler

 
Usage: ./profiler.sh [action] [options] <pid>
Actions:
  start             start profiling and return immediately
  stop              stop profiling
  status            print profiling status
  list              list profiling events supported by the target JVM
  collect           collect profile for the specified period of time
                    and then stop (default action)
Options:
  -e event          profiling event: cpu|alloc|lock|cache-misses etc.
  -d duration       run profiling for <duration> seconds
  -f filename       dump output to <filename>
  -i interval       sampling interval in nanoseconds
  -b bufsize        frame buffer size
  -t                profile different threads separately
  -o fmt[,fmt...]   output format: summary|traces|flat|collapsed
 
<pid> is a numeric process ID of the target JVM
      or 'jps' keyword to find running JVM automatically using jps tool
 
Example: ./profiler.sh -d 30 -f profile.fg -o collapsed 3456
         ./profiler.sh start -i 999000 jps
         ./profiler.sh stop -o summary,flat jps
 

Flame Graphs (火焰图)

火焰图是svg 格式的矢量图,是先通过perf 等工具分析得到结果,并将该结果生成的具有不同层次且支持互动的图片,看起来就像是火焰,这也是它的名字的由来。
github地址:https://github.com/brendangregg/FlameGraph

实战分析

线上运行项目,通过 top 命令发现,cpu 的使用率一直是 100%,下面记录一次分析和解决问题的过程。
cpu占用率图

jstack

查询pid

## 安装 Java 环境变量,可使用 jps
jps
## ps常规查询
ps -ef | grep 项目名

jps查询 pid

显示进程下的线程

top -Hp pid

pid:进程 id,对应上图的 8316
进程下的线程

10 进制转换16 进制

printf "%x\n" tid

tid:占用 cpu 率高的线程,对应上图中的8361
16进制线程 id

jstack 打印线程信息

jstack 8316 | grep '20a9' -A50 >> 8361.log

下图即为 8361.log内容
线程8361信息
仅从上图分析,无法看出该线程问题。

async-profiler

cpu profile数据采集

## 开启
./profiler.sh start $pid
## 关闭
./profiler.sh stop $pid

cpu使用率分析

通过Flame Graphs分析

./profiler.sh -d 60 -o collapsed -f /root/collapsed.txt pid

采集数据的时间为60秒,将数据按照collapsed规范进行dump,保存到/root/collapsed.txt,60秒之后,工具会自动停止,并且将cpu的profile数据dump到/root/collapsed.txt,需要使用Flame Graphs工具来进行加工。

./flamegraph.pl --colors=java /root/collapsed.txt > collapsed.svg

火焰图

结合代码分析

优化前代码

未优化代码
此时可以定位到,boss 线程可能一直在空转,一直不停的执行逻辑,却没有任何数据返回。

优化后代码

优化代码后
避免空转,boss 线程休眠 10s。
优化后CPU使用率
效果明显,cpu 使用率降下来了。

总结

通过jstack 和 async-profiler,定位到问题代码,分析产生的原因。记录本次分析的全过程,活学活用,未来掌握更多的问题诊断工具。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值