1
0
mirror of https://github.com/golang/go synced 2024-11-17 13:54:46 -07:00

runtime: break out new minimum heap size into a goexperiment

The new minimum heap of 512 KiB has been the cause of some build
slowdown (~1%) and microbenchmark slowdown (usually ~0%, up to ~50%)
because of two reasons:
1. Applications with lots of small short-lived processes execute many
   more GC cycles.
2. Applications with heaps <4 MiB GC up to 8x more often.

In many ways these consequences are inevitable given how GOGC works,
however we need to investigate more as to whether the apparent slowdowns
are indeed unavoidable or if the GC has issues scaling down, which it's
too late for for this release.

Given that this release is already huge, it's OK to push this back.
We'll take a closer look at it next cycle, so place block it behind a
new goexperiment to allow users and ourselves to easily experiment with
it.

Fixes #49744.
Updates #44167.

Change-Id: Ibad51f7873de7517490c89802f3c593834e77ff0
Reviewed-on: https://go-review.googlesource.com/c/go/+/368137
Trust: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
Michael Anthony Knyszek 2021-12-01 15:26:31 +00:00 committed by Michael Knyszek
parent 36be0beb05
commit c5c1955077
4 changed files with 27 additions and 2 deletions

View File

@ -0,0 +1,9 @@
// Code generated by mkconsts.go. DO NOT EDIT.
//go:build !goexperiment.heapminimum512kib
// +build !goexperiment.heapminimum512kib
package goexperiment
const HeapMinimum512KiB = false
const HeapMinimum512KiBInt = 0

View File

@ -0,0 +1,9 @@
// Code generated by mkconsts.go. DO NOT EDIT.
//go:build goexperiment.heapminimum512kib
// +build goexperiment.heapminimum512kib
package goexperiment
const HeapMinimum512KiB = true
const HeapMinimum512KiBInt = 1

View File

@ -89,4 +89,11 @@ type Flags struct {
// Details regarding the new pacer may be found at // Details regarding the new pacer may be found at
// https://golang.org/design/44167-gc-pacer-redesign // https://golang.org/design/44167-gc-pacer-redesign
PacerRedesign bool PacerRedesign bool
// HeapMinimum512KiB reduces the minimum heap size to 512 KiB.
//
// This was originally reduced as part of PacerRedesign, but
// has been broken out to its own experiment that is disabled
// by default.
HeapMinimum512KiB bool
} }

View File

@ -53,8 +53,8 @@ const (
gcOverAssistWork = 64 << 10 gcOverAssistWork = 64 << 10
// defaultHeapMinimum is the value of heapMinimum for GOGC==100. // defaultHeapMinimum is the value of heapMinimum for GOGC==100.
defaultHeapMinimum = goexperiment.PacerRedesignInt*(512<<10) + defaultHeapMinimum = (goexperiment.HeapMinimum512KiBInt)*(512<<10) +
(1-goexperiment.PacerRedesignInt)*(4<<20) (1-goexperiment.HeapMinimum512KiBInt)*(4<<20)
// scannableStackSizeSlack is the bytes of stack space allocated or freed // scannableStackSizeSlack is the bytes of stack space allocated or freed
// that can accumulate on a P before updating gcController.stackSize. // that can accumulate on a P before updating gcController.stackSize.