runtime.goidgen can be quite frequently modified and
shares cache line with the following variables,
it leads to false sharing.
50c6b0 b nfname
50c6b4 b nfunc
50c6b8 b nfunc$17
50c6bc b nhist$17
50c6c0 B runtime.checking
50c6c4 B runtime.gcwaiting
50c6c8 B runtime.goidgen
50c6cc B runtime.gomaxprocs
50c6d0 B runtime.panicking
50c6d4 B strconv.IntSize
50c6d8 B src/pkg/runtime/_xtest_.ss
50c6e0 B src/pkg/runtime/_xtest_.stop
50c6e8 b addrfree
50c6f0 b addrmem
50c6f8 b argv
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/
4673054
Lock;
G *gfree; // available gs (status == Gdead)
+ int32 goidgen;
G *ghead; // gs waiting to run
G *gtail;
newg->gopc = (uintptr)callerpc;
runtime·sched.gcount++;
- runtime·goidgen++;
- newg->goid = runtime·goidgen;
+ runtime·sched.goidgen++;
+ newg->goid = runtime·sched.goidgen;
newprocreadylocked(newg);
schedunlock();
extern String runtime·emptystring;
G* runtime·allg;
M* runtime·allm;
-int32 runtime·goidgen;
extern int32 runtime·gomaxprocs;
extern uint32 runtime·panicking;
extern int32 runtime·gcwaiting; // gc is waiting to run