这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
性能调优实战
主要针对实际工作中对应用进行性能调优的介绍和实战,干货满满!
本文主要分为
- 调优介绍(调优原则)
- pprof——性能调优工具
- 性能调优实战
- 保证正确性
- 定位主要瓶颈
1 简介
基于下列的性能调优原则:
- 要依靠数据不是猜测。(需要有个标准去评估)
- 要定位最大瓶颈而不是细枝末节。(首要解决目标)
- 不要过早优化。
- 不要过度优化。
2 性能分析工具 pprof
介绍
背景:想知道什么地方耗费多少cpu、内存等资源
- pprof:用于可视化和分析性能以及分析数据的工具
功能介绍
搭建之前给github的pprof实践项目(需要有1cpu核心和超过1gb内存)
-
项目下载到本地后运行
go build,生成exe文件,双击使用 -
浏览器查看指标:
localhost:6060/debug/pprof
- 指标:allocs block heap mutex profile
2.2 排查实战
-
cpu
-
命令:topN 查看占用资源最多的函数
-
参数说明:
-
-
对于flat和cum参数
-
命令:list
- 根据指定的正则表达式查找代码行(可看到函数中循环占很多大多时间)
-
命令:web
- 调用关系可视化(可生成图)
-
-
Heap-堆内存
-
go tool pprof -http=:8080 “http://localhost:6060/debug/pprof/heap”在8080端口看到可视化内存占用图
-
top、source视图
-
sample中有四种采样说明:
- alloc_objects:程序累计申请的对象数
- alloc_space:程序累计申请的内存大小
- inuse_objects:程序当前持有的对象数
- inuse_space:程序当前占用的内存大小
-
-
goroutine-协程
-
在heap指令改后缀,从heap->goroutine
-
可视化
- 由上到下表示调用顺序
- 每一块代表一个函数,越长代表越占cpu
- 动态火焰图,能够点击分析
-
有搜索功能
-
-
mutex-锁
- 同样改后缀mutex
- 找阻塞block,解决相应问题
- 展示阻塞block并不会全部展示,占比小的函数忽略,便于开发者找到关键阻塞
2.3 采样过程和原理
对上面pprof工具的五个调优排查进行原理上的了解
3 性能调优案例
介绍:对逻辑复杂的程序通过案例展示如何调优。
程序从不同的应用层次上
- 业务服务
- 基础库
- Go语言本身
A. 业务服务
- 建立服务性能评估手段
- 分析性能数据,定位性能瓶颈
- 重点优化项改造
- 优化效果验证
B. 基础库
适用范围更广的就是基础库的优化。
在实际的业务服务中,为了评估某些功能上线后的效果,经常需要进行AB实验,看看不同策略对核心指标的影响,所以公司内部多数服务都会使用AB实验的SDK,如果能优化AB组件库的性能,所有用到的服务都会有性能提升。
分析基础库核心逻辑和性能瓶颈
- 设计完善改造方案
- 数据按需获取
- 数据序列化协议优化 最后,内部压测验证后进行推广服务落地,这就是AB实验对SDK的优化。
C. Go语言本身 编译器和其运行时的优化
- 优化内存分配策略(下一节)
- 优化代码编译流程,生成更高效的程序
- 内部压测验证
- 推广业务服务落地验证
优点:接入简单、只需要调整一些编译的配置,同时通用性强。
心得
内容很多,要花时间消化,不过获益匪浅
引用
ppt:高质量编程与性能调优实战 .pptx - 飞书云文档 (feishu.cn)