• Austin Clements's avatar
    runtime: replace assist sleep loop with park/ready · 15aa6bbd
    Austin Clements authored
    GC assists must block until the assist can be satisfied (either
    through stealing credit or doing work) or the GC cycle ends.
    Currently, this is implemented as a retry loop with a 100 µs delay.
    This obviously isn't ideal, as it wastes CPU and delays mutator
    execution. It also has the somewhat peculiar downside that sleeping a
    G requires allocation, and this requires working around recursive
    allocation.
    
    Replace this timed delay with a proper scheduling queue. When an
    assist can't be satisfied immediately, it adds the allocating G to a
    queue and parks it. Any time background scan credit is flushed, it
    consults this queue, directly satisfies the debt of queued assists,
    and wakes up satisfied assists before flushing any remaining credit to
    the background credit pool.
    
    No effect on the go1 benchmarks. Slightly speeds up the garbage
    benchmark.
    
    name              old time/op  new time/op  delta
    XBenchGarbage-12  5.81ms ± 1%  5.72ms ± 4%  -1.65%  (p=0.011 n=20+20)
    
    Updates #12041.
    
    Change-Id: I8ee3b6274dd097b12b10a8030796a958a4b0e7b7
    Reviewed-on: https://go-review.googlesource.com/15890Reviewed-by: default avatarRick Hudson <rlh@golang.org>
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    15aa6bbd
mgcmark.go 34.6 KB