Go语言——pprof工具介绍和性能调优实战 | 青训营笔记

131 阅读3分钟

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

性能调优实战

主要针对实际工作中对应用进行性能调优的介绍和实战,干货满满!

本文主要分为

  1. 调优介绍(调优原则)
  2. pprof——性能调优工具
  3. 性能调优实战
    • 保证正确性
    • 定位主要瓶颈

1 简介

基于下列的性能调优原则:

  • 要依靠数据不是猜测。(需要有个标准去评估)
  • 要定位最大瓶颈而不是细枝末节。(首要解决目标)
  • 不要过早优化。
  • 不要过度优化。

2 性能分析工具 pprof

介绍

背景:想知道什么地方耗费多少cpu、内存等资源

  • pprof:用于可视化和分析性能以及分析数据的工具

功能介绍

image.png

搭建之前给github的pprof实践项目(需要有1cpu核心和超过1gb内存)

  • 项目下载到本地后运行go build,生成exe文件,双击使用

  • 浏览器查看指标:

    localhost:6060/debug/pprof

    • 指标:allocs block heap mutex profile

2.2 排查实战

  • cpu

    • 命令:topN 查看占用资源最多的函数

      • 参数说明:

    image.png

    • 对于flat和cum参数

    image.png

    • 命令:list

      • 根据指定的正则表达式查找代码行(可看到函数中循环占很多大多时间)
    • 命令:web

      • 调用关系可视化(可生成图)
  • Heap-堆内存

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

      在8080端口看到可视化内存占用图

    • top、source视图

    • sample中有四种采样说明:

      • alloc_objects:程序累计申请的对象数
      • alloc_space:程序累计申请的内存大小
      • inuse_objects:程序当前持有的对象数
      • inuse_space:程序当前占用的内存大小
  • goroutine-协程

    • 在heap指令改后缀,从heap->goroutine

    • 可视化

      • 由上到下表示调用顺序
      • 每一块代表一个函数,越长代表越占cpu
      • 动态火焰图,能够点击分析
    • 有搜索功能

  • mutex-锁

    • 同样改后缀mutex
    • 找阻塞block,解决相应问题
    • 展示阻塞block并不会全部展示,占比小的函数忽略,便于开发者找到关键阻塞

2.3 采样过程和原理

对上面pprof工具的五个调优排查进行原理上的了解

3 性能调优案例

介绍:对逻辑复杂的程序通过案例展示如何调优。

程序从不同的应用层次上

  • 业务服务
  • 基础库
  • Go语言本身

A. 业务服务

  1. 建立服务性能评估手段
  2. 分析性能数据,定位性能瓶颈
  3. 重点优化项改造
  4. 优化效果验证 image.png

B. 基础库

适用范围更广的就是基础库的优化。

在实际的业务服务中,为了评估某些功能上线后的效果,经常需要进行AB实验,看看不同策略对核心指标的影响,所以公司内部多数服务都会使用AB实验的SDK,如果能优化AB组件库的性能,所有用到的服务都会有性能提升。

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

  • 设计完善改造方案
  • 数据按需获取
  • 数据序列化协议优化 最后,内部压测验证后进行推广服务落地,这就是AB实验对SDK的优化。

image.png

C. Go语言本身 编译器和其运行时的优化

  • 优化内存分配策略(下一节)
  • 优化代码编译流程,生成更高效的程序
  • 内部压测验证
  • 推广业务服务落地验证

优点:接入简单、只需要调整一些编译的配置,同时通用性强。

心得

内容很多,要花时间消化,不过获益匪浅

引用

ppt:‌‍⁤⁡‬⁤‌⁡‍‍‬‌‬⁣‬⁡‌⁣‍⁢⁣‬‌⁢⁡‌⁣‌‍⁣⁤‬⁢高质量编程与性能调优实战 .pptx - 飞书云文档 (feishu.cn)