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和时间,找到我们的性能瓶颈。 
这里写图片描述

2 使用web命令生成svg图

在30s等待之后,我们使用web命令生成svg图,查看软件的流程以及性能瓶颈

注意在生成svg时需要先安装graphviz-2.38 
工具用来绘制图。安装graphviz-2.38时需要将bin目录放到path下。。最后将生成svg图片用浏览器打开查看即可。这里写图片描述

3heap相关信息

我们可以使用上述命令,查看内存中正在使用的一些内存信息,可以看到消耗内存的函数主要是哪些。 
这里写图片描述

使用上述命令查看内存对象分配的一些相关信息,从而得知,是什么地方创建对象消耗内存。 
这里写图片描述

  • top -cum

通过在上述命令,能够明确函数的调用过程中内存消耗的情况。 
这里写图片描述