关于golang:golangpprof内存指标

36次阅读

共计 2077 个字符,预计需要花费 6 分钟才能阅读完成。

最近组内一些 Go 服务碰到内存相干的问题,所以明天抽时间看了下 Go pprof 内存指标的含意,为后续查问题做筹备。
内容次要来自于 Go 代码中对这些字段的正文,加本人的了解。了解不对的中央欢送斧正。

// https://github.com/golang/go/…

// 总共从 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

好,后续遇到内存有问题的案例,再来补充。

正文完
 0