介绍
性能调优原则:
- 要依靠数据而不是猜测
- 要定位最大瓶颈而不是细枝末节
- 不要过早优化
- 不要过度优化
性能分析工具pprof
功能
排查实战
采样过程和原理
CPU
采样对象:函数调用和它们占用的时间
采样率:100次/秒,固定值
采样时间:从手动启动到手动结束
操作系统:每10秒向进程发送一次SIGPROF信号
进程:每次接收到SIGPROF信号会调用堆栈
写缓存:每100秒读取已经记录的调用栈并写出输出流
Heap堆内存
采样程序通过内存分配器在堆上分配和释放的内存,记录分配/释放的大小和数量
采样率:每分配512KB记录一次,可在运行开头修改,1为每次分配均记录
采样时间:从程序运行开始到采样时
采样指标:alloc_space,alloc_objects,inuse_space,inuse_objects
计算方式:inuse=alloc-free
Goroutine协程&ThreadCreat线程创建
-
Goroutine
记录所有用户发起且在运行中goroutine(即入口非runtime开头的)runtime.main栈调用信息
-
ThreadCreat
记录程序创建的所有系统线程的信息
Block阻塞&Mutex锁
阻塞操作: 采样阻塞操作的次数和耗时
采样率:阻塞耗时超过阈值才会被记录,1为每次阻塞均记录
锁竞争:
采样争夺锁的次数和耗时
采样率:只记录固定比例的锁操作,1为每次加锁均时间
性能调优案例
业务服务优化
基本概念:
- 服务
- 依赖
- 调用链路
- 基础库
流程:
- 建立服务性能评估手段
- 分析性能数据,定位性能瓶颈
- 重点优化项改造
- 优化效果验证
手段:
-
服务性能评估方式
单独benchmark无法满足复杂逻辑分析
不同负载情况下性能表现差异
-
请求流量构造
不同请求参数覆盖逻辑不同
线上真实流量情况
-
压测范围
单机器压测
集群压测
-
性能数据采集
单机性能数据
集群性能数据
基础库优化
- 分析核心逻辑和性能瓶颈
- 内部压测验证
- 推广业务服务落地验证
go语言优化
编译器和运行时优化:
- 优化内存分配策略
- 优化代码编译流程,生成更高效的程序
- 内部压测验证
- 推广业务服务落地验证
优点:
- 接入简单
- 通用性强