mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime/metrics: add additional allocation metrics
This change adds four additional metrics to the runtime/metrics package to fill in a few gaps with runtime.MemStats that were overlooked. The biggest one is TotalAlloc, which is impossible to find with the runtime/metrics package, but also add a few others for convenience and clarity. For instance, the total number of objects allocated and freed are technically available via allocs-by-size and frees-by-size, but it's onerous to get them (one needs to sum the sample counts in the histograms). The four additional metrics are: - /gc/heap/allocs:bytes -- total bytes allocated (TotalAlloc) - /gc/heap/allocs:objects -- total objects allocated (Mallocs - [tiny]) - /gc/heap/frees:bytes -- total bytes frees (TotalAlloc-HeapAlloc) - /gc/heap/frees:objects -- total objects freed (Frees - [tiny]) This change also updates the descriptions of allocs-by-size and frees-by-size to be more precise. Change-Id: Iec8c1797a584491e3484b198f2e7f325b68954a7 Reviewed-on: https://go-review.googlesource.com/c/go/+/312431 Reviewed-by: Michael Pratt <mpratt@google.com> Trust: Michael Knyszek <mknyszek@google.com> Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
parent
fd09593667
commit
897baae953
4 changed files with 164 additions and 18 deletions
|
|
@ -98,6 +98,20 @@ func initMetrics() {
|
|||
}
|
||||
},
|
||||
},
|
||||
"/gc/heap/allocs:bytes": {
|
||||
deps: makeStatDepSet(heapStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindUint64
|
||||
out.scalar = in.heapStats.totalAllocated
|
||||
},
|
||||
},
|
||||
"/gc/heap/allocs:objects": {
|
||||
deps: makeStatDepSet(heapStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindUint64
|
||||
out.scalar = in.heapStats.totalAllocs
|
||||
},
|
||||
},
|
||||
"/gc/heap/frees-by-size:bytes": {
|
||||
deps: makeStatDepSet(heapStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
|
|
@ -110,6 +124,20 @@ func initMetrics() {
|
|||
}
|
||||
},
|
||||
},
|
||||
"/gc/heap/frees:bytes": {
|
||||
deps: makeStatDepSet(heapStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindUint64
|
||||
out.scalar = in.heapStats.totalFreed
|
||||
},
|
||||
},
|
||||
"/gc/heap/frees:objects": {
|
||||
deps: makeStatDepSet(heapStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindUint64
|
||||
out.scalar = in.heapStats.totalFrees
|
||||
},
|
||||
},
|
||||
"/gc/heap/goal:bytes": {
|
||||
deps: makeStatDepSet(sysStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
|
|
@ -337,6 +365,22 @@ type heapStatsAggregate struct {
|
|||
|
||||
// numObjects is the number of live objects in the heap.
|
||||
numObjects uint64
|
||||
|
||||
// totalAllocated is the total bytes of heap objects allocated
|
||||
// over the lifetime of the program.
|
||||
totalAllocated uint64
|
||||
|
||||
// totalFreed is the total bytes of heap objects freed
|
||||
// over the lifetime of the program.
|
||||
totalFreed uint64
|
||||
|
||||
// totalAllocs is the number of heap objects allocated over
|
||||
// the lifetime of the program.
|
||||
totalAllocs uint64
|
||||
|
||||
// totalFrees is the number of heap objects freed over
|
||||
// the lifetime of the program.
|
||||
totalFrees uint64
|
||||
}
|
||||
|
||||
// compute populates the heapStatsAggregate with values from the runtime.
|
||||
|
|
@ -344,13 +388,20 @@ func (a *heapStatsAggregate) compute() {
|
|||
memstats.heapStats.read(&a.heapStatsDelta)
|
||||
|
||||
// Calculate derived stats.
|
||||
a.inObjects = uint64(a.largeAlloc - a.largeFree)
|
||||
a.numObjects = uint64(a.largeAllocCount - a.largeFreeCount)
|
||||
a.totalAllocs = uint64(a.largeAllocCount)
|
||||
a.totalFrees = uint64(a.largeFreeCount)
|
||||
a.totalAllocated = uint64(a.largeAlloc)
|
||||
a.totalFreed = uint64(a.largeFree)
|
||||
for i := range a.smallAllocCount {
|
||||
n := uint64(a.smallAllocCount[i] - a.smallFreeCount[i])
|
||||
a.inObjects += n * uint64(class_to_size[i])
|
||||
a.numObjects += n
|
||||
na := uint64(a.smallAllocCount[i])
|
||||
nf := uint64(a.smallFreeCount[i])
|
||||
a.totalAllocs += na
|
||||
a.totalFrees += nf
|
||||
a.totalAllocated += na * uint64(class_to_size[i])
|
||||
a.totalFreed += nf * uint64(class_to_size[i])
|
||||
}
|
||||
a.inObjects = a.totalAllocated - a.totalFreed
|
||||
a.numObjects = a.totalAllocs - a.totalFrees
|
||||
}
|
||||
|
||||
// sysStatsAggregate represents system memory stats obtained
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue