转发 Java火焰图在Netflix的实践
为了分析不同软件或软件的不同版本使用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进行实时更新等改进也是未来考虑增加的功能。
转发 Java火焰图在Netflix的实践的更多相关文章
- Java火焰图在Netflix的实践
转自 http://www.infoq.com/cn/news/2015/08/java-flamegraph 亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要 ...
- 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: 正在敲代码实现业务功能 ...
随机推荐
- 13.LockSupport工具
1. LockSupport简介 在之前介绍AQS的底层实现,已经在介绍java中的Lock时,比如ReentrantLock,ReentReadWriteLocks,已经在介绍线程间等待/通知机制使 ...
- docker下rabbitMQ高可用集群部署
第一步:docker 安装: mac 下安装命令: brew cask install docker 安装完之后查看版本 docker --version 第二步:开始集群搭建: 采用bijukunj ...
- struts.xml中的配置常量的含义
struts.serve.static.browserCache 该属性设置浏览器是否缓存静态内容.当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false. stru ...
- 【51nod-1042】数字0-9的数量
给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. Inp ...
- LeetCode OJ:Maximal Rectangle(最大矩形)
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...
- 【WebGL】3. 相机
相机的种类:WebGL中的相机有两种:正投影相机和透视相机 1. 正投影相机OrthographicCamera:类似于工程图纸中的视角,忽略远近距离,远近的物体比例不变,多用于科学研究,工程图纸的应 ...
- c# JScriptProvider包装
using System; using System.CodeDom.Compiler; using System.Reflection; using System.Web.UI; using Mic ...
- css hover伪类选择器与JQuery hover()方法
css hover伪类选择器 它属于anchor伪类 在支持 CSS 的浏览器中,<a>标签链接的不同状态都可以以不同的方式显示,常常用来改链接的颜色效果 实例 a:link {color ...
- linux下awk内置函数的使用(split/substr/length)
一.split 初始化和类型强制 awk的内建函数split允许你把一个字符串分隔为单词并存储在数组中.你可以自己定义域分隔符或者使用现在FS(域分隔符)的值.格式: split (strin ...
- HDU 1033
http://acm.hdu.edu.cn/showproblem.php?pid=1033 这题的题干说的很绕,结合样例不难理解题意,走折线,A代表顺时针,V代表逆时针,给一个包含A和V的字符串,输 ...