写点什么

Java 火焰图在 Netflix 的实践

  • 2015-08-04
  • 本文字数:1672 字

    阅读完需:约 5 分钟

为了分析不同软件或软件的不同版本使用 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 读者交流群)。

2015-08-04 06:518994
用户头像

发布了 268 篇内容, 共 134.3 次阅读, 收获喜欢 24 次。

关注

评论

发布
暂无评论
发现更多内容

娄底携手浪潮,打造了智慧城市建设的“娄底样板”

八大案例带你了解图数据库如何洞察数据间关联价值

NebulaGraph

图数据库 图数据库实战

使用 async_hooks 模块进行请求追踪

智联大前端

node.js 大前端 koa async_hooks

不可忽视的PHP数据精度损失问题

架构精进之路

php 七日更 28天写作

智能building 之智慧城市

张老蔫

28天写作

30+岁、没转管理、加不动班,我的竞争力从哪里来?

博文视点Broadview

云原生架构下复杂工作负载混合调度的思考与实践

星环科技

云计算

毫不留情地揭开负载均衡的真面目~

田维常

负载均衡

并发条件队列之Condition 精讲

伯阳

AQS 多线程 lock Condition 条件队列

2021分享三面阿里:Java面试核心手册+Java电子书+技术笔记+学习视频

比伯

Java 编程 架构 面试 程序人生

架构师训练营-大作业:物流系统架构设计

晴空万里

架构师训练营第2期

红帽架构师:为什么KubeEdge是2020年我最喜欢的开源项目?

华为云原生团队

开源 云原生 边缘计算 边缘技术

面试官常问的垃圾回收器,这次全搞懂

Silently9527

Java JVM 垃圾回收 GC

Android Styling System

Changing Lin

android

2021年1月国产数据库排行榜:OceanBase重回前三,TDSQL增长趋势最强劲!

墨天轮

数据库

第二周作业

Geek_6a8931

屏幕共享功能的应用

anyRTC开发者

android 音视频 WebRTC 在线教育 视频会议

【并发编程的艺术】内存语义分析:volatile、锁与CAS

程序员架构进阶

Java 架构 Java内存模型 28天写作

计算机网络学习第一课

落曦

从定义到AST及其遍历方式,一文带你搞懂Antlr4

华为云开发者联盟

Java AST 语言 antlr4 语法分析器

【图文并茂,点赞收藏哦!】重学巩固你的Vuejs知识体系

我是哪吒

程序员 面试 Vue 大前端 Web

数据库覆盖式数据导入方法:部分和完全

华为云开发者联盟

数据库 sql 数据 DWS 覆盖式导入

趋势预测:2021年五大流行的编程语言

禅道项目管理

Java php python 爬虫 趋势

Elasticsearch和Kibana变更开源许可协议;Facebook利用AI增强为视障人士描述照片能力

京东科技开发者

云计算

【年度重磅】2020华为云社区年度技术精选合集,700页+免费下载!

华为云开发者联盟

数据库 AI 云原生 物联网 华为云

Kubernetes Pod篇:带你轻松玩转Pod

xcbeyond

Kubernetes pod 28天写作 Kubernetes从入门到精通 服务编排

开发的必杀技:Git 的分支管理

华为云开发者联盟

git Linux 分支

甲方日常 90

句子

工作 随笔杂谈 日常

《Java 面经手册》PDF,全书5章29节,417页11.5万字,完稿&发版!

小傅哥

Java 面试 小傅哥 PDF 面经手册

转角遇上Volcano,看HPC如何应用在气象行业

华为云开发者联盟

容器 云原生 HPC Volcano 批量计算

区块链养成宠物游戏开发动物世界app系统搭建方案

v16629866266

Java火焰图在Netflix的实践_Java_张天雷_InfoQ精选文章