• Java程序性能定位工具-火焰图


    Java程序性能定位工具-火焰图

    前言

    Java火焰图是一种新的查看CPU利用率方式。今天就带大家一起使用来自Google大神的工具来生成火焰图。火焰图非常的直观,问题一目了然,希望有一天它能成为JAVA标准性能调优工具里面的一员。

    下图所示的就是一个火焰图的样子。在这里附上一个地址,感性的同学可以打开这个地址体验下火焰图的动态效果。地址是:http://www.brendangregg.com/blog/images/2014/cpu-vertx-flamegraph.svg

    clip_image002

    在这里解释下图的看法,Y轴表示栈的深度,X轴的宽度表示样本的数量。每一个长方形表示一个栈的窗口。请注意,火焰图中的颜色不重要,只是为了方便观看,没有任何实际的意义。从左到右的顺序也无关紧要。

    火焰图第一步-性能数据采集

    使用lightweight-java-profiler这个开源的工具来收集CPU性能数据。目前这个工具还没有做到开箱即用的能力,因此需要自己动手来搞定。

    1. 需要linux环境。

    如果你的linux环境下没有git客户端,可以在其他机器上checkout出来工程,然后复制过来。

    打包过程中还需要make工具,这个需要自己安装。

    2. Checkout工程。

    https://github.com/dcapwell/lightweight-java-profiler.git

    3. 定制Makefile

    根据你操作系统的情况,需要修改工程目录下的Makefile文件。在这里主要有两个地方需要修改:一是操作系统位数;二是要包含的路径。

    4c4

    < BITS?=32

    ---

    > BITS?=64

    49c49

    < INCLUDES=-I$(JAVA_HOME)/$(HEADERS) -I$(JAVA_HOME)/$(HEADERS)/$(UNAME)

    ---

    > INCLUDES=-I$(JAVA_HOME)/$(HEADERS) -I$(JAVA_HOME)/$(HEADERS)/$(UNAME) -I/usr/include/x86_64-linux-gnu

    按照我的经验,只需要修改BITS参数即可,另外一个参数可不修改。

    4. 定制性能采集参数

    你可以按照自己的喜好去修改lightweight-java-profiler中的源代码来达到定制的目的。参数修改主要在src/globals.h文件中,下面就列出几个值得关注的地方:

    // 每秒采集次数

    static const int kNumInterrupts = 100;

    // 追踪的栈的最大深度

    static const int kMaxStackTraces = 3000;

    // 栈的最大采集窗口数

    static const int kMaxFramesToCapture = 128;

    5. 编译软件

    执行命令 make all 并等待结束。

    6. 安装到你的工程中

    将工程下面的结果输出目录uild-{BITS}下面的liblagent.so文件拷贝到和你要测试的工程的同台机器上并记下路径。在JAVA启动命令中加入如下参数:

    -agentpath:{按实际路径填写}/liblagent.so

    7. 运行你的工程

    运行你的工程并对你的业务进行一些操作,一段时间后停止你的业务。注意:如果使用kill命令停止进程一定不要加额外的参数,使用 kill {进程号}即可,CPU采集数据会慢慢输出到工程当前目录,输出完成后进行停止。输出的文件名一般为:traces.txt

    火焰图第二步-生成火焰图

    这一步是基于上一步的traces.txt文件进行的。这个工具依赖于perl,因此开始之前请安装perl。

    1. 克隆火焰图工具

    git clone http://github.com/brendangregg/FlameGraph

    cd FlameGraph

    2. 生成火焰图

    使用如下的命令生成火焰图:

    ./stackcollapse-ljp.awk < ../traces.txt | ./flamegraph.pl > ../traces.svg

    其中第一个参数标识输入的性能数据文件的路径,第二个参数表示生成的火焰图文件的输出路径。

    总结

    火焰图对性能是有影响的,合理的调整参数对发现问题是有帮助的。

  • 相关阅读:
    10K8S之pod网络插件Flannel和canel(网络策略)
    04K8S之pod控制器
    07K8S之Statefulset控制器
    09K8S之kubernetesdashboard(addons) 认证及分级授权
    08K8S之k8s认证和serviceaccount
    12K8S之调度器、预选策略和优选函数
    14K8S之helm入门到逃跑
    13之容器资源需求、资源限制及Metricserver(Heapster)
    Vue form表单校验部分失效问题
    The error I get is: Uncaught TypeError: BACKDROP: Option "rootElement" provided type "null" but expected type "element"
  • 原文地址:https://www.cnblogs.com/rushoooooo/p/9645958.html
Copyright © 2020-2023  润新知