这是我参与「第五届青训营 」笔记创作活动的第三天,在本日的学习中,主要了解到了有关编码规范、注释以及调优的内容。其中,性能分析工具pprof的作用肯定是不可小觑的。下面就简单地写一下pprof的简单使用方法。
pprof简介
首先,pprof 是Go语言自带的、用于可视化分析性能的工具,他能以数据和可视化图像的形式分析诸如CPU占用、内存占用等方面的性能问题。该工具分为两个版本,分别是:
runtime/pprof:采集单机应用程序的运行数据进行分析,通过用户主动调用函数收集数据到文件中进行分析。
net/http/pprof:采集在线服务程序的运行数据进行分析,通过程序自动采集运行时数据并开启一个服务端口给用户查看性能数据进行分析。
基于课程,这里只简单介绍net/http/pprof的使用方法。
net/http/pprof
对较一般的在线服务项目,比如前面课程的proxy项目(socks5服务模拟),我们可以先在main包中引入pprof:
import (
"net/http"
_ "net/http/pprof"
)
然后在主函数一开始加入下面的语句开启端口:
go func() {
if err := http.ListenAndServe(":6060", nil); err != nil {
log.Fatal(err)
}
os.Exit(0)
}()
这样在程序运行后,我们就能通过命令行或网页访问监测数据了。
命令行中我们可以通过go tool pprof http://127.0.0.1:6060/debug/XXX来访问相应数据监控端口,其中XXX就是我们需要分析的数据,常用的如下:
XXX | 描述 |
|---|---|
profile | CPU占用情况相关数据 |
heap | 堆内存使用情况相关数据 |
allocs | 内存累计分配情况相关数据 |
goroutine | 协程堆栈情况相关数据 |
mutex | 锁争用情况相关数据 |
block | 阻塞情况相关数据 |
需要注意的是,如果要进行mutex和block的监测,需要额外在程序中加入下面的语句:
runtime.SetMutexProfileFraction(1) // 开启对锁调用的跟踪
runtime.SetBlockProfileRate(1) // 开启对阻塞操作的跟踪
命令行输入完后,进入(pprof)开头的监测空间,标准流程是top、list、web三连命令找出问题。
top命令用于列出占用资源前几的函数,list func_name命令用于列出某个函数具体某一行的占用是多少,而web命令则是打开函数的调用-占用示意图,帮助我们可视化地找出问题函数。
还有就是,web命令依赖于graphviz工具,如果提示错误要按需下载安装。
当然,如果觉得这样太麻烦,也可以用命令行直接打开可视化界面进行浏览:
go tool pprof -http=:8080 "127.0.0.1:6060/debug/pprof/XXX"
在打开的页面中,就能轻松看到上面三连命令的界面,也能打开调用火焰图等其他分析工具进行分析监测。
当然,有的在线服务项目并没有那么简单。比如说之前我们做的简易青训营话题页项目,因为其本身就用到了gin来开启页面服务,会与pprof产生一定的冲突,所以不能简单地使用上面的方法,而是要考虑gin-contrib/pprof包里集成的pprof来进行分析。总的来说,就是具体情况具体讨论。