diff options
| author | Keith Randall <khr@golang.org> | 2021-08-28 15:50:52 -0700 |
|---|---|---|
| committer | Keith Randall <khr@google.com> | 2022-05-12 22:32:42 +0000 |
| commit | 016d7552138077741a9c3fdadc73c0179f5d3ff7 (patch) | |
| tree | cfe978bcbb00bb7e67a610af16fe5706cd181723 /src/runtime/runtime2.go | |
| parent | da0a6f4b57fc9eb4779c295bc9620c5ed271a641 (diff) | |
| download | go-016d7552138077741a9c3fdadc73c0179f5d3ff7.tar.xz | |
runtime: measure stack usage; start stacks larger if needed
Measure the average stack size used by goroutines at every GC. When
starting a new goroutine, allocate an initial goroutine stack of that
average size. Intuition is that we'll waste at most 2x in stack space
because only half the goroutines can be below average. In turn, we
avoid some of the early stack growth / copying needed in the average
case.
More details in the design doc at: https://docs.google.com/document/d/1YDlGIdVTPnmUiTAavlZxBI1d9pwGQgZT7IKFKlIXohQ/edit?usp=sharing
name old time/op new time/op delta
Issue18138 95.3µs ± 0% 67.3µs ±13% -29.35% (p=0.000 n=9+10)
Fixes #18138
Change-Id: Iba34d22ed04279da7e718bbd569bbf2734922eaa
Reviewed-on: https://go-review.googlesource.com/c/go/+/345889
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Diffstat (limited to 'src/runtime/runtime2.go')
| -rw-r--r-- | src/runtime/runtime2.go | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 63d8449358..1e4f872726 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -732,11 +732,19 @@ type p struct { // Race context used while executing timer functions. timerRaceCtx uintptr - // scannableStackSizeDelta accumulates the amount of stack space held by + // maxStackScanDelta accumulates the amount of stack space held by // live goroutines (i.e. those eligible for stack scanning). - // Flushed to gcController.scannableStackSize once scannableStackSizeSlack - // or -scannableStackSizeSlack is reached. - scannableStackSizeDelta int64 + // Flushed to gcController.maxStackScan once maxStackScanSlack + // or -maxStackScanSlack is reached. + maxStackScanDelta int64 + + // gc-time statistics about current goroutines + // Note that this differs from maxStackScan in that this + // accumulates the actual stack observed to be used at GC time (hi - sp), + // not an instantaneous measure of the total stack size that might need + // to be scanned (hi - lo). + scannedStackSize uint64 // stack size of goroutines scanned by this P + scannedStacks uint64 // number of goroutines scanned by this P // preempt is set to indicate that this P should be enter the // scheduler ASAP (regardless of what G is running on it). |
