这是我参与「第五届青训营 」笔记创作活动的第5天
一、本堂课重点内容:
- 性能调优简介
- 性能分析工具
- pprof 功能说明
- pprof 实践
- pprof 的采样过程和原理
- 性能调优案例
二、详细知识点介绍:
性能调优简介
-
性能调优原则
- 要依靠数据不是猜测
- 要定位最大瓶颈而不是细枝末节
- 不要过早优化
- 不要过度优化
性能分析工具
性能调优的核心是性能瓶颈的分析,对于 Go 应用程序,最方便的就是 pprof 工具
-
pprof 功能说明
- pprof 是用于可视化和分析性能分析数据的工具
- 可以知道应用在什么地方耗费了多少 CPU、memory 等运行指标
-
pprof 实践
-
前置准备,熟悉简单指标,能够编译运行 pprof 测试项目
-
实际分析排查过程
-
排查 CPU 问题
-
命令行分析
- go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
-
top 命令
-
list 命令
-
熟悉 web 页面分析
-
调用关系图,火焰图
-
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/cpu"
-
-
排查堆内存问题
- go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
-
排查协程问题
- go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
-
排查锁问题
- go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"
-
排查阻塞问题
- go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"
-
-
pprof 的采样过程和原理
-
CPU 采样
-
堆内存采样
-
协程和系统线程采样
-
阻塞操作和锁竞争采样
-
三、实践练习例子:
举了一个关于性能调优的例子
-
性能调优案例
-
基本概念
- 服务:能单独部署,承载一定功能的程序
- 依赖:Service A 的功能实现依赖 Service B 的响应结果,称为 Service A 依赖 Service B
- 调用链路:能支持一个接口请求的相关服务集合及其相互之间的依赖关系
- 基础库:公共的工具包、中间件
-
业务优化
-
流程
- 建立服务性能评估手段
- 分析性能数据,定位性能瓶颈
- 重点优化项改造
- 优化效果验证
-
建立压测评估链路
- 服务性能评估
- 构造请求流量
- 压测范围
- 性能数据采集
-
分析性能火焰图,定位性能瓶颈
- pprof 火焰图
-
重点优化项分析
- 规范组件库使用
- 高并发场景优化
- 增加代码检查规则避免增量劣化出现
- 优化正确性验证
-
上线验证评估
- 逐步放量,避免出现问题
-
进一步优化,服务整体链路分析
- 规范上游服务调用接口,明确场景需求
- 分析业务流程,通过业务流程优化提升服务性能
-
-
基础库优化
-
适应范围更广,覆盖更多服务
-
AB 实验 SDK 的优化
- 分析基础库核心逻辑和性能瓶颈
- 完善改造方案,按需获取,序列化协议优化
- 内部压测验证
- 推广业务服务落地验证
-
-
Go 语言优化
-
适应范围最广,Go 服务都有收益
-
优化方式
-
优化内存分配策略
-
优化代码编译流程,生成更高效的程序
-
内部压测验证
-
推广业务服务落地验证
-
-
四、课后个人总结:
今天我学习了性能调优,比较轻松。