1
0
mirror of https://github.com/golang/go synced 2024-11-19 14:34:42 -07:00
go/test
Austin Clements 2b415549b8 runtime: use sparse mappings for the heap
This replaces the contiguous heap arena mapping with a potentially
sparse mapping that can support heap mappings anywhere in the address
space.

This has several advantages over the current approach:

* There is no longer any limit on the size of the Go heap. (Currently
  it's limited to 512GB.) Hence, this fixes #10460.

* It eliminates many failures modes of heap initialization and
  growing. In particular it eliminates any possibility of panicking
  with an address space conflict. This can happen for many reasons and
  even causes a low but steady rate of TSAN test failures because of
  conflicts with the TSAN runtime. See #16936 and #11993.

* It eliminates the notion of "non-reserved" heap, which was added
  because creating huge address space reservations (particularly on
  64-bit) led to huge process VSIZE. This was at best confusing and at
  worst conflicted badly with ulimit -v. However, the non-reserved
  heap logic is complicated, can race with other mappings in non-pure
  Go binaries (e.g., #18976), and requires that the entire heap be
  either reserved or non-reserved. We currently maintain the latter
  property, but it's quite difficult to convince yourself of that, and
  hence difficult to keep correct. This logic is still present, but
  will be removed in the next CL.

* It fixes problems on 32-bit where skipping over parts of the address
  space leads to mapping huge (and never-to-be-used) metadata
  structures. See #19831.

This also completely rewrites and significantly simplifies
mheap.sysAlloc, which has been a source of many bugs. E.g., #21044,
 #20259, #18651, and #13143 (and maybe #23222).

This change also makes it possible to allocate individual objects
larger than 512GB. As a result, a few tests that expected huge
allocations to fail needed to be changed to make even larger
allocations. However, at the moment attempting to allocate a humongous
object may cause the program to freeze for several minutes on Linux as
we fall back to probing every page with addrspace_free. That logic
(and this failure mode) will be removed in the next CL.

Fixes #10460.
Fixes #22204 (since it rewrites the code involved).

This slightly slows down compilebench and the x/benchmarks garbage
benchmark.

name       old time/op     new time/op     delta
Template       184ms ± 1%      185ms ± 1%    ~     (p=0.065 n=10+9)
Unicode       86.9ms ± 3%     86.3ms ± 1%    ~     (p=0.631 n=10+10)
GoTypes        599ms ± 0%      602ms ± 0%  +0.56%  (p=0.000 n=10+9)
Compiler       2.87s ± 1%      2.89s ± 1%  +0.51%  (p=0.002 n=9+10)
SSA            7.29s ± 1%      7.25s ± 1%    ~     (p=0.182 n=10+9)
Flate          118ms ± 2%      118ms ± 1%    ~     (p=0.113 n=9+9)
GoParser       147ms ± 1%      148ms ± 1%  +1.07%  (p=0.003 n=9+10)
Reflect        401ms ± 1%      404ms ± 1%  +0.71%  (p=0.003 n=10+9)
Tar            175ms ± 1%      175ms ± 1%    ~     (p=0.604 n=9+10)
XML            209ms ± 1%      210ms ± 1%    ~     (p=0.052 n=10+10)

(https://perf.golang.org/search?q=upload:20171231.4)

name                       old time/op  new time/op  delta
Garbage/benchmem-MB=64-12  2.23ms ± 1%  2.25ms ± 1%  +0.84%  (p=0.000 n=19+19)

(https://perf.golang.org/search?q=upload:20171231.3)

Relative to the start of the sparse heap changes (starting at and
including "runtime: fix various contiguous bitmap assumptions"),
overall slowdown is roughly 1% on GC-intensive benchmarks:

name        old time/op     new time/op     delta
Template        183ms ± 1%      185ms ± 1%  +1.32%  (p=0.000 n=9+9)
Unicode        84.9ms ± 2%     86.3ms ± 1%  +1.65%  (p=0.000 n=9+10)
GoTypes         595ms ± 1%      602ms ± 0%  +1.19%  (p=0.000 n=9+9)
Compiler        2.86s ± 0%      2.89s ± 1%  +0.91%  (p=0.000 n=9+10)
SSA             7.19s ± 0%      7.25s ± 1%  +0.75%  (p=0.000 n=8+9)
Flate           117ms ± 1%      118ms ± 1%  +1.10%  (p=0.000 n=10+9)
GoParser        146ms ± 2%      148ms ± 1%  +1.48%  (p=0.002 n=10+10)
Reflect         398ms ± 1%      404ms ± 1%  +1.51%  (p=0.000 n=10+9)
Tar             173ms ± 1%      175ms ± 1%  +1.17%  (p=0.000 n=10+10)
XML             208ms ± 1%      210ms ± 1%  +0.62%  (p=0.011 n=10+10)
[Geo mean]      369ms           373ms       +1.17%

(https://perf.golang.org/search?q=upload:20180101.2)

name                       old time/op  new time/op  delta
Garbage/benchmem-MB=64-12  2.22ms ± 1%  2.25ms ± 1%  +1.51%  (p=0.000 n=20+19)

(https://perf.golang.org/search?q=upload:20180101.3)

Change-Id: I5daf4cfec24b252e5a57001f0a6c03f22479d0f0
Reviewed-on: https://go-review.googlesource.com/85887
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
2018-02-15 21:12:23 +00:00
..
alias3.dir [dev.typealias] cmd/compile: export/import test cases for type aliases 2017-01-20 05:55:53 +00:00
bench test/bench/go1: fix typo in parserdata_test.go comment 2017-03-22 03:23:16 +00:00
chan all: fix article typos 2017-09-15 02:39:16 +00:00
closure3.dir cmd/compile: inline closures with captures 2017-11-05 04:18:05 +00:00
ddd2.dir
dwarf
fixedbugs runtime: use sparse mappings for the heap 2018-02-15 21:12:23 +00:00
import2.dir
import4.dir
interface cmd/compile: more error position tests for the typechecker 2017-04-24 12:37:49 +00:00
intrinsic.dir cmd/compile: intrinsics for math/bits.TrailingZerosX 2017-03-16 02:44:16 +00:00
ken
linkname.dir cmd/compile: include linknames in export data 2017-02-08 20:59:45 +00:00
method4.dir
safe
stress
syntax cmd/compile/internal/parser: improved a couple of error messages 2017-02-24 18:54:36 +00:00
uintptrescapes.dir
64bit.go
235.go
alg.go
alias1.go
alias2.go [dev.typealias] cmd/compile: declare methods after resolving receiver type 2017-01-25 08:04:17 +00:00
alias3.go [dev.typealias] cmd/compile: export/import test cases for type aliases 2017-01-20 05:55:53 +00:00
alias.go
append1.go cmd/compile: more error position tests for the typechecker 2017-04-24 12:37:49 +00:00
append.go
args.go
armimm.go cmd/internal/obj: continue to optimize ARM's constant pool 2017-05-11 13:53:54 +00:00
assign1.go
assign.go
atomicload.go
bigalg.go
bigmap.go
blank1.go
blank.go
bom.go
bombad.go
bounds.go
chancap.go runtime: use sparse mappings for the heap 2018-02-15 21:12:23 +00:00
chanlinear.go
char_lit1.go
char_lit.go
checkbce.go test: add missing copyright header to checkbce.go 2017-05-18 00:05:25 +00:00
clearfat.go
closedchan.go
closure1.go
closure2.go
closure3.go cmd/compile: fix reassignment check 2017-11-03 20:09:26 +00:00
closure.go
cmp6.go
cmp.go
cmplx.go cmd/compile: more error position tests for the typechecker 2017-04-24 12:37:49 +00:00
cmplxdivide1.go runtime: make complex division c99 compatible 2017-03-15 22:45:17 +00:00
cmplxdivide.c runtime: make complex division c99 compatible 2017-03-15 22:45:17 +00:00
cmplxdivide.go runtime: make complex division c99 compatible 2017-03-15 22:45:17 +00:00
complit1.go cmd/compile: more error position tests for the typechecker 2017-04-24 12:37:49 +00:00
complit.go
compos.go
const1.go
const2.go
const3.go
const4.go
const5.go
const6.go
const.go
convert1.go
convert2.go
convert3.go
convert.go
convlit1.go
convlit.go
convT2X.go
copy1.go cmd/compile: more error position tests for the typechecker 2017-04-24 12:37:49 +00:00
copy.go
crlf.go
ddd1.go test: reenable ... test 2017-08-11 17:41:17 +00:00
ddd2.go
ddd.go
decl.go
declbad.go
defer.go
deferfin.go
deferprint.go
deferprint.out
devirt.go cmd/compile: de-virtualize interface calls 2017-03-14 18:49:23 +00:00
divide.go
divmod.go
empty.go
env.go
eof1.go
eof.go
errchk test: skip "# package/path" output from cmd/go in errchk 2017-12-13 21:32:01 +00:00
escape2.go test: add missing escape analysis test 2017-08-11 00:56:21 +00:00
escape2n.go test: add missing escape analysis test 2017-08-11 00:56:21 +00:00
escape3.go
escape4.go cmd/compile: inline calls to local closures 2017-10-11 22:32:36 +00:00
escape5.go cmd/compile: unnamed parameters do not escape 2017-03-24 17:14:00 +00:00
escape_array.go
escape_because.go cmd/compile: add explicit 'where' to EscStep data for explanations 2016-10-26 18:46:59 +00:00
escape_calls.go
escape_closure.go cmd/compile/internal/syntax: establish principled position information 2017-02-15 01:33:03 +00:00
escape_field.go
escape_iface.go
escape_indir.go
escape_level.go
escape_map.go
escape_param.go
escape_slice.go
escape_struct_param1.go
escape_struct_param2.go
escape_struct_return.go
escape.go
fibo.go
finprofiled.go
float_lit2.go
float_lit3.go
float_lit.go
floatcmp.go
for.go
func1.go
func2.go
func3.go
func4.go
func5.go
func6.go
func7.go
func8.go
func.go
funcdup2.go
funcdup.go
gc1.go
gc2.go
gc.go
gcstring.go
goprint.go
goprint.out
goto.go cmd/compile: report block start for gotos jumping into blocks 2017-04-19 02:27:58 +00:00
heapsampling.go
helloworld.go
helloworld.out
if.go
import1.go
import2.go
import4.go
import5.go cmd/compile: be slightly more tolerant in case of certain syntax errors 2017-03-24 20:07:15 +00:00
import6.go cmd/compile/internal/syntax: removed gcCompat code needed to pass orig. tests 2017-02-10 01:22:30 +00:00
import.go
index0.go
index1.go
index2.go
index.go
indirect1.go
indirect.go
init1.go
init.go Revert "cmd/compile: improve error message if init is directly invoked" 2017-03-06 23:48:37 +00:00
initcomma.go
initialize.go
initializerr.go cmd/compile: more error position tests for the typechecker 2017-04-24 12:37:49 +00:00
initloop.go
inline_caller.go runtime: skip logical frames in runtime.Caller 2017-04-18 19:56:30 +00:00
inline_callers.go test: make inline_callers.go test not inline the runtime 2017-11-22 00:52:54 +00:00
inline_literal.go cmd/compile: copy literals when inlining 2017-03-03 21:29:32 +00:00
inline_variadic.go cmd/compile: generate code that type checks when inlining variadic functions 2016-11-30 19:46:00 +00:00
inline.go cmd/compile: inline closures with captures 2017-11-05 04:18:05 +00:00
int_lit.go
intcvt.go
intrinsic_atomic.go cmd/compile: intrinsify atomics on MIPS64 2017-10-10 19:43:38 +00:00
intrinsic.go
iota.go
label1.go cmd/compile/internal/gc: don't panic on continue in switch 2017-04-12 14:27:45 +00:00
label.go
linkmain_run.go
linkmain.go
linkname.go cmd/compile: include linknames in export data 2017-02-08 20:59:45 +00:00
linkobj.go
linkx_run.go
linkx.go
literal.go
live1.go
live2.go cmd/compile: specialize map creation for small hint sizes 2017-11-02 17:03:45 +00:00
live_syscall.go cmd/compile: fix unsafe.Pointer liveness for Syscall-like functions 2017-12-08 21:34:24 +00:00
live.go cmd/compile: specialize map creation for small hint sizes 2017-11-02 17:03:45 +00:00
locklinear.go test: deflake locklinear again 2017-04-05 18:46:31 +00:00
loopbce.go cmd/compile: make loop guard+rotate conditional on GOEXPERIMENT 2017-06-21 22:07:33 +00:00
makechan.go cmd/compile: generate makechan calls with int arguments 2017-08-15 05:54:24 +00:00
makemap.go cmd/compile: generate makemap calls with int arguments 2017-08-22 20:28:21 +00:00
makenew.go cmd/compile: more error position tests for the typechecker 2017-04-24 12:37:49 +00:00
mallocfin.go
map1.go cmd/compile: more error position tests for the typechecker 2017-04-24 12:37:49 +00:00
map.go
maplinear.go
mergemul.go cmd/compile: combine x*n - y*n into (x-y)*n 2017-09-03 14:29:38 +00:00
method1.go
method2.go cmd/compile: add two error position tests for the typechecker 2017-10-12 20:50:20 +00:00
method3.go
method4.go
method5.go
method6.go cmd/compile: add two error position tests for the typechecker 2017-10-12 20:50:20 +00:00
method7.go test: disable broken test for 1.10 2017-12-04 19:29:14 +00:00
method.go
named1.go
named.go
nil.go
nilcheck.go
nilptr2.go
nilptr3.go cmd/compile: remove more nil ptr checks after newobject 2017-08-25 03:26:58 +00:00
nilptr4.go
nilptr.go
nosplit.go test: fix and re-enable nosplit.go 2017-10-31 19:12:11 +00:00
notinheap2.go cmd/compile: add go:notinheap type pragma 2016-10-15 17:58:14 +00:00
notinheap3.go cmd/compile: []T where T is go:notinheap does not need write barriers 2017-11-06 21:07:57 +00:00
notinheap.go cmd/compile/internal/gc: inline typedcl0 and typedcl1 2017-02-01 22:52:32 +00:00
nowritebarrier.go cmd/compile: improve coverage of nowritebarrierrec check 2017-10-29 19:36:44 +00:00
nul1.go cmd/compile/internal/gc: enable new parser by default 2016-10-25 22:28:40 +00:00
opt_branchlikely.go cmd/compile: insert scheduling checks on loop backedges 2017-01-09 21:01:29 +00:00
parentype.go
peano.go
phiopt.go
print.go cmd/compile: fix print/println when input is uint 2017-09-26 04:08:38 +00:00
print.out cmd/compile: fix print/println when input is uint 2017-09-26 04:08:38 +00:00
printbig.go
printbig.out
prove.go cmd/compile/internal/gc: improve comparison with constant strings 2017-04-07 15:40:25 +00:00
range.go cmd/compile: improve single blank variable handling in walkrange 2017-09-12 05:50:54 +00:00
README.md test: add README 2017-07-26 23:37:25 +00:00
recover1.go
recover2.go
recover3.go
recover4.go all: use Fatalf instead of Fatal if format is given 2018-01-10 01:35:45 +00:00
recover5.go cmd/compile: more error position tests for the typechecker 2017-04-24 12:37:49 +00:00
recover.go
reflectmethod1.go
reflectmethod2.go
reflectmethod3.go
reflectmethod4.go
rename1.go cmd/compile: avoid duplicate cast error 2017-08-22 13:44:35 +00:00
rename.go
reorder2.go
reorder.go cmd/compile: Ensure left-to-right assignment 2017-02-11 21:46:21 +00:00
return.go
rotate0.go
rotate1.go
rotate2.go
rotate3.go
rotate.go
run.go cmd/compile: make -asmhdr work with type aliases 2017-11-29 20:40:41 +00:00
rune.go
runtime.go cmd/compile/internal/gc: separate builtin and real runtime packages 2017-03-01 01:06:32 +00:00
shift1.go cmd/compile: permit indices of certain non-constant shifts 2017-12-01 20:39:50 +00:00
shift2.go
sieve.go
sigchld.go
sigchld.out
simassign.go
sinit_run.go
sinit.go
sizeof.go
slice3.go
slice3err.go
slicecap.go
sliceopt.go cmd/compile: use masks instead of branches for slicing 2016-10-27 20:22:49 +00:00
solitaire.go
stack.go
strength.go
string_lit.go
stringrange.go
struct0.go
switch2.go
switch3.go
switch4.go
switch5.go cmd/compile: make duplicate expr cases readable 2017-05-19 18:11:51 +00:00
switch6.go cmd/compile: improve error for wrong type in switch 2017-02-02 17:36:43 +00:00
switch7.go cmd/compile: make duplicate expr cases readable 2017-05-19 18:11:51 +00:00
switch.go
tinyfin.go
torture.go
turing.go
typecheck.go
typecheckloop.go
typeswitch1.go
typeswitch2.go cmd/compile/internal/syntax: removed gcCompat code needed to pass orig. tests 2017-02-10 01:22:30 +00:00
typeswitch3.go cmd/compile: add test for non interface type switch 2017-03-25 22:52:54 +00:00
typeswitch.go
uintptrescapes2.go cmd/compile: fix go:uintptrescapes tag for unnamed parameters 2018-02-14 21:41:39 +00:00
uintptrescapes.go
undef.go
utf.go
varerr.go
varinit.go
writebarrier.go cmd/compile: don't use statictmps for SSA-able composite literals 2017-05-11 18:28:40 +00:00
zerodivide.go test: lock in test for _ assignment evaluation/zerodivide panic 2016-12-23 17:35:24 +00:00

The test directory contains tests of the Go tool chain and runtime. It includes black box tests, regression tests, and error output tests. They are run as part of all.bash.

To run just these tests, execute:

go run run.go

Standard library tests should be written as regular Go tests in the appropriate package.

The tool chain and runtime also have regular Go tests in their packages. The main reasons to add a new test to this directory are:

  • it is most naturally expressed using the test runner; or
  • it is also applicable to gccgo and other Go tool chains.