mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: make distributed/local malloc stats the source-of-truth
This change makes it so that various local malloc stats (excluding heap_scan and local_tinyallocs) are no longer written first to mheap fields but are instead accessed directly from each mcache. This change is part of a move toward having stats be distributed, and cleaning up some old code related to the stats. Note that because there's no central source-of-truth, when an mcache dies, it must donate its stats to another mcache. It's always safe to donate to the mcache for the 0th P, so do that. Change-Id: I2556093dbc27357cb9621c9b97671f3c00aa1173 Reviewed-on: https://go-review.googlesource.com/c/go/+/246964 Trust: Michael Knyszek <mknyszek@google.com> Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Michael Pratt <mpratt@google.com>
This commit is contained in:
parent
ce46f197b6
commit
42019613df
5 changed files with 68 additions and 37 deletions
|
|
@ -339,18 +339,28 @@ func ReadMemStatsSlow() (base, slow MemStats) {
|
|||
|
||||
// Add in frees. readmemstats_m flushed the cached stats, so
|
||||
// these are up-to-date.
|
||||
var smallFree uint64
|
||||
slow.Frees = mheap_.nlargefree
|
||||
for i := range mheap_.nsmallfree {
|
||||
slow.Frees += mheap_.nsmallfree[i]
|
||||
bySize[i].Frees = mheap_.nsmallfree[i]
|
||||
bySize[i].Mallocs += mheap_.nsmallfree[i]
|
||||
smallFree += mheap_.nsmallfree[i] * uint64(class_to_size[i])
|
||||
var largeFree, smallFree uint64
|
||||
for _, p := range allp {
|
||||
c := p.mcache
|
||||
if c == nil {
|
||||
continue
|
||||
}
|
||||
// Collect large allocation stats.
|
||||
largeFree += uint64(c.local_largefree)
|
||||
slow.Frees += uint64(c.local_nlargefree)
|
||||
|
||||
// Collect per-sizeclass stats.
|
||||
for i := 0; i < _NumSizeClasses; i++ {
|
||||
slow.Frees += uint64(c.local_nsmallfree[i])
|
||||
bySize[i].Frees += uint64(c.local_nsmallfree[i])
|
||||
bySize[i].Mallocs += uint64(c.local_nsmallfree[i])
|
||||
smallFree += uint64(c.local_nsmallfree[i]) * uint64(class_to_size[i])
|
||||
}
|
||||
}
|
||||
slow.Frees += memstats.tinyallocs
|
||||
slow.Mallocs += slow.Frees
|
||||
|
||||
slow.TotalAlloc = slow.Alloc + mheap_.largefree + smallFree
|
||||
slow.TotalAlloc = slow.Alloc + largeFree + smallFree
|
||||
|
||||
for i := range slow.BySize {
|
||||
slow.BySize[i].Mallocs = bySize[i].Mallocs
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue