采样过程和原理 | 青训营笔记

208 阅读3分钟

这是我参与「第五届青训营」笔记创作活动的第九天。

一:本堂课的重点内容

image.png image.png

二:详细知识点如下

1、cpu

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

image.png 详细过程 image.png

2、Heap——堆内存

采样程序通过内存分配器在堆上分配和释放的内存。 image.png

3、协程&线程创建

Goroutine:记录所有用户发起且在运行中的goroutine的runtime.main的调用栈信息。 ThreadCreate:记录程序创建的所有系统线程的信息。 image.png

4、阻塞&锁

image.png

5、性能调优案例

1)业务优化
基本概念

服务:能单独部署,承载一定功能的程序

依赖:Service A 的功能实现依赖 Service B 的响应结果,称为 Service A 依赖 Service B

调用链路:能支持一个接口请求的相关服务集合及其相互之间的依赖关系

基础库:公共的工具包、中间件

image.png

流程

建立服务性能评估手段 分析性能数据,定位性能瓶颈 (使用库不规范,高并发场景优化不足) 前者是服务高峰期的火焰图,后者是低峰期的火焰图,可以发现 metrics,即监控组件的 CPU 资源占用变化较大,主要原因是监控数据上报是同步请求,在请求量上涨,监控打点数据量增加时,达到性能瓶颈,造成阻塞,影响业务逻辑的处理,后续是改成异步上报的机制提升了性能。 image.png 重点优化项改造

image.png

优化效果验证

image.png

2)基础库优化
AB 实验 SDK 的优化

分析基础库核心逻辑和性能瓶颈

完善改造方案

按需获取

序列化协议优化 

内部压测验证

推广业务服务落地验证

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

image.png

三、课后个人总结

  • 性能调优原则

    • 要依靠数据不是猜测
  • 性能分析工具 pprof

    • 熟练使用 pprof 工具排查性能问题并了解其基本原理
  • 性能调优

    • 保证正确性
    • 定位主要瓶颈

课后问题:使用 Go 进行并发编程时有哪些性能陷阱或者优化手段?

1、尽量使用函数参数的方式传递信息。

2、使用支持并发的go数据结构。

3、 使用锁
  • 锁在数据初始化时赋值,中间不能重新赋值
  • 锁粒度要小
  • 使用defer解锁
  • 把加锁内容单独封装函数,且该函数中不得增加不需要加锁的流程
  • 使用for循环访问数据的读锁,尽量保护读取后用局部变量

4、使用channel并发改串行

四、引用参考

blog.csdn.net/aashuii/art…