在Go语言中.如果想要进行性能优化.则可以使用Go语言自带的性能分析工具--pprof.pprof是一个强大的性能分析工具.可以捕捉到多维度的运行状态数据,它也是一个CPU分析器.是gperftools工具的一个组件.由谷歌工程师为分析多线程的程序所开发.pprof是Go语言分析的利器.其使用方式有如下两种.

runtime/pprof:
采集程序的运行数据进行分析.
net/http/pprof:
采集Http服务器的运行数据进行分析.
pprof作用:
CPU分析:
按照一定的频率采集监听的应用程序CPU使用情况.可确定应用程序在主动消耗CPU周期时花费的时间,
内存分析:
在应用程序堆栈分配时记录跟踪.用于监视当前和历史内存使用情况.检查内存泄漏情况.
阻塞分析:
记录goroutine阻塞等待同步的位置.
互斥锁分析:
报告互斥锁的竞争情况.
pprof使用方式:
一般情况下.获取profile数据主要有两种形式:Web形式与profile文件生成形式.
Web形式:
go
package main
import (
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
//性能分析.
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
//实际业务代码.
for {
Sum("This is a test")
}
}
func Sum(s string) string {
data := []byte(s)
sData := string(data)
var sum = 0
for i := 0; i < 10000; i++ {
sum += i
}
return sData
}
执行代码后,net/http/pprof包的init函数中注册了以下路由到Http服务中.然后用浏览器访问http://localhost:6060/debug/pprof/.即可使用pprof提供的功能.

allocs:
内存分配情况的采集信息.
blocks:
阻塞操作情况的采集信息.
cmdline:
显示程序启动明令及参数.
goroutine:
当前所有协程的的堆栈信息.
heap:
堆上内存使用情况的采集信息.
mutex:
锁争用情况的采集信息.
profile:
CPU占用情况的采集信息.
threadcreate:
系统线程创建情况的采集信息.
trace:
程序运行跟踪信息.

profile交互式终端文件形式:
不管是工具型应用还是服务型应用.使用相应的pprof库获取数据之后.下一步就是对数据进行分析.可以使用go tool pprof命令行工具进行分析.
go tool pprof [binary] [source]
lbinary:应用的二进制文件.用来解析各种符号.
lsource:表示profile数据的来源.可以是本地文件.也可以是Http地址.
go
package main
import (
"flag"
"log"
_ "net/http/pprof"
"os"
"runtime"
"runtime/pprof"
)
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
var memprofile = flag.String("memprofile", "", "write memory profile to file")
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
if err := pprof.StartCPUProfile(f); err != nil {
log.Fatal(err)
}
defer pprof.StopCPUProfile()
}
if *memprofile != "" {
f, err := os.Create(*memprofile)
if err != nil {
log.Fatal(err)
}
runtime.GC()
if err := pprof.WriteHeapProfile(f); err != nil {
log.Fatal(err)
}
defer f.Close()
}
}
对以上代码执行go run main.go -cpuprofile cpu.out -memprofile mem.out

go tool pprof cpu.out
go tool pprof mem.out
上面两个命令就可以进行分析.

lflat:
给定函数上的运行耗时.
lflat%:
给定函数上的CPU运行耗时占比.
lsum%:
给定函数累计使用CPU的总比例.
lcum:
当前函数加上它之前的调用运行总耗时.
cum%:
当前函数加上它之前的调用CPU运行耗时占比.

pprof是进行Go程序性能分析的有力工具.它通过采样 收集运行中的Go程序性能相关的数据生成profile文件.之后.提供三种不同的展现形式.得到性能数据后.可以使用top web list等命令行工具迅速定位到相应的代码处.并进行优化.
火焰图分析:

使用火焰图分析需要手动安装pprof原生工具.这是Google公司提供的一个工具.安装命令如下.
go get -u github.com/goole/pprof
启动火焰图可视化工具.
pprof -http= :8080 profile 文件名
访问web地址localhost:8080.如果上面的命令不加 -http =: 8080.则默认进入交互式控制台.输入命令web.生成一个文件自动启动浏览器.
火焰图竖轴表示调用栈.每一层都是一个函数.调用栈越深火焰越高.最底部是是正在执行的函数.上面是它的父函数.横轴表示这个函数的抽样数.一个函数在横轴占得越宽.代表抽样数越高.执行CPU时间越长.注意.横轴不代表时间.而是所有的调用栈合并后.按字母顺序排列.
火焰图就是看顶层的哪个函数占据的宽度最大.只要"平顶"就表示该函数可能存在性能问题.
语雀地址www.yuque.com/itbosunmian...?
《Go.》 密码:xbkk 欢迎大家访问.提意见.