pprof使用

1. 简介

pprof 是 golang 自带的性能分析工具,可以查看web应用的运行状态,分析程序CPU,内存,goroutine等使用情况。

golang 针对不同使用场景,提供了以下两种方式开启pprof性能分析

runtime/pprof:底层的pprof,可以直接通过代码调用
net/http/pprof:对runtime/pprof的封装,提供http接口和页面,更方便的调用,前提是应用有提供http服务

net/http/pprof是对runtime/pprof的封装,提供了

2. 直接使用runtime/pprof

直接使用 runtime/pprof 库,将画像数据写入文件中

package main

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

func main() {
   
	//CPU Profile
	f, err := os.Create("./cpuprofile")
	if err != nil {
   
		fmt.Println(err)
		return
	}
	defer f.Close()
	pprof.StartCPUProfile(f)
	defer pprof.StopCPUProfile()

	//Memory Profile
	fm, err := os.Create("./memoryprofile")
	if err != nil {
   
		fmt.Println(err)
		return
	}
	defer fm.Close()
	pprof.WriteHeapProfile(fm)

	for i := 0; i < 100; i++ {
   
		fmt.Println("程序员麻辣烫")
	}
}

执行完后,会发现cpuprofile、memoryprofile文件,里面包含cpu、内存的画像。 runtime/pprof 直接支持这两种画像

2.1. 生成文件解析

  1. 使用 **pprof** 工具分析文件
    • 查看分析数据:运行 go tool pprof 命令来加载文件。例如:
go tool pprof cpu.pprof

这将启动一个交互式的 pprof 命令行界面,你可以在这里运行命令来查看不同的性能数据。

<think>好的,用户想了解如何使用pprof进行性能分析。首先我需要回忆一下pprof的基本概念和用法。pprof是Go语言自带的性能分析工具,可以分析CPU、内存、协程等信息。根据引用[4],pprof集成在net/http/pprof包中,只需要几行代码就可以启用。用户可能需要知道如何在代码中引入pprof,然后启动HTTP服务来暴露分析端点。 接下来,用户可能想知道具体如何启动pprof。引用[4]中的示例代码显示,在main函数中启动一个goroutine来监听HTTP端口,比如localhost:8080。这样,程序运行时就可以通过访问特定的URL路径来获取性能数据。例如,/debug/pprof/profile用于CPU分析,/debug/pprof/heap用于内存分析,如引用[1]、[2]、[3]提到的。 然后,用户需要知道如何收集和分析数据。使用go tool pprof命令,后面跟上对应的URL,比如go tool pprof http://localhost:8080/debug/pprof/profile,这会生成CPU的profile文件。同样的,内存分析则是访问/debug/pprof/heap。引用[5]提到pprof有两种使用方式:通过文件或HTTP方式输出Profile,这里用户可能更关注HTTP方式,因为更方便实时分析。 另外,用户可能对分析命令和如何解读结果感兴趣。例如,使用top命令查看最耗时的函数,list命令查看具体函数的代码行性能,web生成调用图等。需要说明这些常用命令,帮助用户快速上手。 还需要注意不同分析类型的区别,比如CPU分析是采样一段时间内的执行情况,而内存分析则是当前的内存分配情况。引用[4]提到pprof会定期采样,用户可能需要了解采样频率和如何调整采样时间,比如在命令行中指定seconds参数,如引用[3]中的例子。 最后,用户可能需要一些优化建议或常见问题的解决方法,比如如何定位内存泄漏,如何优化CPU密集型函数。这部分需要结合pprof的输出结果,指导用户如何根据数据做出调整。 总结回答结构应该是:启用pprof的方法,收集数据的方式,常用分析命令,以及示例步骤。同时,根据用户提供的引用,确保引用正确,比如引用[4]关于代码示例,引用[1]、[2]、[3]关于具体命令的使用。</think>### 如何使用 pprof 进行性能分析? #### 1. **启用 pprof** 在 Go 语言中启用 pprof 非常简单,只需导入 `net/http/pprof` 包并启动一个 HTTP 服务即可: ```go package main import ( "net/http" _ "net/http/pprof" // 自动注册 pprof 路由 ) func main() { go func() { http.ListenAndServe("localhost:8080", nil) // 启动 HTTP 服务 }() // 业务逻辑... } ``` 此时,pprof 会注册以下路由供性能分析: - `/debug/pprof/profile`: 生成 CPU 分析文件 - `/debug/pprof/heap`: 生成内存分析文件 - `/debug/pprof/goroutine`: 查看协程信息[^4][^5]。 --- #### 2. **收集性能数据** 通过 `go tool pprof` 命令采集数据: - **CPU 分析**(采样 30 秒): ```bash go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30 ``` - **内存分析**: ```bash go tool pprof http://localhost:8080/debug/pprof/heap ``` 采样完成后会生成 `.pb.gz` 文件并进入交互式命令行[^1][^2]。 --- #### 3. **分析数据** 在交互式命令行中使用以下常用命令: | 命令 | 作用 | |------------|-------------------------------| | `top 10` | 显示耗时/内存占用最高的10个函数 | | `list 函数名` | 查看函数内每一行的性能详情 | | `web` | 生成调用关系图(需安装 Graphviz)| | `svg` | 生成 SVG 格式的调用图 | 例如,通过 `top` 命令可快速定位 CPU 热点: ``` (pprof) top 5 Showing nodes accounting for 320ms, 80% of 400ms total flat flat% sum% cum cum% 120ms 30% 30% 120ms 30% runtime.mallocgc 80ms 20% 50% 80ms 20% math/rand.Intn ... ``` --- #### 4. **示例:分析内存泄漏** 1. 采集堆内存快照: ```bash go tool pprof -http=:8081 http://localhost:8080/debug/pprof/heap ``` 2. 在浏览器中查看内存分配详情,对比多次快照,定位持续增长的对象[^5]。 --- #### 5. **其他分析类型** - **协程分析**:`go tool pprof http://localhost:8080/debug/pprof/goroutine` - **阻塞分析**:`go tool pprof http://localhost:8080/debug/pprof/block` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值