• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Go pprof内存指标含义备忘录及案例分析

    最近组内一些Go服务碰到内存相关的问题,所以今天抽时间看了下Go pprof内存指标的含义,为后续查问题做准备。

    内容主要来自于Go代码中对这些字段的注释,加自己的理解。理解不对的地方欢迎指正。

    // https://github.com/golang/go/blob/master/src/runtime/mstats.go#L150

    // 总共从OS申请的字节数
    // 是下面各种XxxSys指标的总和。包含运行时的heap、stack和其他内部数据结构的总和。
    // 它是虚拟内存空间。不一定全部映射成了物理内存。
    Sys

    // 见`Sys`
    HeapSys

    // 还在使用的对象,以及不使用还没被GC释放的对象的字节数
    // 平时应该平缓,gc时可能出现锯齿
    HeapAlloc

    // 正在使用的对象字节数。
    // 有个细节是,如果一个span中可包含多个object,只要一个object在使用,那么算的是整个span。
    // `HeapInuse` - `HeapAlloc`是GC中保留,可以快速被使用的内存。
    HeapInuse

    // 已归还给OS的内存。没被堆再次申请的内存。
    HeapReleased

    // 没被使用的span的字节数。
    // 这部分内存可以被归还给OS,并且还包含了`HeapReleased`。
    // 可以被再次申请,甚至作为栈内存使用。
    // `HeapIdle` - `HeapReleased`即GC保留的。
    HeapIdle

    /// ---

    // 和`HeapAlloc`一样
    Alloc

    // 累计的`Alloc`
    // 累计的意思是随程序启动后一直累加增长,永远不会下降。
    TotalAlloc

    // 没什么卵用
    Lookups = 0

    // 累计分配的堆对象数
    Mallocs

    // 累计释放的堆对象数
    Frees

    // 存活的对象数。见`HeapAlloc`
    // HeapObjects = `Mallocs` - `Frees`
    HeapObjects

    // ---
    // 下面的XxxInuse中的Inuse的含义,和XxxSys中的Sys的含义,基本和`HeapInuse`和`HeapSys`是一样的
    // 没有XxxIdle,是因为都包含在`HeapIdle`里了

    // StackSys基本就等于StackInuse,再加上系统线程级别的栈内存
    Stack = StackInuse / StackSys

    // 为MSpan结构体使用的内存
    MSpan = MSpanInuse / MSpanSys

    // 为MCache结构体使用的内存
    MCache = MCacheInuse / MCacheSys

    // 下面几个都是底层内部数据结构用到的XxxSys的内存统计
    BuckHashSys
    GCSys
    OtherSys

    // ---
    // 下面是跟GC相关的

    // 下次GC的触发阈值,当HeapAlloc达到这个值就要GC了
    NextGC

    // 最近一次GC的unix时间戳
    LastGC

    // 每个周期中GC的开始unix时间戳和结束unix时间戳
    // 一个周期可能有0次GC,也可能有多次GC,如果是多次,只记录最后一个
    PauseNs
    PauseEnd

    // GC次数
    NumGC

    // 应用程序强制GC的次数
    NumForcedGC

    // GC总共占用的CPU资源。在0~1之间
    GCCPUFraction

    // 没被使用,忽略就好
    DebugGC

    查看方式

    // 方式一
    import "runtime"

    var m runtime.MemStats
    runtime.ReadMemStats(m)
    // 方式二
    import _ "net/http/pprof"
    import "net/http"
    http.ListenAndServe("0.0.0.0:10001", nil)
    // http://127.0.0.1:10001/debug/pprof/heap?debug=1

    下面随便找个服务来练手。

    Top查看程序的 VIRT 约为2.4G, RES 约为1.7G。

    使用web pprof观察到的指标,可以对应着前文说的含义看看。

    # Sys = 1842916040 ~1.7G
    # HeapSys = 1711013888 ~1.6G
    # HeapInuse = 1237483520 ~1.18G
    # HeapAlloc = 1195472528 ~1.14G
    HeapInuse - HeapAlloc = 40M
    # HeapIdle = 473530368 ~451M
    # HeapReleased = 61063168 ~58.2M
    HeapIdle - HeapReleased = 393M

    # Alloc = 1195472528 ~1.14G
    # TotalAlloc = 426616278424 ~397.3G

    # Lookups = 0
    # Mallocs = 2907819388 ~29亿对象数
    # Frees = 2901808898 ~29亿对象数
    # HeapObjects = 6010490 ~601万对象数

    # Stack = 33390592 / 33390592 ~31.8M / 31.8M
    # MSpan = 13542744 / 19906560 ~12.9M / 18.9M
    # MCache = 55552 / 65536
    # BuckHashSys = 2371870
    # GCSys = 69398992
    # OtherSys = 6768602

    总结

    到此这篇关于Go pprof内存指标含义备忘录及案例分析的文章就介绍到这了,更多相关Go pprof内存指标内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • golang切片内存应用技巧详解
    • 解决golang内存溢出的方法
    • Go语言中的内存布局详解
    • go语言中切片与内存复制 memcpy 的实现操作
    上一篇:Go语言中如何确保Cookie数据的安全传输
    下一篇:如何用golang运行第一个项目
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Go pprof内存指标含义备忘录及案例分析 pprof,内存,指标,含义,备忘录,