转发 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: 正在敲代码实现业务功能 ...
随机推荐
- R-模式(mode)和类(class)
数据模式:mode函数显示任何对象的模式.常见的单个的对象模式是逻辑型(Logical).数值型(Numeric).字符型(Character). 常用到的数据模式是列表(list). 逻辑型:TRU ...
- C++(三十二) — 常对象、常成员变量、常成员函数
常量:对于既需要共享.又需要防止改变的数据.在程序运行期间不可改变. const 修饰的是对象中的 this 指针.所以不能被修改. 1.常对象 数据成员值在对象的整个生存期内不能改变.在定义时必须初 ...
- 用Qt写了一个qq客户端,采用webqq协议,发出来和大家分享一下---大神请无视
首先做以下声明: 本程序基于腾讯公司的webqq协议开发,所有相关版权归腾讯公司所有.此程序只用于技术交流和学习,不得用于其他方面. ---开发者:雨后星辰,转载请注明出处:http://www.cn ...
- linux下使用FreeRDP 连接 Windows 远程桌面
linux下使用FreeRDP 连接 Windows 远程桌面 简介 FreeRDP 是一款开源的远程桌面系统,支持多种平台, 在 ubuntu 中使用 FreeRDP 可以很方便的登录到 win ...
- hdu 1517 A Multiplication Game 段sg 博弈 难度:0
A Multiplication Game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- Jxl的API概述(转)
一.Jxl的API Jxl的API主要有三个包,jxl,jxl.format,jxl.write.如果单独的分析API,可能对于更明确的了解此API没有太多的帮助,我们还是从Excel文件的层次来剥离 ...
- Js 日期选择,可以的一个页面中重复使用本JS日历,兼容IE及火狐等主流浏览器,而且界面简洁、美观,操作体验也不错。
<html> <head> <title>Js日期选择器并自动加入到输入框中</title> <meta http-equiv="con ...
- 记用ajax网页跳转大坑——后台执行了,但是没有跳转
搭建javaweb服务器的时候,把jsp文件放在WEB-INF目录下面,因为超链接不能所有只能通过拦截器,用do方法跳转 controller写的是对的: @Controller public cla ...
- FCT test device
- vue.js 源代码学习笔记 ----- Dep
/* @flow */ import type Watcher from './watcher' import { remove } from '../util/index' let uid = 0 ...