Loading

Golang性能分析

Golang性能分析

pprof

web查看必备工具

brew install graphviz
sudo apt install graphviz
sudo yum install graphviz

# 验证是否安装成功
dot -version

http://localhost:6010/debug/pprof/

执行时间分析

net/http/pprof

package main

import (
	"log"
	"net/http"
	_ "net/http/pprof" //在初始化导包的时候,pprof 包会自动注册 handler
	"time"
)

func main() {

	go func() {
                //todo pprof
		http.ListenAndServe(":6010", nil)
	}()

    //业务代码
	
}

而后通过浏览器访问即可查看,注:如果用了框架的话也没有关系,监听不同的端口,通过不同的端口访问即可.

  1. 直接访问总列表,该内容是原始数据,展示效果不太友好
http://localhost:6010/debug/pprof/

报告类型

allocs 和 heap 采样的信息类似,不过前者是所有对象的内存分配,而 heap 则是活跃对象的内存分配

序号 报告类型 备注
1 allocs 过去所有内存分配的样本
2 block 导致同步原语阻塞的堆栈跟踪
3 cmdline 当前程序的命令行调用
4 goroutine 所有当前goroutine的堆栈痕迹
5 heap 活动对象的内存分配抽样。您可以指定gc GET参数,以便在获取堆样本之前运行gc。
6 mutex 争用互斥锁持有者的堆栈跟踪
7 profile CPU配置文件。可以以秒为单位指定持续时间。获得概要文件后,使用go工具pprof命令来研究概要文件。
8 threadcreate 导致创建新的操作系统线程的堆栈跟踪
9 trace 当前程序的执行轨迹。可以以秒为单位指定持续时间。获得跟踪文件后,使用go工具跟踪命令来调查跟踪。

通过web访问,展示格式更丰富,选项更多,还有火焰图等 [推荐]

go tool pprof URL 会将文件自动下载下来,默认到~/pprof/目录下每请求一次生成一个gz文件.

后续可以使用go tool pprof ./fileName进入命令行来继续使用,也可对比不同的文件分析两次的差异.

# 每秒将远程的信息下载到本地,并且提供一个本地的8080端口以供web访问,同时会自动打开浏览器访问
go tool pprof --http=localhost:7010 --seconds=11 http://localhost:6010/debug/pprof/heap
# 同上,但是未设置动态概要文件的时间长度
go tool pprof --http=:5010 localhost:6010/debug/pprof/allocs
go tool pprof --http=:5011 localhost:6010/debug/pprof/block
go tool pprof --http=:5012 localhost:6010/debug/pprof/cmdline
go tool pprof --http=:5013 localhost:6010/debug/pprof/goroutine
go tool pprof --http=:5014 localhost:6010/debug/pprof/heap
go tool pprof --http=:5015 localhost:6010/debug/pprof/mutex
go tool pprof --http=:5016 localhost:6010/debug/pprof/profile
go tool pprof --http=:5017 localhost:6010/debug/pprof/threadcreate
go tool pprof --http=:5018 localhost:6010/debug/pprof/trace

# 同上,不过是访问本地的数据
go tool pprof --http=:5020 ./pprof.main.alloc_objects.alloc_space.inuse_objects.inuse_space.049.pb.gz
  1. 命令行访问
go tool pprof http://localhost:6010/debug/pprof/heap

wget -O trace.out localhost:6010/debug/pprof/trace
go tool trace --http=:5010 trace.out

命令行标题含义

lat--- 该函数占时
flat% --- 该函数相对于总耗时的百分比
sum% --- 前面累计每一行flat 占比
cum --- 该函数以及该函数调用的其他函数总耗时
cum% --- 对应的百分比

pprof常用参数

-http在主机:在本地提供一个web服务用来查看。如上面的--http=:5010
	Host是可选的,默认为'localhost'。
	端口是可选的,默认情况下是随机可用的端口。
-no_browser跳过为交互式web UI打开浏览器。
-tools对象工具的搜索路径

-inuse_space同-sample_index=inuse_space   查看正在使用的内存
-inuse_objects同-sample_index=inuse_objects
-alloc_space同-sample_index=alloc_space  查看全部历史内存分配统计,可以通过这个指标确定大量内存用在哪些地方
-alloc_objects同-sample_index=alloc_objects
-total_delay同-sample_index=delay
-contentions同-sample_index=contentions
-mean_delay同-mean -sample_index=delay

-diff_base source基本配置文件的源文件,用于比较
-base source用于减形的基本轮廓源
-seconds基于时间的配置文件收集时间

pprof命令行命令

进入命令行后可通过以下参数进行输出不同的格式

常用展示格式
top N
本地取样计数排名列表: 在默认情况下,top命令会输出以本地取样计数为顺序的列表, 默认是10个

web
生成一个svg文件,然后自动调用本地工具打开(一般是浏览器)

png
生成一个png文件,自动保存到当前目录下.

list 函数名
结合top,可以直接定位到消耗资源的代码处

traces 
列出函数的调用栈

一般首先通过profile,定位cpu消耗暂时较大的函数,然后通过heap定位内存占用较大的函数逻辑。


其他展示格式
-callgrind以callgrind格式输出图形
-comments输出所有配置文件注释
-disasm输出带有示例注释的程序集清单
-dot以DOT格式输出图形
-eog通过eog可视化图形
-evince通过evince可视化图形
-gif输出GIF格式的图形图像
-gv通过gv可视化图形
-kcachegrind在KCachegrind可视化报告
-list输出与regexp匹配的带注释的函数源
-pdf以PDF格式输出图形
-peek匹配regexp的函数的输出调用者/调用者
-png输出PNG格式的图形图像
-proto以压缩的protobuf格式输出配置文件
-ps输出PS格式的图形
-raw输出原始配置文件的文本表示形式
-svg以SVG格式输出图形
-tags输出配置文件中的所有标记
-text以文本形式输出顶部条目
-top以文本形式输出top条目
-topproto以压缩的protobuf格式输出top项
-trace以文本形式输出所有概要文件示例(列出函数的调用栈)
-tree输出调用图的文本呈现
-web通过web浏览器可视化图形
-weblist在浏览器中显示带注释的源代码

参数的选项

粒度
-functions在函数级聚合。
-filefunctions在函数级聚合。
-files在文件级进行聚合。
-lines在源代码行级别聚合。
-address在地址级进行聚合。
排序
-cum根据累积权重对条目进行排序
-flat根据自己的权重对条目进行排序

runtime/pprof

package main

import (
	"log"
	"os"
	"runtime/pprof"
)

func main() {
	fc, err := os.OpenFile("./cpu.pprof", os.O_RDWR|os.O_CREATE, 0755)
	if err != nil {
		log.Fatal(err)
	}
  fm, err := os.OpenFile("./mem.pprof", os.O_RDWR|os.O_CREATE, 0755)
	if err != nil {
		log.Fatal(err)
	}
  pprof.StartCPUProfile(fc)
  //内存消耗分析
  pprof.WriteHeapProfile(fm)
  


	pprof.StopCPUProfile()
	fc.Close()
}

进入命令行

 go tool pprof ./cpu.prof

之后的命令行操作与上面的一样,这里就不再赘述了

对比

  1. go tool pprof XXX间隔一段时间采集文件, 对比是否存在明显的增加.
  2. go tool pprof -base file1 file2 对比两个文件,top或web获取对比.
posted @ 2021-07-30 15:24  我爱吃炒鸡  阅读(197)  评论(0编辑  收藏  举报