GO性能分析工具-PProf

admin 2024年10月23日19:48:59评论17 views字数 2721阅读9分4秒阅读模式

应用程序在运行时,总是会出现一些意料不到的问题,如CPU使用率过高、内存占用不断增大(疑似泄露),又或是Goroutine泄露、出现Goroutine数量暴涨,以及网络连接数过多等。本文分享pprof工具,用于日常Golang组件排障,提供辅助分析。

01

GO性能分析工具-PProf

PProf简介

在Go语言中,PProf是用于可视化和应用程序性能数据分析的工具,PProf以profile.proto读取分析样本的集合,并生成可视化报告(支持文本和图形报告),帮助分析数据。

1、采样方式

目前有三种采用方式:

runtime/pprof:用于非Server端的程序的运行数据采集。

net/http/pprof:通过运行测试用例,并指定所需标识来进行采集。

go test:通过运行测试用例,并指定所需标识来进行采集。

2、性能分析输出模式

性能数据分析输出模式有三种:

Report generation:报告生成。

Interactive terminal use:交互式终端。

Web interface:Web界面。

3、采样数据范围

采样数据范围如下:

CPU Profiling:CPU分析,按照一定的频率采集所监听的应用程序CPU(含寄存器)的使用情况。

Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏。

Block Profiling:阻塞分析,记录Goroutine阻塞等待同步(包括定时器通道)的位置,默认不开启,需要调用runtime.SetBlockProfileRate进行设置。

Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况,默认不开启,需要调用runtime.SetMutexProfileFraction进行设置。

Goroutine Profiling:Goroutine分析,可以对当前应用程序正在运行的Goroutine进行堆栈跟踪和分析。这项功能在实际排查中会经常用到,因为很多问题出现时的表象就是Goroutine暴增,而这时候要做的事情之一就是查看应用程序中的Goroutine正在做什么事情,为什么阻塞了,然后再进行下一步。

02

GO性能分析工具-PProf

程序中启动PProf

go tool已经集成在go命令行工具中,因此无需额外安装,使用PProf最重要的一步就是在你的应用程序中引入"net/http/pprof"包,然后为查询pprof采样结果启动一个服务端口,pprof包的init函数会将多个采样处理程序注册到该地址的debug子路由下。

示例程序:

package main import (     _ "net/http/pprof" ) func main() {     // 启动一个 pprof http server     if err := http.ListenAndServe(":6060", nil); err != nil {         panic(err.Error())     } }

03

GO性能分析工具-PProf

PProf分析结果展示

1、浏览器查看性能分析

启动一个使用PProf采样的程序后,我们可以通过浏览器查看其采样结果。在http://127.0.0.1:$(Your_port)/debug/pprof/路径下,首先是一个总览界面:

GO性能分析工具-PProf

图3-1 浏览器访问性能分析结果

profile类型如下:

allocs:查看过去所有内存分配的样本,访问路径为$HOST/debug/pprof/allocs。

block:查看导致阻塞同步的堆栈跟踪,访问路径为$HOST/debug/pprof/block。

cmdline:当前程序的命令行的完整调用路径。

goroutine查看当前所有运行的goroutines堆栈跟踪,访问路径为$HOST/debug/pprof/goroutine。

heap:查看活动对象的内存分配情况,访问路径为$HOST/debug/pprof/heap。

mutex:查看导致互斥锁的竞争持有者的堆栈跟踪,访问路径为$HOST/debug/pprof/mutex。

profile:默认进行30s的CPU Profiling,得到一个分析用的profile文件,访问路径为$HOST/debug/pprof/profile。

threadcreate:查看创建新OS线程的堆栈跟踪,访问路径为$HOST/debug/pprof/threadcreate。

对于以上几种profile可以通过$HOST/debug/pprof/ + profile类型+ ?debug=1直接访问,如果不加?debug=1参数,就会直接下载其对应的profile,这在一些需要使用curlwget获取profile文件的场景中有用。debug的访问方式是具有时效性的,在实际场景中,常常需要及时将当前状态下的profile文件存储下来,便于二次分析。

2、交互式终端查看性能分析

通过命令行查看PProf的抓取和分析。多种类型的profile方式类似,以cpu profile为例。

命令:

go tool pprof http://127.0.0.1:6060/debug/pprof/profile?seconds=60

通过执行该命令(需要等待60秒),pprof会进行CPU Profiling,采样60s的CPU使用情况,结束后进入pprof的命令行交互模式,你可以通过命令行操作对分析的结果进行查看或导出。

GO性能分析工具-PProf

图3-2 go tool交互终端访问性能分析结果

可以通过输入top命令查看CPU占用降序排列的各个函数。如下图所示:

GO性能分析工具-PProf

图3-3 top命令

可以输入pdf生成pdf格式的图形报告:

GO性能分析工具-PProf

图3-4 pdf命令

GO性能分析工具-PProf

图3-5 pdf文件

3、profile文件Web界面展示

PProf还支持通过web界面查看和分析采样结果。首先执行以下命令获取某一类profile:

wget http://127.0.0.1:6060/debug/pprof/profile

默认需要等待30秒,执行完毕后可在当前目录下发现采集的文件profile,可视化后支持多种分析方式且更简单易用。

注意:使用PProf的可视化分析功能需要安装Graphviz组件,否则会报错“Could not execute dot; may need to install graphviz”。

执行命令:

go tool pprof -http=:6001 profile,

该命令将在所指定的端口号运行一个PProf的分析用的站点。生成的可视化页面支持多种分析方式,如下:

GO性能分析工具-PProf

图3-6 性能分析可视化ui

选择对应的TopGraphFlamePeek,打开即可查看图形化的性能分析数据。

关注我们

GO性能分析工具-PProf

文章作者|曹伍

原文始发于微信公众号(EBCloud):GO性能分析工具-PProf

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月23日19:48:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   GO性能分析工具-PProfhttp://cn-sec.com/archives/3306836.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息