runtime: make the scavenger self-paced
Currently the runtime background scavenger is paced externally, controlled by a collection of variables which together describe a line that we'd like to stay under. However, the line to stay under is computed as a function of the number of free and unscavenged huge pages in the heap at the end of the last GC. Aside from this number being inaccurate (which is still acceptable), the scavenging system also makes an order-of-magnitude assumption as to how expensive scavenging a single page actually is. This change simplifies the scavenger in preparation for making it operate on bitmaps. It makes it so that the scavenger paces itself, by measuring the amount of time it takes to scavenge a single page. The scavenging methods on mheap already avoid breaking huge pages, so if we scavenge a real huge page, then we'll have paced correctly, otherwise we'll sleep for longer to avoid using more than scavengePercent wall clock time. Unfortunately, all this involves measuring time, which is quite tricky. Currently we don't directly account for long process sleeps or OS-level context switches (which is quite difficult to do in general), but we do account for Go scheduler overhead and variations in it by maintaining an EWMA of the ratio of time spent scavenging to the time spent sleeping. This ratio, as well as the sleep time, are bounded in order to deal with the aforementioned OS-related anomalies. Updates #35112. Change-Id: Ieca8b088fdfca2bebb06bcde25ef14a42fd5216b Reviewed-on: https://go-review.googlesource.com/c/go/+/201763 Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
Showing
This diff is collapsed.
Please register or sign in to comment