这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
2.2性能分析工具pprof
2.2.2 排查实战
CPU
- 获取配置文件
- go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
- 命令:topN
- 查看消耗资源最高的函数
- 命令:list
- 展现消耗最大的那行代码
- 命令:web
- 调用关系可视化
heap-堆内存
- go tool pprof -http=8080"http://localhost:6060/pprof/heap
goroutine-协程
协程泄露也会导致内存泄漏
mutex-锁 go tool pprof -http=8080"http://localhost:6060/pprof/mutex
block-阻塞 go tool pprof -http=8080"http://localhost:6060/pprof/block
2.2.3 pprof采样过程和原理
CPU
- 采样对象:函数调用和它们占用的时间
- 采样率:100次/秒,固定值
- 采样时间:从手动启动到手动结束
Heap-堆内存
- 采样程序通过内存分配器在堆上分配和释放的内存,记录分配/释放的大小和数量
- 采样率:每分配512KB记录一次,可在运行开头修改,1为每次分配均记录
- 采样时间:从程序运行开始到采样时
- 采样指标:alloc_space,alloc_objects,inuse_space,inuse_objects 计算方式:inuse=alloc-free
Goroutine-协程&ThreadCreate-线程创建·
Goroutine
记录所有用户发起且在运行中的goroutine(即入口非runtime开头的)runtime.main 的调用栈信息
ThreadCreate
记录程序创建的所有系统线程的信息
2.3 性能调优案例
- 业务服务优化
- 基础库优化
- GO语言优化
2.3.1 业务服务优化
基本概念
- 服务:能单独部署,承载一定功能的程序
- 依赖:Service A 的功能实现依赖Service B的响应结果,称为 Service A 依赖 Service B
- 调用链路:能支持一个接口请求的相关服务集合及其相互之间的依赖关系基础库:公共的工具包、中间件
API(接口)是什么?举个常见的例子,在京东上下单付款之后,商家选用顺丰发货,然后你就可以在京东上实时查看当前的物流信息。京东和顺丰作为两家独立的公司,为什么会在京东上实时看到顺丰的快递信息,这就要用到API,当查看自己的快递信息时,京东利用顺丰提供的API接口,可以实时调取信息呈现在自己的网站上。除此,你也可以在快递100上输入订单号查取到快递信息。只要有合作,或是有允许,别的公司都可以通过顺丰提供的API接口调取到快递信息。既然有多方调用,那提供一个统一的调用规范会方便很多
流程
- 建立服务性能评估手段
- 分析性能数据,定位性能瓶颈
- 重点优化项改造
- 优化效果验证