Pprof和Golang - 如何解释结果?

20

我想在我的程序中使用pprof,但是我得到的结果与我阅读的文章(下面的链接)略有不同。我的结果如下表:

(pprof) top10
1.65s of 1.72s total (95.93%)
Showing top 10 nodes out of 114 (cum >= 0.01s)
      flat  flat%   sum%        cum   cum%
     1.19s 69.19% 69.19%      1.20s 69.77%  syscall.Syscall
     0.16s  9.30% 78.49%      0.16s  9.30%  runtime._ExternalCode

这些列是什么意思:flat flat% sum% cum cum%

我在阅读的文章: https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs http://blog.golang.org/profiling-go-programs


3
格式有些不同,但数据和列仍然具有相同的意义。'flat' 表示函数中的时间,“cum”表示函数及其以下的累计时间。 - JimB
你介意把你的标题改成“在Golang pprof结果中,flat、flat%、sum%、cum、cum%是什么意思吗?”吗? - Ryan Lyu
我认为当人们搜索这类问题时,可能更容易找到。 - Ryan Lyu
2个回答

41

平铺和累加

假设有一个名为foo的函数,它由3个函数和一个直接操作组成。

func foo(){
    a()                                 step1
    b()                                 step2
    do something directly.              step3
    c()                                 step4
}

当你调用函数foo时,它需要6秒钟的时间,时间分布如下。

func foo(){
    a()                                 // step1 takes 1s
    b()                                 // step2 takes 1s
    do something directly.              // step3 takes 3s
    c()                                 // step4 takes 1s
}
  • flat指步骤3所花费的时间。
  • cum是foo的总执行时间,包括子函数调用和直接操作。(cum = step1+ step2+ step3+ step4)

sum%

当您在pprof控制台中运行top时,每行输出都表示特定函数所花费的时间。 Sum%表示之前行所花费的时间/内存。

为了解释这个度量标准,我选择另一个包含更多行的示例。第四行的sum%值为45.17%。计算方法如下:

line1 19.33%
line2 13.27%
line3 6.60%
line4 5.97%
-----------
sum% 45.17%

enter image description here

sum%的应用

sum%可以帮助您快速识别重要的问题。下面是另一个内存分配报告的示例。

您可以看到前四个函数消耗了91.06%的内存。如果我想进行一些性能调整,我应该关注前四个函数。第四个以下的所有函数都可以忽略。

enter image description here

参考资料

Reddit:golang pprof 输出中的 "flat" 和 "cum" 的含义是什么?


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接