]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: sample large heap allocations correctly
authorRaul Silvera <rauls5382@gmail.com>
Fri, 18 Jan 2019 00:14:29 +0000 (00:14 +0000)
committerHyang-Ah Hana Kim <hyangah@gmail.com>
Fri, 18 Jan 2019 15:29:32 +0000 (15:29 +0000)
Remove an unnecessary check on the heap sampling code that forced sampling
of all heap allocations larger than the sampling rate. This need to follow
a poisson process so that they can be correctly unsampled. Maintain a check
for MemProfileRate==1 to provide a mechanism for full sampling, as
documented in https://golang.org/pkg/runtime/#pkg-variables.

Additional testing for this change is on cl/129117.

Fixes #26618

Change-Id: I7802bde2afc655cf42cffac34af9bafeb3361957
GitHub-Last-Rev: 471f747af845395d458096bea26daa93b91120be
GitHub-Pull-Request: golang/go#29791
Reviewed-on: https://go-review.googlesource.com/c/158337
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
src/runtime/malloc.go
src/runtime/testdata/testprog/memprof.go

index c1a89dc588d7d71e4403f29c69b306a62084a36c..8c617bb42b4869580a0db3f4a260c12ce266924a 100644 (file)
@@ -1012,7 +1012,7 @@ func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
        }
 
        if rate := MemProfileRate; rate > 0 {
-               if size < uintptr(rate) && int32(size) < c.next_sample {
+               if rate != 1 && int32(size) < c.next_sample {
                        c.next_sample -= int32(size)
                } else {
                        mp := acquirem()
index a22fee61d78255d5c237ec7747be5fe5ae23f183..7b134bc0784031ddcd0156e3135fb43ddd574f2a 100644 (file)
@@ -21,7 +21,10 @@ var memProfBuf bytes.Buffer
 var memProfStr string
 
 func MemProf() {
-       for i := 0; i < 1000; i++ {
+       // Force heap sampling for determinism.
+       runtime.MemProfileRate = 1
+
+       for i := 0; i < 10; i++ {
                fmt.Fprintf(&memProfBuf, "%*d\n", i, i)
        }
        memProfStr = memProfBuf.String()