pprof source and disasm views overcount recursive functions
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 45/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- go
- Ambito
- performance, tooling
Direzione di ricerca
Inizia esaminando internal/report/source.go alla riga indicata e riproduci il profilo ricorsivo fac con go tool pprof, confrontando la pagina Sources con list fac. Traccia il modo in cui i campioni cumulativi vengono aggregati per le chiamate ricorsive nelle viste del codice sorgente e del disassemblato. Il lavoro è completato quando le funzioni ricorsive non riportano più percentuali o tempi cumulativi superiori al totale del profilo.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
What version of pprof are you using?
go tool pprof with go1.18.3.
Full go env output
GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/keyhan/.cache/go-build" GOENV="/home/keyhan/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/keyhan/go/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/keyhan/go" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/snap/go/9848" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/snap/go/9848/pkg/tool/linux_amd64" GOVCS="" GOVERSION="go1.18.3" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/dev/null" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2938140119=/tmp/go-build -gno-record-gcc-switches"
What operating system and processor architecture are you using?
Linux, x86-64 Intel.
What did you do?
I opened the attached profile with go tool pprof -http=: fac.pb.gz,
and navigated to the "Sources" page. Here is the output:

As you can see, it is claimed that fac took 6193% of the total time.
It is also said that it took 150 seconds, which is wrong since the
program took only a couple of seconds.
The issue also occurs with the command line version, although strangely
the output is better.
(pprof) list fac
Total: 2.43s
ROUTINE ======================== main.fac in /home/keyhan/exgo/e.go
2.43s 3.34s (flat, cum) 137.45% of Total
. . 2:
. . 3:import "os"
. . 4:import "log"
. . 5:import "runtime/pprof"
. . 6:
850ms 850ms 7:func fac(n uint64) uint64 {
60ms 60ms 8: if n == 0 {
. . 9: return 1
. . 10: } else {
1.52s 2.43s 11: return n * fac(n - 1)
. . 12: }
. . 13:}
. . 14:
. . 15:func main() {
. . 16: f, err := os.Create("example.pb.gz")
What did you expect to see?
cum% should not be more than 100%.
What did you see instead?
cum% is claimed to be 6193%.
Root cause(?)
I believe the root cause is this line of code:
This is wrong, since the cumulative time spent in the current function
is not fns.Sum() if the function calls itself recursively. In those
cases some nodes will be counted multiple times.
Source Code
package main
import "os"
import "log"
import "runtime/pprof"
func fac(n uint64) uint64 {
if n == 0 {
return 1
} else {
return n * fac(n - 1)
}
}
func main() {
f, err := os.Create("example.pb.gz")
if err != nil {
log.Fatal("could not create CPU profile: ", err)
}
defer f.Close() // error handling omitted for example
if err := pprof.StartCPUProfile(f); err != nil {
log.Fatal("could not start CPU profile: ", err)
}
defer pprof.StopCPUProfile()
for i := 1; i <= 1e6; i++ {
fac(1000)
}
}
- Lingua principale
- Go
- Stelle
- 9.3k
- Fork
- 683
- Merge medio
- 1g 21h
- PR unite (30g)
- 10
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di google/pprof
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
google/pprof#1029 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 74/100
google/pprof#1020 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
pprof cannot locate source code for the list command in common Go setupsForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
google/pprof#1009 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Label with zero int64 value and no unit get dropped during decodingForse già presa @ms-hujia l’ha presa 130 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 55/100
google/pprof#1002 · 6 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 42/100
google/pprof#992 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di google/pprof
Issue simili
-
consensus feature I2 S4 U2
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno
-
[Bug] [Go] Ack returns nil when the server answers with a non-OK statusForse già presa @leizhiyuan l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
apache/rocketmq-clients#1465 ·
I maintainer di solito rispondono entro 2 giorni
-
Priority/Low Type/Improvement
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
OpenNSW/nsw-srilanka#906 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
praetorianer777/Dynamo#57 ·
I maintainer di solito rispondono entro 1 giorno
-
fix(handlers): explicitly set Content-Type header in static Index handlerForse già presa @kage-zero l’ha presa oggi. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno