这是我参与「第五届青训营」伴学笔记创作活动的第 8 天
下面相关内容仅供本人回顾使用。如有错误,烦请评论反馈,感激不尽!!!
性能调优简介
性能调优原则:
- 依靠数据而非猜测
- 找到决速反应,而非细枝末节
- 不要过早和过度的优化
性能分析工具pprof实战
说明:
- 我们希望知道应用在什么地方耗费了多少CPU/Memory
- pprof是用于可视化和分析性能、分析数据的工具
接下来的内容包括:
- pprof功能简介
- pprof排查实战
- pprof的采样过程和原理
pprof功能简介
pprof排查实战,搭建pprof实践项目
例子:https://github.com/wolfogre/go-pprof-practice
运行后打开http://localhost:6060/debug/pprof可以查看数据,但是可读性很差
采样数据说明:
- allocs:内存分配情况
- blocks:阻塞操作情况
- cmdline:程序启动命令及
- goroutine:当前所有goroutine的堆栈信息
- heap:堆上内存使用情况(同alloc)
- mutex:锁竞争操作情况
- profile: CPU占用情况
- threadcreate:当前所有创建的系统线程的堆栈信息
- trace:程序运行跟踪信息
这时候我们就需要通过pprof工具来帮忙查看了,其采样结果是将一段时间内的信息汇总输出到文件中,所以首先需要拿到这个profile文件,可以直接使用暴露的接口链接下载文件后使用,也可以直接用pprof工具链接这个接口下载需要的数据。
terminal中输入命令go tool pprof + <采样链接>来启动采样
例如:go tool pprof -http=:8083 "http://localhost:6060/debug/pprof/profile?seconds=10""
链接结尾的profile代表采样的对象是CPU使用,如果直接在浏览器里打开这个链接,会启动一个60s的采样,并在结束后下载文件,这里加上seconds=10来让其采样10秒,随后采样数据就记录和下载完成了,并展示出pprof终端。
值得一提的是,如果出现端口占用,可以输入netstat -ano来查看端口占用情况
其他的一些内容:
- 输入
top可以查看CPU占用最高的函数,参数说明:
- 如果只需要查看最高的N个函数,则输入
topN即可 - 命令
list根据指定的正则表达式查找代码行,例如list Eat - 命令
web调用关系可视化,生成一张调用关系图,会默认使用浏览器打开,非常直观
这个时候,虽然CPU已经降下来了,但是内存依然很高,其实是堆内存很高。
再次启动pprof工具,这时候链接的结尾是heap,等待采样完成后,浏览器会自动按打开,还是会展示出web视图,同时,展示的资源使用从CPU时间变成了内存占用。
把问题代码注释掉之后,性能明显提高了。
更加细节的问题请参考一文搞懂pprof - 知乎 (zhihu.com)
pprof采样过程与原理
Heap:
- 采样程序通过内存分配器在堆上分配和释放的内存,记录分配/释放的大小和数量
- 采样率:每分配512KB记录一次,可在运行开头修改,1为每次分配均记录
- 采样时间:从程序运行开始到采样时
- 采样指标:
alloc_space, alloc_objects, inuse_space, inuse_objects - 计算方式:
inuse = alloc - free
性能调优案例
简介:
介绍实际业务服务性能优化的案例;
对逻辑相对复杂的程序如何进行性能调优;
主要分为以下三个方面:
- 业务服务优化
- 基础库优化
- Go语言优化
业务服务优化
基本概念:
- 服务:能单独部署,承载一定功能的程序
- 依赖:Service A的功能实现依赖,Service B的响应结果,称为Service A依赖Service B
- 调用链路:能支持一个接口请求的相关服务集合及其相互之间的依赖关系
- 基础库:公共的工具包、中间件
流程:
- 建立服务性能评估手段
- 分析性能数据,定位性能瓶颈
- 重点优化项改造
- 优化效果验证