高质量编程与性能调优(四)|zo的笔记|青训营笔记

106 阅读5分钟

这是我参与「第五届青训营 」笔记创作活动的第5天。注:笔记大部分图片内容及代码段为青训营课程视频提供,仅交流,不得做个人使用

一、本节主要内容

性能优化分析工具pprof
性能调优案例

二、本节详细内容

性能分析工具pprof采样过程和原理

CPU | 堆 | 协程、线程 | Block & mutex

性能调优案例

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

CPU 采样

采样对象:函数调用和它们占用的时间
采样率:100次/秒,固定值
采样时间:从手动启动到手动结束

image.png

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

image.png

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

go的gc(gabage collection)有自己的机制,上述采样只能得到在堆上的内存。栈上或底层的内存接收不到。

  • Groutine协程& ThreadCreat-线程创建

-Goroutine ·记录所有用户发起且在运行中的goroutine(即入口非runtime开头的) runtime.main调用的栈信息

-ThreadCreate ·记录程序创建的所有系统线程的信息

image.png

  • Block-阻塞 & Mutex-锁 阻塞操作
采样阻塞操作的次数和耗时
采样率:阻塞耗时超过阈值的才会被记录(阈值可手动设置),1时为每次阻塞均记录

image.png

锁竞争
·采样争抢锁的次数和耗时
采样率:只记录固定比例的锁操作,1为每次加锁均记录
  • 小结 后续深入学习方向
掌握常用pprof工具功能
灵活运用pprof工具分析解决性能问题
了解pprof的采样过程和工作原理

性能调优案例

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

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

性能调优案例-业务服务优化

· 基本概念

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

image.png

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

benchmark可以对部分性能进行分析,但我们需要对于整体有一个分析方式;我们要对于服务性能有足够的了解,再利用pprof等工具寻找瓶颈;寻找占用资源较多的;不断提升效率

  • 建立服务性能评估手段
服务性能评估方式
·单独benchmark无法满足复杂逻辑分析
·不同负载情况下性能表现差异
请求流量构造
·不同请求参数覆盖逻辑不同
·线上真实流量情况
压测范围
·单机器压测
·集群压测性能
数据采集
·单机性能数据
·集群性能数据

单机压力逐渐增大时qps情况 image.png

实际项目火焰图 image.png 合理利用交互点击

压力测试可视化报告 image.png 根据数据结果发现我们需要调优的问题

  • 使用库不规范 的问题 发现问题 多余的json解析 image.png 无用的日志 image.png

高并发场景优化不足 image.png image.png

  • 重点优化项改造 正确性是基础
响应数据diff(若优化前后响应结果差异不大则说明优化对功能影响不大)
线上请求数据录制回放
新旧逻辑接口数据diff

新旧对比示例 image.png 出现了diff,需要进一步修正

  • 效果优化验证 重复压测验证 image.png

之后进一步发布上线。 上线也需要评估优化效果

关注服务监控
逐步放量
收集性能数据

上述步骤为针对某单个服务的优化过程。我们要继续针对整体进行优化

  • 进一步优化,服务整体链路分析
规范上游服务调用接口,明确场景需求;
分析链路,通过业务流程优化提升服务性能

发现调用链路中有课合并的调用 image.png 实际中会有特定的功能和情况。具体分析。

性能调优案例-基础库优化

  • AB实验SDK的优化

Software Development Kit的缩写,译作软件开发工具包 ABTest-SDK适用于AB分流实验、灰度发布系统等互联网场景; 优化流程:

分析基础库核心逻辑和性能瓶颈
·设计完善改造方案
·数据按需获取数据
·序列化协议优化
内部压测验证
推广业务服务落地验证

上线前后对比CPU使用率降低了2%左右 image.png

性能调优案例-Go语言优化

是适用范围最广的优化

  • 编译器&运行时优化
优化内存分配策略
优化代码编译流程,生成更高效的程序
内部压测验证
推广业务服务落地验证

优点

接入简单,只需要调整编译配置
通用性强

image.png

总结

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

本篇引用

(18条消息) ABTest-SDK_四滴火的博客-CSDN博客_ab test sdk

SDK究竟是什么? - 知乎 (zhihu.com)