• Michael Anthony Knyszek's avatar
    runtime: make the scavenger self-paced · 21445b09
    Michael Anthony Knyszek authored
    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: default avatarAustin Clements <austin@google.com>
    21445b09
mheap.go 66.5 KB