1.17笔记「Go 高质量编程与性能调优」课程4:性能调优实战案例| 青训营笔记day7

79 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7天  课程内容为:性能调优实战案例。

性能分析工具pprof

采样过程和原理

CPU
采样对象:函数调用和它们占用的时间
采样率:100次/秒,固定值
采样时间:从手动启动到手动结束
开始采样 → 设定信号处理函数 → 开启定时器
停止采样 → 取消信号处理函数 → 关闭定时器

操作系统 每10ms向进程发送一次SIGPROF信号
进程 每次接收到SIGPROF会记录调用堆栈
写缓冲 每100ms读取已经记录的调用栈并写入输出流

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

Goroutine-协程&ThreadCreate-线程创建
Goroutine:记录所有用户发起且在运行中的 goroutine (即入口非runtime开头的) runtime.main 的调用栈信息
ThreadCreate:记录程序创建的所有系统线程的信息
Goroutine : Stop The World → 遍历allg切片 → 输出创建g的堆栈 → Start The World
ThreadCreate : Stop The World → 遍历allm链表 → 输出创建m的堆栈 → Start The World

Block-阻塞 & Mutex-锁
阻塞操作
采样阻塞操作的次数和耗时
采样率:阻塞耗时超过阈值的才会被记录,1为每次阻塞均记录
锁竞争
采样争抢锁的次数和耗时
采样率:只记录固定比例例的锁操作,1为每次加锁均记录

小结

掌握常用 pprof 工具功能
灵活运用 pprof 工具分析解决性能问题
了解 pprof 的采样过程和工作原理

性能调优案例

简介
介绍实际业务服务性能优化的案例
对逻辑相对复杂的程序如何进行性能调优

业务服务优化

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

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

建立服务性能评估手段
服务性能评估方式 : 单独 benchmark 无法满足复杂逻辑分析 不同负载情况下性能表现差异

请求流量构造 : 不同请求参数覆盖逻辑不同 线上真实流量情况

压测范围 : 单机器压测 集群压测

性能数据采集 : 单机性能数据 集群性能数据

基础库优化

AB实验SDK的优化
分析基础库核心逻辑和性能瓶颈 : 设计完善改造方案 数据按需获取

数据序列化协议优化 : 内部压测验证 推广业务服务落地验证

Go 语言优化

编译器&运行时优化
优化内存分配策略 : 优化代码编译流程,生成更高效的程序 内部压测验证 推广业务服务落地验证
优点 : 接入简单,只需要调整编译配置 通用性强

总结

性能调优原则 : 要依靠数据不是猜测
性能分析工具 pprof : 熟练使用 pprof 工具排查性能问题并了解其基本原理
性能调优 : 保证正确性 定位主要瓶颈