Golang:如何在 Web 服务器中使用 pprof 获取计算时间
Golang: How to get computing time using pprof within a web server
我构建了一个 Web 服务器并进行了 ab(apache 基准测试) 测试。现在我想知道每个部分的计算时间。
我用go tool pprof url:port/xxx
得到了这个程序的profile,但是没有告诉我计算时间(只有内存)。以下是结果:
(pprof) top10
1827.59MB of 1978.12MB total (92.39%)
Dropped 175 nodes (cum <= 9.89MB)
Showing top 10 nodes out of 48 (cum >= 43.50MB)
flat flat% sum% cum cum%
769.54MB 38.90% 38.90% 769.54MB 38.90% reflect.unsafe_New
459.08MB 23.21% 62.11% 459.08MB 23.21% services/semanticnew.TopicProbCounter.Update
189.17MB 9.56% 71.67% 1081.21MB 54.66% github.com/golang/protobuf/proto.(*Buffer).dec_slice_struct
122MB 6.17% 77.84% 122MB 6.17% github.com/golang/protobuf/proto.(*Buffer).dec_int32
107.56MB 5.44% 83.28% 107.56MB 5.44% github.com/garyburd/redigo/redis.(*conn).readReply
68.13MB 3.44% 86.72% 527.21MB 26.65% services/semanticnew.caculApPoiScore
40.51MB 2.05% 88.77% 40.51MB 2.05% runtime.malg
28.59MB 1.45% 90.22% 28.59MB 1.45% net/http.newBufioWriterSize
22.50MB 1.14% 91.35% 23MB 1.16% redismanage.(*Manager).getRequest
20.50MB 1.04% 92.39% 43.50MB 2.20% redismanage.(*Manager).GetRequest
在我的网络程序中,我添加了以下代码:
f, _ := os.Create("x.cpuprofile")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
但是还是不行。
我检查了 http://blog.golang.org/profiling-go-programs,但 xxx.prof
文件让我感到困惑。如何生成此 xxx.prof
文件?而作者用的是go tool pprof xxx xxx.prof
,是不是说xxx
就是xxx.go
生成的二进制文件呢?
无论如何,目标是获取计算时间,但是如何?我是否必须生成此 xxx.prof
文件才能实现此目标?
非常感谢
我已经成功地使用了德米特里的建议:https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs
You merely need to import net/http/pprof, and collect profiles with:
$ go tool pprof --text mybin http://myserver:6060:/debug/pprof/profile
net/http/pprof 被引入只是为了它的副作用,所以你可以使用
import (
...
_ "net/http/pprof"
)
除了 "mybin" 和 "myserver" 您还需要替换您的端口号并删除端口号后的尾随冒号。
例如。对于我的宠物项目,命令是
go tool pprof http://127.0.0.1:8000/debug/pprof/profile
然后您将创建一个 pprof 存档,您可以通过 pprof 以交互方式探索它,或者您可以使用外部工具 - 我个人更喜欢内置功能。
注意https://github.com/golang/go/issues/13841 and https://github.com/golang/go/issues/6047是pprof和部分内核结合存在的问题
我构建了一个 Web 服务器并进行了 ab(apache 基准测试) 测试。现在我想知道每个部分的计算时间。
我用go tool pprof url:port/xxx
得到了这个程序的profile,但是没有告诉我计算时间(只有内存)。以下是结果:
(pprof) top10
1827.59MB of 1978.12MB total (92.39%)
Dropped 175 nodes (cum <= 9.89MB)
Showing top 10 nodes out of 48 (cum >= 43.50MB)
flat flat% sum% cum cum%
769.54MB 38.90% 38.90% 769.54MB 38.90% reflect.unsafe_New
459.08MB 23.21% 62.11% 459.08MB 23.21% services/semanticnew.TopicProbCounter.Update
189.17MB 9.56% 71.67% 1081.21MB 54.66% github.com/golang/protobuf/proto.(*Buffer).dec_slice_struct
122MB 6.17% 77.84% 122MB 6.17% github.com/golang/protobuf/proto.(*Buffer).dec_int32
107.56MB 5.44% 83.28% 107.56MB 5.44% github.com/garyburd/redigo/redis.(*conn).readReply
68.13MB 3.44% 86.72% 527.21MB 26.65% services/semanticnew.caculApPoiScore
40.51MB 2.05% 88.77% 40.51MB 2.05% runtime.malg
28.59MB 1.45% 90.22% 28.59MB 1.45% net/http.newBufioWriterSize
22.50MB 1.14% 91.35% 23MB 1.16% redismanage.(*Manager).getRequest
20.50MB 1.04% 92.39% 43.50MB 2.20% redismanage.(*Manager).GetRequest
在我的网络程序中,我添加了以下代码:
f, _ := os.Create("x.cpuprofile")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
但是还是不行。
我检查了 http://blog.golang.org/profiling-go-programs,但 xxx.prof
文件让我感到困惑。如何生成此 xxx.prof
文件?而作者用的是go tool pprof xxx xxx.prof
,是不是说xxx
就是xxx.go
生成的二进制文件呢?
无论如何,目标是获取计算时间,但是如何?我是否必须生成此 xxx.prof
文件才能实现此目标?
非常感谢
我已经成功地使用了德米特里的建议:https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs
You merely need to import net/http/pprof, and collect profiles with:
$ go tool pprof --text mybin http://myserver:6060:/debug/pprof/profile
net/http/pprof 被引入只是为了它的副作用,所以你可以使用
import (
...
_ "net/http/pprof"
)
除了 "mybin" 和 "myserver" 您还需要替换您的端口号并删除端口号后的尾随冒号。 例如。对于我的宠物项目,命令是
go tool pprof http://127.0.0.1:8000/debug/pprof/profile
然后您将创建一个 pprof 存档,您可以通过 pprof 以交互方式探索它,或者您可以使用外部工具 - 我个人更喜欢内置功能。
注意https://github.com/golang/go/issues/13841 and https://github.com/golang/go/issues/6047是pprof和部分内核结合存在的问题