Go性能调优实战案例 | 青训营笔记

238 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第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
调用链路: 能支持一个接口请求的相关服务集合及其相互之间的依赖关系
基础库: 公共的工具包、中间件