【问题标题】:Interpreting pprof heap diagrams解释 pprof 堆图
【发布时间】:2016-03-08 15:26:08
【问题描述】:

当我使用 pprof 分析堆时,我得到以下信息:

但是,我不清楚如何解释该可视化。特别是:

“箭头旁边的记忆意思是_____,盒子里面的记忆意思是______。所以当一个盒子有多个箭头时,它意味着_____,当它有多个箭头时,它意味着_____”。

【问题讨论】:

  • 哦,上下文是这个二进制文件的一个实例正在慢慢泄漏内存。我有这张快照,我会在几个小时内再抓一张,比较一下。除非事实证明泄漏不在堆中,否则我不确定下一步该做什么。
  • 由于 Go 具有精确的 GC,“泄漏”几乎总是涉及没有返回的 goroutine。堆栈跟踪通常比堆配置文件更有用。
  • @JimB 虽然我监控了 goroutines 的数量(讽刺的是,使用的是慢慢消耗更多内存的东西),并且routines 的数量是稳定的。

标签: go pprof heap-profiling


【解决方案1】:
  1. 此函数的感知累积内存消耗包括其所有子函数
  2. 此函数排除其所有子函数的感知内存消耗
  3. 它调用多个子函数
  4. 多个函数调用它

堆和CPU分析模式之间箭头的含义没有区别。

您可能对top pprof 命令的输出感兴趣,它可以为您提供以下形式的结果:

9701.61kB of 9701.61kB total (  100%) Dropped 112 nodes (cum <=
48.51kB) Showing top 10 nodes out of 29 (cum >= 3611.54kB)
      flat  flat%   sum%        cum   cum%
 4549.72kB 46.90% 46.90%  4549.72kB 46.90%  mystery.function
 2587.52kB 26.67% 73.57%  2587.52kB 26.67%  reflect.unsafe_NewArray
 1024.02kB 10.56% 84.12%  1024.02kB 10.56%  encoding/xml.copyValue
     514kB  5.30% 89.42%      514kB  5.30%  compress/gzip.NewReader
     514kB  5.30% 94.72%      514kB  5.30%  net/http.(*Transport).dialConn
  512.34kB  5.28%   100%   512.34kB  5.28%  runtime.makeslice
         0     0%   100%      514kB  5.30%  bytes.(*Buffer).ReadFrom
         0     0%   100%  3611.54kB 37.23%  encoding/xml.(*Decoder).Decode
         0     0%   100%  3611.54kB 37.23%  encoding/xml.(*Decoder).DecodeElement
         0     0%   100%  3611.54kB 37.23%  encoding/xml.(*Decoder).unmarshal

以下是(恕我直言)使用 pprof 进行 Go 堆分析的两个最佳参考:

  1. https://google-perftools.googlecode.com/svn/trunk/doc/heapprofile.html
  2. https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs

【讨论】:

    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多