这是我参与「第五届青训营」笔记创作活动的第九天。
一:本堂课的重点内容
二:详细知识点如下
1、cpu
采样对象:函数调用和它们占用的时间 采样率:100次/秒,固定值 采样时间:从手动启动到手动结束
详细过程
2、Heap——堆内存
采样程序通过内存分配器在堆上分配和释放的内存。
3、协程&线程创建
Goroutine:记录所有用户发起且在运行中的goroutine的runtime.main的调用栈信息。
ThreadCreate:记录程序创建的所有系统线程的信息。
4、阻塞&锁
5、性能调优案例
1)业务优化
基本概念
服务:能单独部署,承载一定功能的程序
依赖:Service A 的功能实现依赖 Service B 的响应结果,称为 Service A 依赖 Service B
调用链路:能支持一个接口请求的相关服务集合及其相互之间的依赖关系
基础库:公共的工具包、中间件
流程
建立服务性能评估手段
分析性能数据,定位性能瓶颈 (使用库不规范,高并发场景优化不足)
前者是服务高峰期的火焰图,后者是低峰期的火焰图,可以发现 metrics,即监控组件的 CPU 资源占用变化较大,主要原因是监控数据上报是同步请求,在请求量上涨,监控打点数据量增加时,达到性能瓶颈,造成阻塞,影响业务逻辑的处理,后续是改成异步上报的机制提升了性能。
重点优化项改造
优化效果验证
2)基础库优化
AB 实验 SDK 的优化
分析基础库核心逻辑和性能瓶颈
完善改造方案
按需获取
序列化协议优化
内部压测验证
推广业务服务落地验证
Go 语言优化
编译器&运行时优化
优化内存分配策略
优化代码编译流程,生成更高效的程序
内部压测验证
推广业务服务落地验证
三、课后个人总结
-
性能调优原则
- 要依靠数据不是猜测
-
性能分析工具
pprof- 熟练使用
pprof工具排查性能问题并了解其基本原理
- 熟练使用
-
性能调优
- 保证正确性
- 定位主要瓶颈
课后问题:使用 Go 进行并发编程时有哪些性能陷阱或者优化手段?
1、尽量使用函数参数的方式传递信息。
2、使用支持并发的go数据结构。
3、 使用锁
- 锁在数据初始化时赋值,中间不能重新赋值
- 锁粒度要小
- 使用defer解锁
- 把加锁内容单独封装函数,且该函数中不得增加不需要加锁的流程
- 使用for循环访问数据的读锁,尽量保护读取后用局部变量
4、使用channel并发改串行