这是我参与「第五届青训营 」伴学笔记创作活动的第14天
性能优化分析工具
这节课讲解主要介绍了性能调优实战案例,分享了业务优化、基础库优化和Go语言优化的一些流程和方式。
pprof-采样过程和原理
CPU
使用pprof时,CPU方面的采样对象是函数调用和它们占用的时间,采样率为100次/秒是固定值,采样时间为从手动启动到手动结束。开始和停止采样的过程如下:
开始采样——>设定信号处理函数——>开启定时器
停止采样——>取消信号处理函数——>关闭定时器
其中,CPU中的操作系统每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——>遍历allg链表——>输出创建m的堆栈——>Start The World
Block & Mutex
阻塞操作的指标是有对采样阻塞操作的次数和耗时,以及采样率是阻塞耗时超过阈值的才会被记录,1为每次阻塞都进行记录。
锁竞争的指标是采样争夺锁的次数和耗时,以及采样率是只记录固定比例的锁操作,1为每次加锁均记录。
性能调优案例
性能调优案例是介绍实际业务性能优化的案例,对逻辑相对复杂的程序如何进行性能调优,这些问题代入到实际上该如何解决。性能调优分为业务服务优化、基础库优化、Go语言优化。
业务服务优化
概念
服务: 能单独部署,承载一定功能的程序
依赖: Service A 的功能实现依赖,Service B 的响应结果,称为Service A 依赖 Service B
调用链路: 能支持一个接口请求的相关服务集合及其相互之间的依赖关系
基础库: 公共的工具包、中间件