pprof性能分析

pprof性能分析

golang在语言层面集成了profile采样工具,在程序运行过程中可以获取cpu、heap、block、traces等执行信息 获取profile数据的两种形式:web形式与profile文件生成形式.

web方式

引入 “net/http/pprof"包,并在主函数中添加一下代码

http.ListenAndServe(":8080", nil)

其中,net/http/pprof包的init函数中注册了debug/pprof/路由到http服务中,用浏览器打开http://localhost:8080/debug/pprof/,即可使用pprof提供的功能。

整体信息

http://127.0.0.1:8080/debug/pprof 查看整体信息

allocs

allocs报告过去的内存申请情况

block

报告协程阻塞的情况,可以用来分析和查找死锁等性能瓶颈, 需要调用runtime.SetBlockProfileRate开启

cmdline

主要是调用os.Args,获取程序启动时的命令及参数

goroutine

有哪些协程正在运行、有多少协程在运行等

heap

查看堆相关信息,包括一些GC的信息

mutex

查看互斥的争用情况,默认不开启, 需要调用需要在程序中调用runtime.SetMutexProfileFraction

threadcreate

查看系统线程创建信息

trace

可以向你揭示:Go程序运行中的所有的运行时事件

获取trace文件使用 go tool trace trace文件 进行分析

profile

返回CPU的profile,调用了runtime/pprof包的StartCPUProfile,采样频率为100Hz

获取prifiel文件 go tool pprof profile文件 进行分析

进入tty分析

从terminal进入profile,进行细致分析 go tool pprof http://localhost:6060/debug/pprof/profile

go tool pprof http://localhost:6060/debug/pprof/heap

go tool pprof http://localhost:6060/debug/pprof/block

profile文件方式

通过实现代码

import "runtime/pprof"

	cpuf, err := os.Create("cpu_profile")
	if err != nil {
		log.Fatal(err)
	}
    //cpu profile
	pprof.StartCPUProfile(cpuf)
	defer pprof.StopCPUProfile()

	memf, err := os.Create("mem_profile")
	if err != nil {
		log.Fatal(err)
	}
    //heap profile
	if err := pprof.WriteHeapProfile(memf); err != nil {
		log.Fatal(err)
	}
	defer memf.Close()

编译如上程序生成可执行文件main,运行man会生成cpu_profile文件

分析profile

go tool pprof main cpu_profile 执行这个命令就进入了profile 文件了

输入help查看支持命令: web, top, peek, list

top: 列出耗时操作

peek: 是用来查询 函数名字的,这个名字是list需要使用的名字 list: 是用来将函数时间消耗列出来的

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章