我正在分析Java服务器。我正在看火焰图:http://www.brendangregg.com/flamegraphs.html。关于如何解释火焰轮廓,我有几个问题。 我是Java新手,所以它们听起来很基础。
1)在配置文件中,我观察到的顶部框架libjvm_so占用了38.6%的cpu。这在Java进程和服务器中正常吗?这个共享库究竟是什么?通常需要花费大量的处理时间?
2)函数/堆栈取x%是什么意思。这是相对的还是绝对的?按进程占总CPU使用量的x%或x%cpu。这使我想到第二个问题,当我比较2个火焰图时,是否通过该过程的所有CPU使用率进行了归一化?也就是说,如果一种方法在一个配置文件中占10%,在另一个配置文件中占15%,这是否意味着该函数实际上消耗了更多的cpu。还是可能是初始过程中总体cpu使用率为50%,而在第二个过程中cpu使用率为30%,所以从绝对角度来说,第二个配置文件显示该函数的cpu使用率降低了。 (50%的10%大于30%的15%)。
答案 0 :(得分:0)
对于问题1:
我认为libjvm.so包括花在编译和垃圾回收上的时间。如果该进程的CPU使用率很高并且该进程已经运行了一段时间,那么通常不会在libjvm.so中花费大量的CPU时间,因此可能表明某个进程在GC或编译中花费的时间比预期的要多。如果在启动过程时收集了配置文件(因此将更多的时间用于编译),则可能会发生。
问题2:
火焰图中的百分比通常是指该进程使用的总CPU的百分比。因此,如果配置文件显示的CPU时间总计为5s,则使用1s CPU时间的方法将显示为使用了所用所有CPU时间的20%。
由Stackdriver Profiler收集的CPU概要文件将在10s的持续时间内收集,并且可以用来了解进程使用的CPU百分比。例如,当进程使用约50%的CPU时,收集的配置文件总计为5s。
对于Stackdriver Profiler中的配置文件比较,火焰图由两个配置文件中CPU使用率之间的绝对差异来着色。提示中同时报告了绝对差异和总计百分比的差异。
here记录了火焰图的高级概述。
(披露:我在Google上使用Stackdriver Profiler工作)