diff options
author | Michael Anthony Knyszek <mknyszek@google.com> | 2021-04-20 19:30:21 +0000 |
---|---|---|
committer | Michael Knyszek <mknyszek@google.com> | 2021-04-29 21:54:05 +0000 |
commit | 897baae953ca812005703d367234b3b867f2a4b0 (patch) | |
tree | 7ce11f007a16186fffadaa164b8051fb1a5efde0 /src/runtime/metrics.go | |
parent | fd095936673dcb53b96b825d95c1e83adde3ce15 (diff) | |
download | go-897baae953ca812005703d367234b3b867f2a4b0.tar.gz go-897baae953ca812005703d367234b3b867f2a4b0.zip |
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>
Diffstat (limited to 'src/runtime/metrics.go')
-rw-r--r-- | src/runtime/metrics.go | 61 |
1 files changed, 56 insertions, 5 deletions
diff --git a/src/runtime/metrics.go b/src/runtime/metrics.go index 240813b169..ba0a920a5d 100644 --- a/src/runtime/metrics.go +++ b/src/runtime/metrics.go @@ -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 |