天天看点

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

文章目录

    • 一、本次学习重点内容:
      • 本堂课的知识要点有哪些?
        • 1、性能发现工具pprof
        • 2、性能调优案例
    • 二、详细知识点介绍:
      • 1、性能调优简介
        • 性能调优原则:
      • 2、性能发现工具pprof
        • 说明:
        • pprof 功能简介
      • 3、pprof 排查实战
        • CPU:
          • 使用任务管理器:
          • 使用pprof工具:
          • 调用关系可视化:命令:web
        • Heap堆内存:
          • 进入可视化pprof:
          • top视图:
          • source视图:
          • 注释问题代码后:
        • goroutine——协程
          • 查看协程数:
          • 进入可视化pprof:
          • 火焰图查看
          • source视图:
          • 注释问题代码后:
        • mutex——锁
          • 查看锁数:
          • 进入可视化pprof:
          • source视图:
          • 注释问题代码后:
        • block——阻塞
          • 查看阻塞数:
          • 进入可视化pprof:
          • source视图:
          • 注释问题代码后:
        • 小结:
      • 4、性能调优案例
        • 业务服务调优:
          • 基本概念:
          • 流程
          • 建立服务性能评估手段
        • 基础库优化:
        • Go语言优化:
        • 总结:
    • 三、个人总结:

一、本次学习重点内容:

本堂课的知识要点有哪些?

1、性能发现工具pprof

2、性能调优案例

二、详细知识点介绍:

1、性能调优简介

性能调优原则:

要依靠数据不是猜测

要定位最大瓶颈而不是细枝末节

不要过早优化

不要过度优化

2、性能发现工具pprof

说明:

1、希望知道应用在什么地方耗费了多少CPU、Memory

2、pprof是用于可视化和分析性能分析数据的工具

pprof 功能简介

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

3、pprof 排查实战

下载示例项目,GitHub地址:https://github.com/wolfogre/go-pprof-practice

项目提前埋入了许多炸弹代码,会产生许多可观测性能问题。

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

运行项目,浏览器输入网址:http://localhost:6060/debug/pprof/

看到界面到:

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

CPU:

使用任务管理器:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
使用pprof工具:

**进入pprof:**go tool pprof “http://localhost:6060/debug/pprof/profile?seconds=10”

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

使用top命令查看CPU状态:

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

相关含义:

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

可以清晰看到是那个函数消耗大量资源。

根据指定的正则表达式查找代码行:

命令:list

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
调用关系可视化:命令:web

这里输出图片相关格式需要先安装graphviz,graphviz安装地址如下

https://graphviz.org/download/

安装后检查环境变量:

dot -version
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

记住,安装时勾选创建环境变量,安装完成后重启Goland才能读取到最新的环境变量。

一定要重启Goland!!!!!

删除问题代码再次运行:

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

Heap堆内存:

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
进入可视化pprof:

命令:

go tool pprof -http=:8082 “http://localhost:6060/debug/pprof/heap”

浏览器输入:

localhost:8082
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
top视图:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
source视图:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
注释问题代码后:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

可以看到内存占用由85%降到68%

goroutine——协程

查看协程数:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
进入可视化pprof:

命令:

go tool pprof -http=:8082 “http://localhost:6060/debug/pprof/goroutine”

浏览器输入:

localhost:8082
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
火焰图查看

注:

由上到下表示调用顺序

每一块代表一个函数,越长代表占用CPU 的时间更长

火焰图是动态的,支持点击块进行分析

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
source视图:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
注释问题代码后:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

mutex——锁

查看锁数:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
进入可视化pprof:

命令:

go tool pprof -http=:8082 “http://localhost:6060/debug/pprof/mutex”

浏览器输入:

localhost:8082
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
source视图:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
注释问题代码后:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

block——阻塞

查看阻塞数:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
进入可视化pprof:

命令:

go tool pprof -http=:8082 “http://localhost:6060/debug/pprof/block”

浏览器输入:

localhost:8082
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
source视图:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
注释问题代码后:
Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

小结:

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用

4、性能调优案例

介绍实际业务服务性能优化的案例,对逻辑相对复杂的程序如何进行性能调优

分类:

业务服务优化

基础库优化

Go语言优化。

业务服务调优:

基本概念:

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

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

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

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

Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
流程

1、建立服务性能评估手段

2、分析性能数据,定位性能瓶颈

3、重点优化项改造

4、优化效果验证

建立服务性能评估手段

服务性能评估方式:

1、单独benchmark无法满足复杂逻辑分析

2、不同负载情况下性能表现差异

请求流量构造:

1、不同请求参数覆盖逻辑不同

2、线上真实流量情况

压测范围:

单机器压测、集群压测

性能数据采集:

单机性能数据、集群性能数据

基础库优化:

AB实验SDK的优化:

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

设计完善改造方案

数据按需获取

数据序列化协议优化

2、内部压测验证

3、推广业务服务落地验证

Go语言优化:

编译器&运行时优化:

1、优化内存分配策略

2、优化代码编译流程,生成更高效的程序

3、内部压测验证

4、推广业务服务落地验证

优点:

接入简单,只需要调整编译配置

通用性强

总结:

性能调优原则:

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

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

3、保证正确性·定位主要瓶颈

三、个人总结:

​ 本次学习算是比较深入的了解了性能优化的相关知识。特别是见识到了pprof工具的强大,可以精准地定位问题代码,可视化地展示程序运行中CPU、内存、协程的资源的分配使用。后续的性能调优专业知识也讲的通俗易懂。