当前位置: 首页 > news >正文

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 功能简介

image-20230205183453347

3、pprof 排查实战

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

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

image-20230205190052825

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

看到界面到:

image-20230205190158565

CPU:

使用任务管理器:

image-20230205190525316

使用pprof工具:

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

image-20230205191241899

使用top命令查看CPU状态:

image-20230205191742443

相关含义:

image-20230205191859533

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

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

命令:list

image-20230205192532151

调用关系可视化:命令:web

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

https://graphviz.org/download/

安装后检查环境变量:

dot -version

image-20230205194741042

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

一定要重启Goland!!!!!

删除问题代码再次运行:

image-20230205193514393

Heap堆内存:

image-20230205193711928

进入可视化pprof:

命令:

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

浏览器输入:

localhost:8082

image-20230205204907978
top视图:

image-20230205205100542

source视图:

image-20230205205226760

注释问题代码后:

image-20230205205751487

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

goroutine——协程

查看协程数:

image-20230205214219554

进入可视化pprof:

命令:

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

浏览器输入:

localhost:8082

image-20230205210106779

火焰图查看

注:

由上到下表示调用顺序

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

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

image-20230205210311618

source视图:

image-20230205213949311

注释问题代码后:

image-20230205214340076

mutex——锁

查看锁数:

image-20230205214649797

进入可视化pprof:

命令:

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

浏览器输入:

localhost:8082

image-20230205214831082

source视图:

image-20230205214950274

注释问题代码后:

image-20230205215203788

block——阻塞

查看阻塞数:

image-20230205215324536

进入可视化pprof:

命令:

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

浏览器输入:

localhost:8082

image-20230205215437546

source视图:

image-20230205215640070

注释问题代码后:

image-20230205215829382

小结:

image-20230205220029629

4、性能调优案例

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

分类:

业务服务优化

基础库优化

Go语言优化。

业务服务调优:

基本概念:

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

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

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

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

image-20230205220754227
流程

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、内存、协程的资源的分配使用。后续的性能调优专业知识也讲的通俗易懂。

相关文章:

  • SRE:如何提高报警有效性?
  • C生万物 | 窥探数组设计的种种陷阱
  • git解决代码冲突问题
  • DefTet
  • 单片机阻塞延时与非阻塞延时(1)
  • Kubernetes 入门
  • 深入探讨YOLOv8 网络架构
  • 【NLP】一种基于联合方式的三元组抽取模型——CasRel
  • 接口自动化测试-python-笔记
  • OpenPPL PPQ量化(3):量化计算图的加载和预处理 源码剖析
  • ES6 简介(二)
  • Spring Boot 最新版3.x 集成 OAuth 2.0实现认证授权服务、第三方应用客户端以及资源服务
  • ESP32开发板Arduino IDE更新指南
  • 【day4】 谷粒商城-前端相关(不全,没认真看)
  • 程序编译的过程
  • Spring由哪些模块组成
  • 单链表反转C语言代码
  • Visual Paradigm 17.X Crack
  • 【微服务】RabbitMQ高级篇
  • Dubbo-----------------项目整合和分析
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉