这是我参与「第五届青训营 」笔记创作活动的第4天。注:笔记大部分图片内容及代码段为青训营课程视频提供,仅交流,不得做个人使用
一、本节主要内容
性能优化分析工具
二、本节详细内容
本节主要介绍性能调优原则和pprof工具的功能说明、实践应用以及采样过程和原理。
简介
性能调优原则
要依靠数据不是猜测
要定位最大瓶颈而不是细枝末节
不要过早优化
不要过度优化
性能分析工具pprof
- 说明 希望知道应用在什么地方耗费了多少CPU、Memory。 pprof是用于可视化和分析性能分析数据的工具
pprof功能简介 | pprof排查实战 | pprof的采样过程和原理
pprof功能简介
pprof排查实战
- 搭建pprof实践项目
GitHub(来自Wolfogre)
https: //github.com/wolfogre/go-pprof-practice
项目提前埋入了一些炸弹代码,产生可观测的性能问题
- 浏览器查看指标
默认情况不容易分辩内容,需要一些方向方便排查
主要针对学习这几个方面
可先通过任务管理器查看运行情况
pprof提供命令采集数据
go tool pprof "http:/localhost:6060/debug/pprof/profile?seconds=10" //设置10s时间情况下
当运行完成后,可使用topN命令 查看占用资源最多的函数
思考?
Flat ==Cum,函数中没有调用其他函数| Flat==0,函数中只有其他函数的调用
使用list命令 根据指定的正则表达式查找代码行
可通过web命令,将调用关系在网页中打开可视化关系图
“解决”掉占用cpu的代码后,可以见到任务管理器中的变化。接下来我们针对内存消耗进行优化。
- Heap堆内存
go tool pprof -http=: 8080 "http://localhost:6060/debug/pprof/heap"使用时加上-http=: 8080参数以及/heap后缀可以得到直观的示意图VIEW工具栏提供多种不同的显示方式,可根据我们的需求选择。
Top视图
Source视图
“解决”了占用内存过大的代码后
Sample工具栏提供各种类型占用查看
Source视图查看alloc space分配内存状况,发现待优化目标
- goroutine 协程 goroutine泄露也会导致内存泄露
go tool pprof -http=: 8080 "http: //localhost:6060/debug/pprof/goroutine'
后缀改成goroutine
逻辑图
flane火焰图
由上到下表示调用顺序
每一块代表一个函数,越长代表占用CPU的时间更长
火焰图是动态的,支持点击块进行分析
在Source视图下搜索woft协程,发现问题
注释问题代码后的携程数
-
mutex-锁 命令
go tool pprof -http=:8080 "http:/localhost:6060/debug/pprof/mutex"graph和source视图结果注释出问题的mutex后,mutex变为0
我们接下来继续解决block
-
Block-阻塞 命令
go tool pprof -http=: 8080 "http://localhost:6060/debug/pprof/block"source视图
排查时的2个block,为什么此时只显示了一个
pprof会自动默认过滤一些占比不重要的部分
若需要查看,可通过点击block按钮进入详细界面
- 小结
重要部分