基本上我想知道我的程序是否随着时间的推移泄漏了goroutines。所以
我想知道随着时间的推移有多少goroutines正在运行。有没有办法通过pprof
?
我已完成go tool pprof http://localhost:8888/debug/pprof/block
。
这让我花了多长时间被阻止但没有多少例程正在运行。
答案 0 :(得分:8)
在浏览器中打开http://localhost:8888/debug/pprof/。您将看到两个相关链接:“goroutine”(http://localhost:8888/debug/pprof/goroutine?debug=1)和“完整goroutine堆栈转储”(http://localhost:8888/debug/pprof/goroutine?debug=2)。
第一个将显示与一个条目共享相同代码的所有goroutine,其名称前面有此类goroutines的数量。例如:
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
这两个goroutine中都有一个,这就是@之前的意思。
完全转储对于查找泄漏非常有用,它会分别向您显示每个goroutine,以及它的堆栈跟踪以及它正在做什么(例如,它等待从通道接收的时间长度):
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
答案 1 :(得分:1)
正如icza指出的那样,答案是使用runtime.NumGoroutine()
。
答案 2 :(得分:0)
如上所述,我们可以肯定地使用runtime.NumGoroutine()
来获取可能处于运行或等待状态的goroutine的当前数量。
我们可以使用Lookup
函数来获取许多配置文件。它们可以是预定义的配置文件,例如goroutine,堆,分配,互斥等,也可以是自定义配置文件。更多here
WriteTo
上定义的Profile
方法,以写入标准输出或文件。示例pprof.Lookup("goroutine").WriteTo(writer, 2)