• Austin Clements's avatar
    runtime: remove in-use page count loop from STW · dac220b0
    Austin Clements authored
    In order to compute the sweep ratio, the runtime needs to know how
    many pages belong to spans in state _MSpanInUse. Currently it finds
    this out by looping over all spans during mark termination. However,
    this takes ~1ms/heap GB, so multi-gigabyte heaps can quickly push our
    STW time past 10ms.
    
    Replace the loop with an actively maintained count of in-use pages.
    
    For multi-gigabyte heaps, this reduces max mark termination pause time
    by 75%–90% relative to tip and by 85%–95% relative to Go 1.5.1. This
    shifts the longest pause time for large heaps to the sweep termination
    phase, so it only slightly decreases max pause time, though it roughly
    halves mean pause time. Here are the results for the garbage
    benchmark:
    
                   ---- max mark termination pause ----
    Heap   Procs   after change   before change   1.5.1
    24GB     12        1.9ms          18ms         37ms
    24GB      4        3.7ms          18ms         37ms
     4GB      4        920µs         3.8ms        6.9ms
    
    Fixes #11484.
    
    Change-Id: Ia2d28bb8a1e4f1c3b8ebf79fb203f12b9bf114ac
    Reviewed-on: https://go-review.googlesource.com/15070Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    dac220b0
mheap.go 32.3 KB