mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: make alloc count metrics truly monotonic
Right now we export alloc count metrics via the runtime/metrics package and mark them as monotonic, but that's not actually true. As an optimization, the runtime assumes a span is always fully allocated before being uncached, and updates the accounting as such. In the rare case that it's wrong, the span has enough information to back out what did not get allocated. This change uses 16 bits of padding in the mspan to house another field that represents the amount of mspan slots filled just as the mspan is cached. This is information is enough to get an exact count, allowing us to make the metrics truly monotonic. Change-Id: Iaff3ca43f8745dc1bbb0232372423e014b89b920 Reviewed-on: https://go-review.googlesource.com/c/go/+/377516 Reviewed-by: Michael Pratt <mpratt@google.com> Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
a0f77e56b7
commit
79db59ded9
3 changed files with 125 additions and 45 deletions
|
|
@ -449,16 +449,17 @@ type mspan struct {
|
|||
// if sweepgen == h->sweepgen + 3, the span was swept and then cached and is still cached
|
||||
// h->sweepgen is incremented by 2 after every GC
|
||||
|
||||
sweepgen uint32
|
||||
divMul uint32 // for divide by elemsize
|
||||
allocCount uint16 // number of allocated objects
|
||||
spanclass spanClass // size class and noscan (uint8)
|
||||
state mSpanStateBox // mSpanInUse etc; accessed atomically (get/set methods)
|
||||
needzero uint8 // needs to be zeroed before allocation
|
||||
elemsize uintptr // computed from sizeclass or from npages
|
||||
limit uintptr // end of data in span
|
||||
speciallock mutex // guards specials list
|
||||
specials *special // linked list of special records sorted by offset.
|
||||
sweepgen uint32
|
||||
divMul uint32 // for divide by elemsize
|
||||
allocCount uint16 // number of allocated objects
|
||||
spanclass spanClass // size class and noscan (uint8)
|
||||
state mSpanStateBox // mSpanInUse etc; accessed atomically (get/set methods)
|
||||
needzero uint8 // needs to be zeroed before allocation
|
||||
allocCountBeforeCache uint16 // a copy of allocCount that is stored just before this span is cached
|
||||
elemsize uintptr // computed from sizeclass or from npages
|
||||
limit uintptr // end of data in span
|
||||
speciallock mutex // guards specials list
|
||||
specials *special // linked list of special records sorted by offset.
|
||||
}
|
||||
|
||||
func (s *mspan) base() uintptr {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue