Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何分析goroutine的数量_Go_Profiling_Pprof - Fatal编程技术网

如何分析goroutine的数量

如何分析goroutine的数量,go,profiling,pprof,Go,Profiling,Pprof,基本上,我想知道我的程序是否会随着时间的推移泄漏goroutines。所以 我想看看随着时间的推移有多少Goroutine在运行。有没有办法通过pprof 我已经完成了go-ofhttp://localhost:8888/debug/pprof/block 这给了我被阻止的时间,而不是运行了多少例程。正如icza指出的,答案是使用runtime.NumGoroutine()在浏览器中打开。您将看到两个相关链接:“goroutine”()和“完整goroutine堆栈转储”() 第一个将显示与一个

基本上,我想知道我的程序是否会随着时间的推移泄漏goroutines。所以 我想看看随着时间的推移有多少Goroutine在运行。有没有办法通过
pprof

我已经完成了
go-ofhttp://localhost:8888/debug/pprof/block


这给了我被阻止的时间,而不是运行了多少例程。

正如icza指出的,答案是使用
runtime.NumGoroutine()
在浏览器中打开。您将看到两个相关链接:“goroutine”()和“完整goroutine堆栈转储”()

第一个将显示与一个条目共享相同代码的所有goroutine,这些goroutine的数量在其名称之前。例如:

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中都有一个,这就是@之前的1的意思

完整转储对于查找泄漏非常有用,它将分别向您显示每个goroutine,以及它的堆栈跟踪和正在执行的操作(例如,它等待从通道接收的时间):

  • 如上所述,我们完全可以使用
    runtime.NumGoroutine()
    获取当前处于运行或等待状态的goroutine数

  • 我们可以使用
    Lookup
    函数获取多个配置文件。它们可以是预定义的配置文件,如goroutine、heap、allocs、mutex等,也可以是自定义配置文件。更多

  • 我们可以将
    WriteTo链接到
    Profile
    上定义的
    method,以写入标准输出或文件。示例
    pprof.Lookup(“goroutine”).WriteTo(writer,2)
  • 这将为您提供关于每个围棋程序的重要细节,如等待的时间、等待的内容、睡眠等
  • 你可以利用这些信息指出真正的问题所在

您知道哪个返回当前存在的goroutine数吗?当debug=1时,@之后的地址表示什么(“0x42f223 0x42f2e4 0x40542f 0x404f4b 0x4a0586 0x4600a1”)未回答“是否有任何方法通过pprof实现此目的?”
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