go的pprof可以用来对服务的性能进行检测,其中net/http/pprof包用来检测web服务器的相关的性能的分析,包括goroutine的数量,heap的大小问题。
简单使用package main
import (
"fmt"
"log"
"net/http"
_ "net/http/pprof"
"time"
)
func main() {
// 开启pprof
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
go hello()
select {}
}
func hello() {
for {
go func() {
fmt.Println("hello word")
}()
time.Sleep(time.Millisecond * 1)
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
如上所示,实现了一个简单函数,在for循环内部不停的创建go 并调用IO输出hello word。
在主函数的内部通过http.ListenAndServe(“localhost:6060”, nil) 监听6060端口,等待用户查看相关的性能信息.
一定要注意包含_ “net/http/pprof”这个包。。
以上代码就实现了一个pprof监控性能的代码,我们只需要在浏览器中执行http://localhost:6060/debug/pprof/
就会得到相对应的程序的信息。
结果如下
由此可见,我们这个程序此时正有六个go协程正在运行。
上述是我们对pprof的简单使用,我们还可以通过使用go tool pprof 对这个程序进行更详尽的性能的分析。
主要分析的内容包括:
关于golang运行环境heap的信息、内存mem等
http://localhost:6060/debug/pprof/heap
关于pprof和cpu的相关信息
http://localhost:6060/debug/pprof/profile
我们通过使用这两个命令,在我们的cmd下执行得到相关的信息。
1 使用callgrind 命令和qcachegrind查看性能以查看cpu信息为例:
(1)启动我们的web服务器,
(2)在cmd下执行:go tool pprof http://localhost:6060/debug/pprof/profile 命令,并等待30s,让其收集我们的web服务器的相关性能
(3)
执行完毕,他提示我们使用help命令查看相关的命令。这里我们可以使用callgrind命令将web服务的相关CPU信息输出为一个.out文件
需要注意的是我们需要安装qcachegrind工具来查看我们输出的文件。
注意该.out文件存放到我们当前用户目录下,或者cmd所在的目录。。
在qcachegrind下,我们可以详细的看当前服务,那个函数耗费了多少的cpu和时间,找到我们的性能瓶颈。
在30s等待之后,我们使用web命令生成svg图,查看软件的流程以及性能瓶颈
注意在生成svg时需要先安装graphviz-2.38
工具用来绘制图。安装graphviz-2.38时需要将bin目录放到path下。。最后将生成svg图片用浏览器打开查看即可。
我们可以使用上述命令,查看内存中正在使用的一些内存信息,可以看到消耗内存的函数主要是哪些。
使用上述命令查看内存对象分配的一些相关信息,从而得知,是什么地方创建对象消耗内存。
- top -cum
通过在上述命令,能够明确函数的调用过程中内存消耗的情况。