Java火焰图在Netflix的实践
转自 http://www.infoq.com/cn/news/2015/08/java-flamegraph
亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的邮件和网页通知。
为了分析不同软件或软件的不同版本使用CPU的情况,相关设计人员通常需要进行函数的堆栈性能分析。相比于定期采样获得数据的方式,利用定时中断来收集程序运行时的PC寄存器值、函数地址以及整个堆栈轨迹更加高效。目前,OProfile、gprof和SystemTap等工具都是采用该方法,给出详细的CPU使用情况报告。然而,这些工具在处理复杂的统计数据时,给出的报告往往过于繁杂、不够直观、不能直接反应分析员所需要的数据。为此,Brendan Gregg开发了专门把采样到的堆栈轨迹(Stack Trace)转化为直观图片显示的工具——Flame Graph(火焰图)。但是,由于分析器与JDK环境等原因,Java程序的混合模式火焰图之前无法生成。近期,Brendan Gregg和Martin Spier发现了一种解决该问题的方法,在Netflix内部进行了实践,并贡献了一篇非常详尽的实践性文章。为Java程序的性能分析提供了极大便利。接下来,本文就从该问题出现的原因开始,简要介绍其解决该问题的思路和方法。
首先,本文对火焰图的概念进行简要介绍。火焰图既是一个开源工具,也是一种类型的图片。作为一个二维图片,火焰图的X轴代表采样总量,而Y轴代表栈深度。每个框就代表了一个栈里的函数,其宽度代表了所占用的CPU总时间。因此,比较宽的框就表示该函数运行时间较慢或被调用次数较多,从而占用的CPU时间多。通过火焰图,相关设计或分析人员就可以轻松观察到各个应用占用CPU的情况。
但是,火焰图本身并不具备性能检测的能力。它需要其他性能分析工具的协助。在Java环境中,一共有两种类型的堆栈轨迹采样分析器——系统分析器(System Profiler)和JVM分析器(JVM Profiler)。前者(如Linux的Perf Events)可以分析系统代码路径,包括libjvm internal、GC和内核,但并不能分析Java方法;后者(如HPROF、轻量级Java分析器和其他商业分析器)可以显示Java方法,但不能显示系统代码路径。由此可见,这两种方法都不能同时支持系统代码路径和Java方法的堆栈轨迹。而分别描述二者的火焰图又不能很好的满足需求。因此,Brendan等人一直关注如何解决该问题。
在之前的一次讨论中,Brendan曾经对系统分析器不能显示Java方法的原因进行分析。这包括两个方面——JVM编译方法时比较快,没有为系统分析器暴露一个符号表;JVM采用x86上的frame pointer作为一个通用寄存器,破坏了传统的stack walking。那么,解决之前的问题,就需要分别从这两个方面入手。对于第一个方面,Java和Linux系统的分析器进行了双方面的努力。首先,Java开始支持利用开源的JVMTI代理perf-map-agent来创建perf-PID.map文本文件。该文件列举了16进制的符号地址、大小以及符号名称。然后,从2009年以后,Linux中的Perf_events工具添加了对JIT符号的支持。该工具会检查/tmp/perf-PID.map文件,从而完成对来自语言虚拟机的符号进行检查。对于第二个方面,JVM添加了一个新的选项-XX:+PreserveFramePointer。经过Zoltán、Oracle和其他工程师的努力,最新的JDK9和JDK8已经增加了该选项,从而保存了stack walking。
在两方面的问题都解决之后,用户只要经过安装Perf Events、新版JDK、perf-map-agent以及FlameGraph等软件和配置Java(尤其是打开-XX:+PreserveFramePointer选项)的步骤后,就可以产生系统级的火焰图了。为了让产生火焰图的流程自动化,Brendan等人已经开始基于开源的实例化分析工具Vector进行流程的建模。
未来,Breden等人还计划进行很多工作。其一是通过自动化收集不同日期的差分火焰图进行规则分析。这有助于迅速理解软件变化所导致的CPU使用率变化。此外,他们还试图利用Perf Events进行磁盘IO、网络、调度以及内存分配等用户和内核级的事件记录和分析。最后,对火焰图和Vector进行实时更新等改进也是未来考虑增加的功能。
感谢徐川对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群
)。
Java火焰图在Netflix的实践的更多相关文章
- 转发 Java火焰图在Netflix的实践
为了分析不同软件或软件的不同版本使用CPU的情况,相关设计人员通常需要进行函数的堆栈性能分析.相比于定期采样获得数据的方式,利用定时中断来收集程序运行时的PC寄存器值.函数地址以及整个堆栈轨迹更加高效 ...
- Java程序性能定位工具-火焰图
Java程序性能定位工具-火焰图 前言 Java火焰图是一种新的查看CPU利用率方式.今天就带大家一起使用来自Google大神的工具来生成火焰图.火焰图非常的直观,问题一目了然,希望有一天它能成为JA ...
- java性能分析之火焰图
原由 最近因为kafka.zookeeper.ES和相关的Java应用的内存问题搞的头大,做运维将近4年,对Java调优.性能方面的知识了解的少之又少,是时候下定决心来对他多一个学习了.不能一口吃成一 ...
- 使用linux perf工具生成java程序火焰图
pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: ...
- 【初探】java性能火焰图的生成
前言 开始之前,你需要准备的环境: Linux系统机器或者虚拟机一台,里面需要安装的软件:git.jdk.perl. 简单介绍: java性能分析火焰图的所做的事情就是能够分析出java程序运行期间存 ...
- 记一次获得 3 倍性能的 go 程序优化实践,及 on-cpu / off-cpu 火焰图的使用
转自:https://mp.weixin.qq.com/s/9IKaXeWTiiQTFlvZzxgsEA 记一次获得 3 倍性能的 go 程序优化实践,及 on-cpu / off-cpu 火焰图的使 ...
- 超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下
如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然.别慌,这里有一款低开销.自带火焰图.让你大呼好用的 Java 性能分析工具 - async ...
- netflix flamescope 方便的不同时间范围的火焰图查看工具
flamescope 是netflix 开源的方便的火焰图查看工具,我们可以选择不同时间范围的数据,方便分析调用链 环境准备 使用docker-compose运行,基于官方的dockerfile 创建 ...
- 如何利用火焰图定位 Java 的 CPU 性能问题
常见 CPU 性能问题 你所负责的服务(下称:服务)是否遇到过以下现象: 休息的时候,手机突然收到大量告警短信,提示服务的 99.9 line 从 20ms 飙升至 10s: 正在敲代码实现业务功能 ...
随机推荐
- Haskell语言学习笔记(61)Distributive
Distributive class Functor g => Distributive g where distribute :: Functor f => f (g a) -> ...
- C#四舍五入说明
string.Format("{0:N2}", d) 与 Math.Round(d, 2).ToString() 不总是相等 string.Format("{0:N2}& ...
- 梯度下降法】三:学习率衰减因子(decay)的原理与Python
http://www.41443.com/HTML/Python/20161027/512492.html
- dubbo2.5.3升级到dobbo2.8.4(dubbox) jar
需要注意的地方: 1.pom文件中 dubbo的版本由2.5.3变为2.8.4,maven依赖如下: <dependency> <groupId>com ...
- mysql数据库的卸载
1.控制面板 程序和功能 卸载MySQL相关 2.卸载MySQL的安装目录 与储存目录 3.删除C盘下隐藏MySQL文件:组织-----文件夹和搜索选项-----------查看------ ...
- 使用js获取伪元素的content
在测试过程中有时候会遇到反爬虫机制,一些元素会使用伪元素,这样在定位元素的时候会定位不到,这时候就要使用js来帮助定位,获取到想要的元素 下面是部分代码 //使用js获取伪元素的content Str ...
- javascript,排列组合
输入参数 ‘abc',输出所有组合 ['abc','acb','bac','bca','cab','cba'] 思路:分为3列,第一列为 a, b,c :第二列为a,b,c出去第一列选中过后的,比如 ...
- Too Rich(贪心+DFS)
Too Rich http://acm.hdu.edu.cn/showproblem.php?pid=5527 Time Limit: 6000/3000 MS (Java/Others) Me ...
- 模块常用snippet
压缩,文件操作,数据库,md5,json, 压缩 import os, sys, time import zipfile # 解压 filename = 'callofdutyblackopszomb ...
- vue2.0 element学习
1,bootstrap和vue2.0结合使用 vue文件搭建好后,引入jquery和bootstrap 我采用的方式为外部引用 在main.js内部直接导入 用vue-cli直接安装jquery和bo ...