课程概述
- 介绍编码规范,帮助大家写出高质量程序
- 介绍 Go 语言的性能优化建议,分析对比不同方式对性能的影响和背后的原理
- 讲解常用性能分析工具 pprof 的使用和工作原理,熟悉排查程序性能问题的基本流程
- 分析性能调优实际案例,介绍实际性能调优时的工作内容
ppt地址:高质量编程与性能调优实战.pptx - 成电飞书云文档 (feishu.cn)
该笔记主要是想记录一下pprof的操作,操作流程是按以上ppt操作步骤进行
1. 高质量编程
高质量:正确性、可靠性、简洁、清晰
编程原则:简单性、可读性、生产力
编码规范和性能优化可参考:【Go 语言原理与实践学习资料(上)】第三届字节跳动青训营-后端专场 - 掘金 (juejin.cn)
使用benchmark基准测试能够测试代码性能
$ go test -bench="Benchmark" -benchmem
2. 性能调优工具pprof
使用代码地址:github.com
浏览器查看:
先go run main.go
在浏览器打开 http://localhost:6060/debug/pprof 可以看到如下界面
各部分含义:
- allocs:内存分配情况
- blocks:阻塞操作情况
- cmdline:程序启动命令
- goroutine:当前所有goroutine的堆栈信息
- heap:堆上内存使用情况(同allocs)
- mutex:锁竞争操作情况
- profile:CPU占用情况
- threadcreate:当前所有创建的系统线程的堆栈信息
- trace:程序运行跟踪信息
cpu
首先排查cpu问题,在终端使用命令启动采样
$ go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
过一会后会进入pprof终端,输入命令
topN:查看占用资源最多的函数
各部分含义:
- flat:当前函数本身的执行耗时
- flat%:falt占cpu总时间的比例
- sum%:上面每一行的flat%总和
- cum:指当前函数本身加上其调用函数的总耗时
- cum%:cum占cpu总时间的比例
flat == cum:函数中没有调用其它函数
flat == 0,函数中只有其他函数调用
可以看到上面占用cpu最多的是Eat函数,可以输入命令
list Eat:查看具体函数
list命令会根据后面给定的正则表达式查找代码,并按行展示出每一行的占用
输入命令
web:生成调用关系图,默认用浏览器打开
第一次使用会报错:
failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in %PATH%
原因是需要安装graphviz
安装参考:
(20条消息) 给小白准备的graphviz图文安装教程(2021最新)_大闸謝Gemini的博客-CSDN博客_graphviz安装
输入web
q退出pprof终端
heap
排查堆内存占用情况,在终端使用命令,可以开启pprof自带的web UI
$ go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
注意:变化的地方是-http=:8080、url后缀为heap
VIEW里面可以查看不同视图
TOP视图:
SOURCE视图:
在SAMPLE菜单中,有四种指标:
- alloc_objects:程序累计申请的对象数
- alloc_space:程序累计申请的内存大小
- inuse_objects:程序当前持有的对象数
- inuse_space:程序当前占用的内存大小
goroutine
$ go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
可以看到调用关系图
在VIEW菜单中切换到Flame Graph视图,可以转化为火焰图
- 由上到下表示调用顺序
- 每一块代表一个函数,越长代表占用CPU时间更长,消耗资源占比越多
- 火焰图是动态的,支持点击块进行分析
mutex
$ go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"
block
$ go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"
操作基本都一样