• Austin Clements's avatar
    runtime: reduce arena size to 4MB on 64-bit Windows · 78846472
    Austin Clements authored
    Currently, we use 64MB heap arenas on 64-bit platforms. This works
    well on UNIX-like OSes because they treat untouched pages as
    essentially free. However, on Windows, committed memory is charged
    against a process whether or not it has demand-faulted physical pages
    in. Hence, on Windows, even a process with a tiny heap will commit
    64MB for one heap arena, plus another 32MB for the arena map. Things
    are much worse under the race detector, which increases the heap
    commitment by a factor of 5.5X, leading to 384MB of committed memory
    at runtime init.
    
    Fix this by reducing the heap arena size to 4MB on Windows.
    
    To counterbalance the effect of increasing the arena map size by a
    factor of 16, and to further reduce the impact of the commitment for
    the arena map, we switch from a single entry L1 arena map to a 64
    entry L1 arena map.
    
    Compared to the original arena design, this slows down the
    x/benchmarks garbage benchmark by 0.49% (the slow down of this commit
    alone is 1.59%, but the previous commit bought us a 1% speed-up):
    
    name                       old time/op  new time/op  delta
    Garbage/benchmem-MB=64-12  2.28ms ± 1%  2.29ms ± 1%  +0.49%  (p=0.000 n=17+18)
    
    (https://perf.golang.org/search?q=upload:20180223.1)
    
    (This was measured on linux/amd64 by modifying its arena configuration
    as above.)
    
    Fixes #23900.
    
    Change-Id: I6b7fa5ecebee2947bf20cfeb78c248809469c6b1
    Reviewed-on: https://go-review.googlesource.com/96780
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
    78846472
malloc.go 39.9 KB