随着业务的发展,使用接口提供的服务的业务越来越多,不同的业务对调用耗时的要求不同,当然,耗时越少越好。而近来已经有三四个调用方反映接口调用耗时太不稳定,代码上的优化已经做了很多,有效果,但还不够。同时,压力测试显示,复杂业务在调用量单机3000次/分时CPU就已经100%了,与预期差距太远。为了改善接口性能,找到性能瓶颈,不得已祭出了大杀器————火焰图。

网上的关于java火焰图的讲解大部分来自于Brendan Gregg的博客,火焰图的效果大致如下图:

最终生成一个SVG格式的图片,图上的每个色块代表的是一个线程栈帧,纵轴方向从下往上表示的是函数调用栈,而横轴方向色块的宽度表示的是函数调用占用CPU的比例。在使用Profiler对CPU进行采样时,根据CPU当前执行所处栈位置以及各个函数栈在总的采样次数所占比例就可以得出各个函数执行时的CPU占用比例。

火焰图生成方式

火焰图的生成过程有两步:

1. 使用Profiler工具生成trace文件;

2. 将trace文件转换为svg格式的火焰图文件;

Brendan使用的Profiler是lightweight-java-profiler,这个需要自己编译:

make BITS=64 all

还可以通过更改global.h文件来配置采样次数:

// 每秒采样次数

static const int kNumInterrupts = 100;

// Maximum number of stack traces

static const int kMaxStackTraces = 3000;

// 采样栈深度

static const int kMaxFramesToCapture = 128;

在长时间采样时,可以适当地减少每秒采样次数,不然最终生成的文件会很大,分析起来比较麻烦。

编译生成文件liblagent.so,使用起来很简单,在java启动参数添加如下内容:

-agentpath:path/to/liblagent.so

java程序启动后会在当前目录生成一个traces.txt文件,但文件中只有一些说明信息。程序正常结束(不是通过kill -9杀掉进程)后,才会写入具体采样信息。

Brendan提供了一个工具集来将各种Profiler生成的文件转化为火焰图svg格式。使用方式如下:

git clone http://github.com/brendangregg/FlameGraph

cd FlameGraph

./stackcollapse-ljp.awk < ../traces.txt | ./flamegraph.pl > ../traces.svg

除了使用lightweight-java-profiler作为Profiler外,还有其他的选择,比如honest-profiler,lightweight-java-profiler会从java虚拟机启动开始采样,而有时候我们需要在CPU飙高的时候开始,这时候honest-profiler提供的动态启停功能就有用武之地了。

使用honest-profiler生成火焰图:

首先,需要先下载或者手动编译honest-profiler,使用方式如下:

java -agentpath:/path/to/location/liblagent.so=interval=7,logPath=/path/to/output/log.hpl,start=0,host=127.0.0.1,port=12345

其中interval是采样频率,logPath表示生成的采样文件路径,start可取0或1,表示是否启动时就开启采样,host和port表示监听控制的IP地址和端口号。

启动成功后,通过telnet连接到127.0.0.1:12345,即可通过命令控制采样的开始和结束。支持的命令包括:

start,开始采样

stop,停止采样

status,打印当前采样状态和采样文件目录

get [ParamName],获取参数值

set [ParamName] [ParamValue1] ….[ParamValueN] 设置参数值

[ParamName]可以是intervalMin, intervalMax, interval, maxFrames 或者 logPath

在生成log.hpl文件后,还需要通过其他工具才能转换为log.svg文件,当时是通过开源工具hprof2flamegraph执行的这个过程。使用步骤如下:

git clone https://github.com/chengxiayan/hprof2flamegraph.git

cd hprof2flamegraph

python stackcollapse_hpl.py --discard-lineno --discard-thread log.hpl>log.hpl.output

./flamegraph.pl log.hpl.output>log.svg

其中python版本需要2.7以上,windows上安装了ActivePerl以后也可以通过执行

perl ./flamegraph.pl log.hpl.output>log.svg

来完成第二步转换过程。

关于采样工具的选取,可以看看文章 Evaluating the Accuracy of Java Profilers,这里面列举了xprof,hprof,jprofile和yourkit四种采样器,并通过几个压测场景证明了这几种采样器的结果是相互矛盾的。总结的原因有三点: 1. 采样器采样点不够随机,这几种采样器都只有在safe point采样; 2. 不同的采样器会注入不同的代码,从而影响程序优化过程,同时也影响了safe point的分布,进一步造成采样差异; honest-profiler号称是避开了通过SUN/Oracle management agent去采样堆栈,而是使用自己实现的使用UNIX 操作系统信号和为Oracle Performance Studio 设计的内部API的sampling agent,从而提升了采样准确率。

java火焰评测_JAVA性能分析之使用火焰图相关推荐

  1. java visualvm 教程_Java性能分析神器--VisualVM Launcher[1]

    Java性能分析神器1--VisualVM Launcher VisualVM 当你日复一日敲代码的时候,当你把各种各样的框架集成到一起的时候,看着大功告成成功运行的日志,有没有那么一丝丝迷茫和惆怅: ...

  2. linux火焰工具,linux性能分析工具之火焰图

    一.环境 Linux jello 4.4.0-98-generic #121-Ubuntu SMP Tue Oct 10 14:24:03 UTC 2017 x86_64 x86_64 x86_64 ...

  3. 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选

    Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ...

  4. java dump分析工具_java性能分析与常用工具

    本次源码已放在Github:https://github.com/nateshao/jvm-tuning 个人博客 https://nateshao.gitee.io http://www.nates ...

  5. java dump分析工具_Java 性能分析工具 (2):Java 内置监控工具

    引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...

  6. java性能分析工具_java性能分析工具

    如何利用 JConsole观察分析Java程序的运行,进行排错调优 http://jiajun.iteye.com/blog/810150 如何使用JVisualVM进行性能分析 http://jia ...

  7. i27岁转行java,JavaTM I/O 性能分析[转]

    JavaTM I/O 性能分析[转] 上一篇 / 下一篇  2008-07-30 13:04:44 / 个人分类:Zee的生活 这篇文章讨论和阐明了提供 JavaTM I/O 性能的多种设计问题,例如 ...

  8. java split()方法_Java 性能优化的 50 个细节(珍藏版)

    作 者:Java杂记 来 源:yq.aliyun.com/articles/662001 在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...

  9. Linux Perf性能分析常用手段(火焰图,gprof,kernelshark)

    系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化.性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码.代码优化的目标是针对具体性能问题而优化 ...

最新文章

  1. php 清除之前echo_PHP入门读书笔记(三): 常量和变量
  2. Linux脚本自动安装软件,一个快速自动安装Apache及其相关软件的Shell脚本
  3. ie浏览器怎样查看html,查看IE浏览器历史记录的方法
  4. spring之二——使用maven创建一个java project
  5. 关于ViewDidUnload
  6. k8s核心技术-Pod(健康检查)_健康检查的方式_以及pod崩溃后如何处理---K8S_Google工作笔记0023
  7. Flutter 成功在鸿蒙上运行;微信 8.0 发布;支付宝和微信支付达到反垄断标准 | 极客头条...
  8. 记OC迁移至swift中笔记20tips
  9. 6.go import
  10. 虚拟机RedHat9.0挂载U盘
  11. 阿里代码规范检查工具的安装使用以及阿里代码格式化
  12. JMeter中BeanShell的使用方法和常用语法
  13. 模COMSOL Multiphysics v5.3 Win64 Linux64 MacOSX64 1DVD
  14. 对996的一些看法与个人价值实现
  15. 港交所、中芯国际、京东、诺基亚等公司高管变动
  16. 线性方程组的几种解法以及解的性质和结构
  17. android 添加蒙版实现护眼模式(夜间模式)
  18. VSFTP一键部署脚本
  19. 解决File Cache Conflict
  20. android:使用small一步步实现插件化与热更新

热门文章

  1. 《卓有成效程序员》第四章
  2. arduino uno模拟遥控器控制无刷电机
  3. Hive 外部表的练习(多表关联查询,以及分组,子查询)
  4. vue表格闪动 xn-table
  5. 大计划,大安排(一)
  6. idea提交本地项目到oschina
  7. 常用数据库有哪些(附带数据库排名)?
  8. 一种技能的形成有哪些阶段?
  9. java 中文转码_java 下载文件中文名称转码详解
  10. 【OR】二次规划(2):SCA方法