]> Cypherpunks.ru repositories - gostls13.git/commit
runtime/trace: enable frame pointer unwinding on amd64
authorFelix Geisendörfer <felix.geisendoerfer@datadoghq.com>
Thu, 9 Mar 2023 07:54:51 +0000 (07:54 +0000)
committerMichael Pratt <mpratt@google.com>
Thu, 30 Mar 2023 19:18:03 +0000 (19:18 +0000)
commitba71817390f78bf8c479dc65d1bc51db98d667a7
tree7554a6d1156d0c3d3f74bad2c1b20b3f1a1480a9
parentb52f6d3721da6164687350fff8bd929e934d7725
runtime/trace: enable frame pointer unwinding on amd64

Change tracer to use frame pointer unwinding by default on amd64. The
expansion of inline frames is delayed until the stack table is dumped at
the end of the trace. This requires storing the skip argument in the
stack table, which now resides in pcBuf[0]. For stacks that are not
produced by traceStackID (e.g. CPU samples), a logicalStackSentinel
value in pcBuf[0] indicates that no inline expansion is needed.

Add new GODEBUG=tracefpunwindoff=1 option to use the old unwinder if
needed.

Benchmarks show a considerable decrease in CPU overhead when using frame
pointer unwinding for trace events:

GODEBUG=tracefpunwindoff=1 ../bin/go test -run '^$' -bench '.+PingPong' -count 20 -v -trace /dev/null ./runtime | tee tracefpunwindoff1.txt
GODEBUG=tracefpunwindoff=0 ../bin/go test -run '^$' -bench '.+PingPong' -count 20 -v -trace /dev/null ./runtime | tee tracefpunwindoff0.txt

goos: linux
goarch: amd64
pkg: runtime
cpu: Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz
               │ tracefpunwindoff1.txt │        tracefpunwindoff0.txt        │
               │        sec/op         │   sec/op     vs base                │
PingPongHog-32            3782.5n ± 0%   740.7n ± 2%  -80.42% (p=0.000 n=20)

For #16638

Change-Id: I2928a2fcd8779a31c45ce0f2fbcc0179641190bb
Reviewed-on: https://go-review.googlesource.com/c/go/+/463835
Reviewed-by: Michael Pratt <mpratt@google.com>
Run-TryBot: Felix Geisendörfer <felix.geisendoerfer@datadoghq.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
16 files changed:
src/runtime/asm_amd64.s
src/runtime/asm_arm64.s
src/runtime/extern.go
src/runtime/os_js.go
src/runtime/runtime1.go
src/runtime/stubs_386.go
src/runtime/stubs_amd64.go
src/runtime/stubs_arm.go
src/runtime/stubs_arm64.go
src/runtime/stubs_loong64.go
src/runtime/stubs_mips64x.go
src/runtime/stubs_mipsx.go
src/runtime/stubs_ppc64x.go
src/runtime/stubs_riscv64.go
src/runtime/stubs_s390x.go
src/runtime/trace.go