gpt4 book ai didi

go - “go test -cpuprofile”不会生成完整的跟踪

转载 作者:行者123 更新时间:2023-12-01 20:18:48 25 4
gpt4 key购买 nike

问题
我有一个go包,带有一个测试套件。
当我为此包运行测试套件时,总运行时间约为7秒:

$ go test ./mydbpackage/ -count 1
ok mymodule/mydbpackage 7.253s
但是,当我添加 -cpuprofile=cpu.out选项时,采样无法涵盖整个运行过程:
$ go test ./mydbpackage/ -count 1 -cpuprofile=cpu.out
ok mymodule/mydbpackage 7.029s

$ go tool pprof -text -cum cpu.out
File: mydbpackage.test
Type: cpu
Time: Aug 6, 2020 at 9:42am (CEST)
Duration: 5.22s, Total samples = 780ms (14.95%) # <--- depending on the runs, I get 400ms to 1s
Showing nodes accounting for 780ms, 100% of 780ms total
flat flat% sum% cum cum%
0 0% 0% 440ms 56.41% testing.tRunner
10ms 1.28% 1.28% 220ms 28.21% database/sql.withLock
10ms 1.28% 2.56% 180ms 23.08% runtime.findrunnable
0 0% 2.56% 180ms 23.08% runtime.mcall
...
看收集的 sample :
# sample from another run :
$ go tool pprof -traces cpu.out | grep "ms " # get the first line of each sample
10ms runtime.nanotime
10ms fmt.(*readRune).ReadRune
30ms syscall.Syscall
10ms runtime.scanobject
10ms runtime.gentraceback
...
# 98 samples collected, for a total sum of 1.12s
我看到的问题是:由于某种原因,采样探查器停止收集样本,或者在某个时候被阻止/放慢了速度。
上下文
go版本是1.14.6,平台是linux/amd64
$ go version
go version go1.14.6 linux/amd64
该软件包包含与数据库交互的代码,并且测试针对实时Postgresql服务器运行。
我尝试过的一件事: t.Skip()在内部调用 runtime.Goexit(),所以我用一个简单的 t.Skip替换了对 return和变体的调用;但这并没有改变结果。
问题
为什么不收集更多样本?我有一些已知的模式会阻止/减慢采样器速度,或者比应早终止采样器?

最佳答案

@Volker在他的评论中引导我找到了答案:-cpuprofile创建一个配置文件,其中仅对使用CPU的goroutine进行采样。
在我的用例中:我的go代码花费大量时间等待postgresql服务器的答案。
使用go test -trace=trace.out生成跟踪,然后使用go tool trace -pprof=net trace.out > network.out提取网络阻止配置文件会产生更多相关信息。
作为引用,除了使用go tool trace trace.out打开完整跟踪外,以下是您可以传递给-pprof=的值:

from go tool trace docs :

  • net: network blocking profile
  • sync: synchronization blocking profile
  • syscall: syscall blocking profile
  • sched: scheduler latency profile

关于go - “go test -cpuprofile”不会生成完整的跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63279228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com