性能调优实战 | 青训营笔记

87 阅读4分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 8 天

下面相关内容仅供本人回顾使用。如有错误,烦请评论反馈,感激不尽!!!

性能调优简介

性能调优原则:

  • 依靠数据而非猜测
  • 找到决速反应,而非细枝末节
  • 不要过早和过度的优化
性能分析工具pprof实战

说明:

  • 我们希望知道应用在什么地方耗费了多少CPU/Memory
  • pprof是用于可视化分析性能、分析数据的工具

接下来的内容包括:

  • pprof功能简介
  • pprof排查实战
  • pprof的采样过程和原理

pprof功能简介

image.png

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占用最高的函数,参数说明:

image.png

  • 如果只需要查看最高的N个函数,则输入topN即可
  • 命令list根据指定的正则表达式查找代码行,例如list Eat
  • 命令web调用关系可视化,生成一张调用关系图,会默认使用浏览器打开,非常直观 image.png

这个时候,虽然CPU已经降下来了,但是内存依然很高,其实是堆内存很高。

再次启动pprof工具,这时候链接的结尾是heap,等待采样完成后,浏览器会自动按打开,还是会展示出web视图,同时,展示的资源使用从CPU时间变成了内存占用。

把问题代码注释掉之后,性能明显提高了。

更加细节的问题请参考一文搞懂pprof - 知乎 (zhihu.com)

pprof采样过程与原理

image.png

image.png Heap:

  • 采样程序通过内存分配器在堆上分配和释放的内存,记录分配/释放的大小和数量
  • 采样率:每分配512KB记录一次,可在运行开头修改,1为每次分配均记录
  • 采样时间:从程序运行开始到采样时
  • 采样指标:alloc_space, alloc_objects, inuse_space, inuse_objects
  • 计算方式:inuse = alloc - free

image.png

image.png

性能调优案例

简介:

介绍实际业务服务性能优化的案例;

对逻辑相对复杂的程序如何进行性能调优;

主要分为以下三个方面:

  • 业务服务优化
  • 基础库优化
  • Go语言优化

业务服务优化

基本概念:

  • 服务:能单独部署,承载一定功能的程序
  • 依赖:Service A的功能实现依赖,Service B的响应结果,称为Service A依赖Service B
  • 调用链路:能支持一个接口请求的相关服务集合及其相互之间的依赖关系
  • 基础库:公共的工具包、中间件

流程:

  • 建立服务性能评估手段
  • 分析性能数据,定位性能瓶颈
  • 重点优化项改造
  • 优化效果验证

image.png