2016-07-15 14 views
2

Grundsätzlich möchte ich herausfinden, ob mein Programm gououtines im Laufe der Zeit undicht ist. So Ich möchte sehen, wie viele Goroutines im Laufe der Zeit laufen. Gibt es eine Möglichkeit, dies durch pprof zu tun?Wie Profil Nummer von Goroutines Profil

Ich habe go tool pprof http://localhost:8888/debug/pprof/block getan.

Welche gibt mir wie lange blockiert wird, aber nicht wie viele Routinen ausgeführt werden.

+4

Ist Ihnen ['runtime.NumGoroutine()'] (https://golang.org/pkg/runtime/#NumGoroutine) bekannt, welches die Anzahl der aktuell existierenden Goroutinen zurückgibt? – icza

Antwort

0

Wie Icza darauf hingewiesen, ist die Antwort runtime.NumGoroutine() zu verwenden.

2

Öffnen Sie http://localhost:8888/debug/pprof/ in Ihrem Browser. Sie werden zwei relevante Links sehen: "goroutine" (http://localhost:8888/debug/pprof/goroutine?debug=1) und "full goroutine stack dump" (http://localhost:8888/debug/pprof/goroutine?debug=2).

Der erste zeigt alle goroutines, die den gleichen Code wie ein Eintrag teilen, mit der Anzahl solcher goroutines vor ihrem Namen. Zum Beispiel:

1 @ 0x42f223 0x42f2e4 0x40542f 0x404f4b 0x4a0586 0x4600a1 
# 0x4a0586 gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands.(*RunCommand).startWorkers+0x56 /home/me/go/src/gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands/multi.go:164 

1 @ 0x42f223 0x43dfd7 0x43d532 0x4a04ed 0x4600a1 
# 0x4a04ed gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands.(*RunCommand).processRunners+0x45d /home/me/go/src/gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands/multi.go:147 

Es gibt eine dieser beiden goroutines, das ist, was die 1 vor dem @ bedeutet.

Die vollständige Dump ist äußerst nützlich für die Lecks zu finden, es wird Ihnen separat jeden goroutine zeigen, sowie seinen Stack-Trace und was es tut (zB wie lange es hat mich von einem Kanal zu empfangen gewartet):

goroutine 49 [chan receive, 2 minutes]: 
gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands.(*RunCommand).startWorkers(0xc820103ee0, 0xc820274000, 0xc820274060, 0xc8201d65a0) 
    /home/me/go/src/gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands/multi.go:164 +0x56 
created by gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands.(*RunCommand).Run 
    /home/me/go/src/gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands/multi.go:294 +0x41b 

goroutine 50 [select]: 
gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands.(*RunCommand).processRunners(0xc820103ee0, 0x0, 0xc820274060, 0xc8201d65a0) 
    /home/me/go/src/gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands/multi.go:147 +0x45d 
created by gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands.(*RunCommand).startWorkers 
    /home/me/go/src/gitlab.com/gitlab-org/gitlab-ci-multi-runner/commands/multi.go:165 +0x96 
+0

Wenn debug = 1, was bedeuten Adressen nach @? - ("0x42f223 0x42f2e4 0x40542f 0x404f4b 0x4a0586 0x4600a1") – lafolle