我正在分析java服务器。我正在看火焰图表:http://www.brendangregg.com/flamegraphs.html。我有几个关于如何解释火焰轮廓的问题。我是java的新手,所以它们听起来可能非常基础。
1)在配置文件中,我观察到的顶部帧libjvm_so占用了38.6%的cpu。这在java进程和服务器中是正常的吗?这个共享对象到底是什么?它通常需要这么多的处理吗?
2)函数/栈取x%意味着什么。这是相对的还是绝对的?按进程划分的总cpu使用率的x%或x% cpu。这就引出了我的第二个问题,当我比较两个火焰图时,比较是否按进程的所有cpu使用率进行了标准化?也就是说,如果一个方法在一个配置文件中占用10%,在另一个配置文件中占用15%,这是否意味着该函数实际上消耗了更多的cpu。或者,在最初的进程中,总体cpu使用率是50%,但在第二个进程中,cpu使用率是30%,因此从绝对值来看,第二个配置文件显示函数的cpu使用率降低了。( 50%的10%大于30%的15% )。
发布于 2019-06-12 01:38:36
对于问题1:
我认为libjvm.so包括了编译和垃圾收集所花费的时间。如果进程的CPU利用率很高,并且进程已经运行了一段时间,那么在libjvm.so中花费大量CPU时间通常不是预期的,因此可能表示进程在GC或编译上花费的时间比预期的要多。如果概要文件是在进程启动时收集的(因此将更多的时间花在编译上),则可能会出现这种情况。
对于问题2:
火焰图中的百分比通常指的是进程使用的CPU总量的百分比。因此,如果配置文件显示总CPU时间为5s,则使用1s CPU时间的方法将显示为使用所有CPU时间的20%。
Stackdriver Profiler收集的CPU配置文件是在10秒的持续时间内收集的,可以用来了解进程使用的CPU百分比。例如,当进程使用大约50%的CPU时,收集的配置文件总时间为5秒。
对于Stackdriver Profiler中的配置文件比较,火焰图根据两个配置文件中CPU使用率的绝对差异进行着色。工具提示中报告了绝对差异和占总数百分比的差异。
火焰图的高级概述记录在here中。
(披露:我在谷歌从事Stackdriver Profiler的工作)
https://stackoverflow.com/questions/52014377
复制相似问题