BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Java火焰图在Netflix的实践

| 作者 张天雷 关注 4 他的粉丝 发布于 2015年8月5日. 估计阅读时间: 5 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

为了分析不同软件或软件的不同版本使用CPU的情况,相关设计人员通常需要进行函数的堆栈性能分析。相比于定期采样获得数据的方式,利用定时中断来收集程序运行时的PC寄存器值、函数地址以及整个堆栈轨迹更加高效。目前,OProfilegprofSystemTap等工具都是采用该方法,给出详细的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和其他工程师的努力,最新的JDK9JDK8已经增加了该选项,从而保存了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读者交流群InfoQ好读者)。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT