第三节:pprof的应用实践 | 青训营笔记

253 阅读2分钟

课程概述

  • 介绍编码规范,帮助大家写出高质量程序
  • 介绍 Go 语言的性能优化建议,分析对比不同方式对性能的影响和背后的原理
  • 讲解常用性能分析工具 pprof 的使用和工作原理,熟悉排查程序性能问题的基本流程
  • 分析性能调优实际案例,介绍实际性能调优时的工作内容

ppt地址:高质量编程与性能调优实战.pptx - 成电飞书云文档 (feishu.cn)

该笔记主要是想记录一下pprof的操作,操作流程是按以上ppt操作步骤进行

1. 高质量编程

高质量:正确性、可靠性、简洁、清晰

编程原则:简单性、可读性、生产力

编码规范和性能优化可参考:【Go 语言原理与实践学习资料(上)】第三届字节跳动青训营-后端专场 - 掘金 (juejin.cn)

使用benchmark基准测试能够测试代码性能

$ go test -bench="Benchmark" -benchmem

image.png

2. 性能调优工具pprof

使用代码地址:github.com

浏览器查看:

go run main.go

在浏览器打开 http://localhost:6060/debug/pprof 可以看到如下界面

image.png

各部分含义:

  • allocs:内存分配情况
  • blocks:阻塞操作情况
  • cmdline:程序启动命令
  • goroutine:当前所有goroutine的堆栈信息
  • heap:堆上内存使用情况(同allocs)
  • mutex:锁竞争操作情况
  • profile:CPU占用情况
  • threadcreate:当前所有创建的系统线程的堆栈信息
  • trace:程序运行跟踪信息

cpu

首先排查cpu问题,在终端使用命令启动采样

$ go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"

image.png

过一会后会进入pprof终端,输入命令

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

image.png 各部分含义:

  • flat:当前函数本身的执行耗时
  • flat%:falt占cpu总时间的比例
  • sum%:上面每一行的flat%总和
  • cum:指当前函数本身加上其调用函数的总耗时
  • cum%:cum占cpu总时间的比例

flat == cum:函数中没有调用其它函数

flat == 0,函数中只有其他函数调用

可以看到上面占用cpu最多的是Eat函数,可以输入命令

list Eat:查看具体函数

list命令会根据后面给定的正则表达式查找代码,并按行展示出每一行的占用

image.png

输入命令

web:生成调用关系图,默认用浏览器打开

第一次使用会报错:

image.png

failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in %PATH%

原因是需要安装graphviz

安装参考:

Graphviz官网

(20条消息) 给小白准备的graphviz图文安装教程(2021最新)_大闸謝Gemini的博客-CSDN博客_graphviz安装

输入web

image.png

q退出pprof终端

heap

排查堆内存占用情况,在终端使用命令,可以开启pprof自带的web UI

 $ go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"

注意:变化的地方是-http=:8080、url后缀为heap

image.png

VIEW里面可以查看不同视图

TOP视图:

image.png

SOURCE视图:

image.png

在SAMPLE菜单中,有四种指标:

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

goroutine

$ go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"

可以看到调用关系图 image.png

在VIEW菜单中切换到Flame Graph视图,可以转化为火焰图

image.png

  • 由上到下表示调用顺序
  • 每一块代表一个函数,越长代表占用CPU时间更长,消耗资源占比越多
  • 火焰图是动态的,支持点击块进行分析

mutex

$ go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"

block

$ go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"

操作基本都一样