Skip to content

Commit 74af7fc

Browse files
committed
runtime: place lower limit on trigger ratio
This change makes it so that the GC pacer's trigger ratio can never fall below 0.6. Upcoming changes to the allocator make it significantly more scalable and thus much faster in certain cases, creating a large gap between the performance of allocation and scanning. The consequence of this is that the trigger ratio can drop very low (0.07 was observed) in order to drop GC utilization. A low trigger ratio like this results in a high amount of black allocations, which causes the live heap to appear larger, and thus the heap, and RSS, grows to a much higher stable point. This change alleviates the problem by placing a lower bound on the trigger ratio. The expected (and confirmed) effect of this is that utilization in certain scenarios will no longer converge to the expected 25%, and may go higher. As a result of this artificially high trigger ratio, more time will also be spent doing GC assists compared to dedicated mark workers, since the GC will be on for an artifically short fraction of time (artificial with respect to the pacer). The biggest concern of this change is that allocation latency will suffer as a result, since there will now be more assists. But, upcoming changes to the allocator reduce the latency enough to outweigh the expected increase in latency from this change, without the blowup in RSS observed from the changes to the allocator. Updates #35112. Change-Id: Idd7c94fa974d0de673304c4397e716e89bfbf09b Reviewed-on: https://go-review.googlesource.com/c/go/+/200439 Reviewed-by: Austin Clements <austin@google.com>
1 parent 54e6ba6 commit 74af7fc

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

src/runtime/mgc.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -769,11 +769,25 @@ func gcSetTriggerRatio(triggerRatio float64) {
769769
goal = memstats.heap_marked + memstats.heap_marked*uint64(gcpercent)/100
770770
}
771771

772+
// If we let triggerRatio go too low, then if the application
773+
// is allocating very rapidly we might end up in a situation
774+
// where we're allocating black during a nearly always-on GC.
775+
// The result of this is a growing heap and ultimately an
776+
// increase in RSS. By capping us at a point >0, we're essentially
777+
// saying that we're OK using more CPU during the GC to prevent
778+
// this growth in RSS.
779+
//
780+
// The current constant was chosen empirically: given a sufficiently
781+
// fast/scalable allocator with 48 Ps that could drive the trigger ratio
782+
// to <0.05, this constant causes applications to retain the same peak
783+
// RSS compared to not having this allocator.
784+
const minTriggerRatio = 0.6
785+
772786
// Set the trigger ratio, capped to reasonable bounds.
773-
if triggerRatio < 0 {
787+
if triggerRatio < minTriggerRatio {
774788
// This can happen if the mutator is allocating very
775789
// quickly or the GC is scanning very slowly.
776-
triggerRatio = 0
790+
triggerRatio = minTriggerRatio
777791
} else if gcpercent >= 0 {
778792
// Ensure there's always a little margin so that the
779793
// mutator assist ratio isn't infinity.

0 commit comments

Comments
 (0)