Golang性能分析
Golang性能分析
pprof
web查看必备工具
brew install graphviz
sudo apt install graphviz
sudo yum install graphviz
# 验证是否安装成功
dot -version
http://localhost:6010/debug/pprof/
执行时间分析
net/http/pprof
package main
import (
"log"
"net/http"
_ "net/http/pprof" //在初始化导包的时候,pprof 包会自动注册 handler
"time"
)
func main() {
go func() {
//todo pprof
http.ListenAndServe(":6010", nil)
}()
//业务代码
}
而后通过浏览器访问即可查看,注:如果用了框架的话也没有关系,监听不同的端口,通过不同的端口访问即可.
- 直接访问总列表,该内容是原始数据,展示效果不太友好
http://localhost:6010/debug/pprof/
报告类型
allocs 和 heap 采样的信息类似,不过前者是所有对象的内存分配,而 heap 则是活跃对象的内存分配
序号 | 报告类型 | 备注 |
---|---|---|
1 | allocs | 过去所有内存分配的样本 |
2 | block | 导致同步原语阻塞的堆栈跟踪 |
3 | cmdline | 当前程序的命令行调用 |
4 | goroutine | 所有当前goroutine的堆栈痕迹 |
5 | heap | 活动对象的内存分配抽样。您可以指定gc GET参数,以便在获取堆样本之前运行gc。 |
6 | mutex | 争用互斥锁持有者的堆栈跟踪 |
7 | profile | CPU配置文件。可以以秒为单位指定持续时间。获得概要文件后,使用go工具pprof命令来研究概要文件。 |
8 | threadcreate | 导致创建新的操作系统线程的堆栈跟踪 |
9 | trace | 当前程序的执行轨迹。可以以秒为单位指定持续时间。获得跟踪文件后,使用go工具跟踪命令来调查跟踪。 |
通过web访问,展示格式更丰富,选项更多,还有火焰图等 [推荐]
go tool pprof URL 会将文件自动下载下来,默认到~/pprof/目录下每请求一次生成一个gz文件.
后续可以使用go tool pprof ./fileName进入命令行来继续使用,也可对比不同的文件分析两次的差异.
# 每秒将远程的信息下载到本地,并且提供一个本地的8080端口以供web访问,同时会自动打开浏览器访问
go tool pprof --http=localhost:7010 --seconds=11 http://localhost:6010/debug/pprof/heap
# 同上,但是未设置动态概要文件的时间长度
go tool pprof --http=:5010 localhost:6010/debug/pprof/allocs
go tool pprof --http=:5011 localhost:6010/debug/pprof/block
go tool pprof --http=:5012 localhost:6010/debug/pprof/cmdline
go tool pprof --http=:5013 localhost:6010/debug/pprof/goroutine
go tool pprof --http=:5014 localhost:6010/debug/pprof/heap
go tool pprof --http=:5015 localhost:6010/debug/pprof/mutex
go tool pprof --http=:5016 localhost:6010/debug/pprof/profile
go tool pprof --http=:5017 localhost:6010/debug/pprof/threadcreate
go tool pprof --http=:5018 localhost:6010/debug/pprof/trace
# 同上,不过是访问本地的数据
go tool pprof --http=:5020 ./pprof.main.alloc_objects.alloc_space.inuse_objects.inuse_space.049.pb.gz
- 命令行访问
go tool pprof http://localhost:6010/debug/pprof/heap
wget -O trace.out localhost:6010/debug/pprof/trace
go tool trace --http=:5010 trace.out
命令行标题含义
lat--- 该函数占时
flat% --- 该函数相对于总耗时的百分比
sum% --- 前面累计每一行flat 占比
cum --- 该函数以及该函数调用的其他函数总耗时
cum% --- 对应的百分比
pprof常用参数
-http在主机:在本地提供一个web服务用来查看。如上面的--http=:5010
Host是可选的,默认为'localhost'。
端口是可选的,默认情况下是随机可用的端口。
-no_browser跳过为交互式web UI打开浏览器。
-tools对象工具的搜索路径
-inuse_space同-sample_index=inuse_space 查看正在使用的内存
-inuse_objects同-sample_index=inuse_objects
-alloc_space同-sample_index=alloc_space 查看全部历史内存分配统计,可以通过这个指标确定大量内存用在哪些地方
-alloc_objects同-sample_index=alloc_objects
-total_delay同-sample_index=delay
-contentions同-sample_index=contentions
-mean_delay同-mean -sample_index=delay
-diff_base source基本配置文件的源文件,用于比较
-base source用于减形的基本轮廓源
-seconds基于时间的配置文件收集时间
pprof命令行命令
进入命令行后可通过以下参数进行输出不同的格式
常用展示格式
top N
本地取样计数排名列表: 在默认情况下,top命令会输出以本地取样计数为顺序的列表, 默认是10个
web
生成一个svg文件,然后自动调用本地工具打开(一般是浏览器)
png
生成一个png文件,自动保存到当前目录下.
list 函数名
结合top,可以直接定位到消耗资源的代码处
traces
列出函数的调用栈
一般首先通过profile,定位cpu消耗暂时较大的函数,然后通过heap定位内存占用较大的函数逻辑。
其他展示格式
-callgrind以callgrind格式输出图形
-comments输出所有配置文件注释
-disasm输出带有示例注释的程序集清单
-dot以DOT格式输出图形
-eog通过eog可视化图形
-evince通过evince可视化图形
-gif输出GIF格式的图形图像
-gv通过gv可视化图形
-kcachegrind在KCachegrind可视化报告
-list输出与regexp匹配的带注释的函数源
-pdf以PDF格式输出图形
-peek匹配regexp的函数的输出调用者/调用者
-png输出PNG格式的图形图像
-proto以压缩的protobuf格式输出配置文件
-ps输出PS格式的图形
-raw输出原始配置文件的文本表示形式
-svg以SVG格式输出图形
-tags输出配置文件中的所有标记
-text以文本形式输出顶部条目
-top以文本形式输出top条目
-topproto以压缩的protobuf格式输出top项
-trace以文本形式输出所有概要文件示例(列出函数的调用栈)
-tree输出调用图的文本呈现
-web通过web浏览器可视化图形
-weblist在浏览器中显示带注释的源代码
参数的选项
粒度
-functions在函数级聚合。
-filefunctions在函数级聚合。
-files在文件级进行聚合。
-lines在源代码行级别聚合。
-address在地址级进行聚合。
排序
-cum根据累积权重对条目进行排序
-flat根据自己的权重对条目进行排序
runtime/pprof
package main
import (
"log"
"os"
"runtime/pprof"
)
func main() {
fc, err := os.OpenFile("./cpu.pprof", os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
log.Fatal(err)
}
fm, err := os.OpenFile("./mem.pprof", os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(fc)
//内存消耗分析
pprof.WriteHeapProfile(fm)
pprof.StopCPUProfile()
fc.Close()
}
进入命令行
go tool pprof ./cpu.prof
之后的命令行操作与上面的一样,这里就不再赘述了
对比
- go tool pprof XXX间隔一段时间采集文件, 对比是否存在明显的增加.
- go tool pprof -base file1 file2 对比两个文件,top或web获取对比.
本文来自博客园,作者:我爱吃炒鸡,转载请注明原文链接:https://www.cnblogs.com/chinaliuhan/p/15079817.html