• Dmitry Vyukov's avatar
    runtime: remove unnecessary wakeups of worker threads · fb6f8a96
    Dmitry Vyukov authored
    Currently we wake up new worker threads whenever we pass
    through the scheduler with nmspinning==0. This leads to
    lots of unnecessary thread wake ups.
    Instead let only spinning threads wake up new spinning threads.
    
    For the following program:
    
    package main
    import "runtime"
    func main() {
    	for i := 0; i < 1e7; i++ {
    		runtime.Gosched()
    	}
    }
    
    Before:
    $ time ./test
    real	0m4.278s
    user	0m7.634s
    sys	0m1.423s
    
    $ strace -c ./test
    % time     seconds  usecs/call     calls    errors syscall
     99.93    9.314936           3   2685009     17536 futex
    
    After:
    $ time ./test
    real	0m1.200s
    user	0m1.181s
    sys	0m0.024s
    
    $ strace -c ./test
    % time     seconds  usecs/call     calls    errors syscall
      3.11    0.000049          25         2           futex
    
    Fixes #13527
    
    Change-Id: Ia1f5bf8a896dcc25d8b04beb1f4317aa9ff16f74
    Reviewed-on: https://go-review.googlesource.com/17540Reviewed-by: 's avatarAustin Clements <austin@google.com>
    Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    fb6f8a96
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang.org/x/net/http2/hpack Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...