1

我正在分析 java 服务器。我正在查看火焰图:http ://www.brendangregg.com/flamegraphs.html 。我有几个关于如何解释火焰轮廓的问题。我是 Java 新手,所以它们可能听起来很基础。

1) 在配置文件中,我观察到的顶部框架 libjvm_so 占用 38.6% cpu。这在java进程和服务器中正常吗?这个共享对象到底是什么?通常需要这么多处理吗?

2)函数/堆栈占用 x% 意味着什么。这是相对的还是绝对的?进程或 x% cpu 占总 cpu 使用量的 x%。这让我想到了第二个问题,当我比较 2 个火焰图时,是否通过进程的所有 cpu 使用情况进行了比较标准化?也就是说,如果一种方法在一个配置文件中占用 10% 而在另一个配置文件中占用 15%,这是否意味着该函数实际上正在消耗更多的 cpu。或者可能是初始进程的总体 cpu 使用率为 50% 但在第二个进程中 cpu 使用率为 30% 的情况,因此从绝对意义上讲,第二个配置文件显示该函数的 cpu 使用率降低。(50% 的 10% 大于 30% 的 15%)。

4

1 回答 1

1

对于问题 1:

我认为 libjvm.so 包括花费在编译和垃圾收集上的时间。如果进程的 CPU 使用率很高,并且进程已经运行了一段时间,通常可能不会在 libjvm.so 中花费大量 CPU 时间,因此可能表明进程在 GC 或编译中花费的时间比预期的要多。如果在进程启动时收集了配置文件(因此有更多时间用于编译),这可能是预期的。

对于问题 2:

火焰图中的百分比通常是指进程使用的总 CPU 的百分比。因此,如果配置文件显示总 CPU 时间为 5 秒,则使用 1 秒 CPU 时间的方法将显示为使用所有 CPU 时间的 20%。

Stackdriver Profiler 收集的 CPU 配置文件在 10 秒内收集,可用于了解进程使用的 CPU 百分比。例如,当进程使用约 50% 的 CPU 时,会收集总计 5 秒的配置文件。

对于 Stackdriver Profiler 中的配置文件比较,火焰图由两个配置文件中 CPU 使用率之间的绝对差异着色。工具提示中报告了绝对差异和总数百分比差异。

此处记录了火焰图的高级概述。

(披露:我在 Google 从事 Stackdriver Profiler 工作)

于 2019-06-11T17:38:36.483 回答