• Austin Clements's avatar
    runtime: enlarge GC work buffer size · 18705721
    Austin Clements authored
    Currently the GC work buffers are only 256 bytes and hence can record
    only 24 64-bit pointer. They were reduced from 4K in commits db7fd1c1
    and a15818fe as a way to minimize the amount of work the per-P workbuf
    caches could "hide" from the mark phase and carry in to the mark
    termination phase. However, this approach wasn't very robust and we
    later added a "mark 2" phase to address this problem head-on.
    
    Because of mark 2, there's now no benefit to having very small work
    buffers. But there are plenty of downsides: small work buffers
    increase contention on the work lists, increase the frequency and
    hence net overhead of acquiring and releasing work buffers, and
    somewhat increase memory overhead of the GC.
    
    This commit expands work buffers back to 4K (504 64-bit pointers).
    This reduces the rate of writes to work.full in the garbage benchmark
    from a peak of ~780,000 writes/sec to a peak of ~32,000 writes/sec.
    
    This has negligible effect on the go1 benchmarks. It slightly slows
    down the garbage benchmark.
    
    name              old time/op  new time/op  delta
    XBenchGarbage-12  5.37ms ± 5%  5.60ms ± 2%  +4.37%  (p=0.000 n=20+20)
    
    Change-Id: Ic9cc28e7a125d23d9faf4f5e690fb8aa9bcdfb28
    Reviewed-on: https://go-review.googlesource.com/15893Reviewed-by: default avatarRick Hudson <rlh@golang.org>
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    18705721
mgcwork.go 11.2 KB