您好,登錄后才能下訂單哦!
最近組內(nèi)一些Go服務(wù)碰到內(nèi)存相關(guān)的問題,所以今天抽時間看了下Go pprof內(nèi)存指標(biāo)的含義,為后續(xù)查問題做準(zhǔn)備。
內(nèi)容主要來自于Go代碼中對這些字段的注釋,加自己的理解。理解不對的地方歡迎指正。
// https://github.com/golang/go/blob/master/src/runtime/mstats.go#L150
// 總共從OS申請的字節(jié)數(shù)
// 是下面各種XxxSys指標(biāo)的總和。包含運行時的heap、stack和其他內(nèi)部數(shù)據(jù)結(jié)構(gòu)的總和。
// 它是虛擬內(nèi)存空間。不一定全部映射成了物理內(nèi)存。
Sys// 見`Sys`
HeapSys// 還在使用的對象,以及不使用還沒被GC釋放的對象的字節(jié)數(shù)
// 平時應(yīng)該平緩,gc時可能出現(xiàn)鋸齒
HeapAlloc// 正在使用的對象字節(jié)數(shù)。
// 有個細(xì)節(jié)是,如果一個span中可包含多個object,只要一個object在使用,那么算的是整個span。
// `HeapInuse` - `HeapAlloc`是GC中保留,可以快速被使用的內(nèi)存。
HeapInuse// 已歸還給OS的內(nèi)存。沒被堆再次申請的內(nèi)存。
HeapReleased// 沒被使用的span的字節(jié)數(shù)。
// 這部分內(nèi)存可以被歸還給OS,并且還包含了`HeapReleased`。
// 可以被再次申請,甚至作為棧內(nèi)存使用。
// `HeapIdle` - `HeapReleased`即GC保留的。
HeapIdle/// ---
// 和`HeapAlloc`一樣
Alloc// 累計的`Alloc`
// 累計的意思是隨程序啟動后一直累加增長,永遠(yuǎn)不會下降。
TotalAlloc// 沒什么卵用
Lookups = 0// 累計分配的堆對象數(shù)
Mallocs// 累計釋放的堆對象數(shù)
Frees// 存活的對象數(shù)。見`HeapAlloc`
// HeapObjects = `Mallocs` - `Frees`
HeapObjects// ---
// 下面的XxxInuse中的Inuse的含義,和XxxSys中的Sys的含義,基本和`HeapInuse`和`HeapSys`是一樣的
// 沒有XxxIdle,是因為都包含在`HeapIdle`里了// StackSys基本就等于StackInuse,再加上系統(tǒng)線程級別的棧內(nèi)存
Stack = StackInuse / StackSys// 為MSpan結(jié)構(gòu)體使用的內(nèi)存
MSpan = MSpanInuse / MSpanSys// 為MCache結(jié)構(gòu)體使用的內(nèi)存
MCache = MCacheInuse / MCacheSys// 下面幾個都是底層內(nèi)部數(shù)據(jù)結(jié)構(gòu)用到的XxxSys的內(nèi)存統(tǒng)計
BuckHashSys
GCSys
OtherSys// ---
// 下面是跟GC相關(guān)的// 下次GC的觸發(fā)閾值,當(dāng)HeapAlloc達到這個值就要GC了
NextGC// 最近一次GC的unix時間戳
LastGC// 每個周期中GC的開始unix時間戳和結(jié)束unix時間戳
// 一個周期可能有0次GC,也可能有多次GC,如果是多次,只記錄最后一個
PauseNs
PauseEnd// GC次數(shù)
NumGC// 應(yīng)用程序強制GC的次數(shù)
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
下面隨便找個服務(wù)來練手。
Top查看程序的 VIRT 約為2.4G, RES 約為1.7G。
使用web pprof觀察到的指標(biāo),可以對應(yīng)著前文說的含義看看。
# 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億對象數(shù)
# Frees = 2901808898 ~29億對象數(shù)
# HeapObjects = 6010490 ~601萬對象數(shù)# Stack = 33390592 / 33390592 ~31.8M / 31.8M
# MSpan = 13542744 / 19906560 ~12.9M / 18.9M
# MCache = 55552 / 65536
# BuckHashSys = 2371870
# GCSys = 69398992
# OtherSys = 6768602
總結(jié)
到此這篇關(guān)于Go pprof內(nèi)存指標(biāo)含義備忘錄及案例分析的文章就介紹到這了,更多相關(guān)Go pprof內(nèi)存指標(biāo)內(nèi)容請搜索億速云以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持億速云!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。