import (
"net/http"
_ "net/http/pprof"
)
gin.WrapH
方法将http.Handler转换为Gin的HandlerFunc,然后将pprof路由注册到Gin框架中。r.GET("/debug/pprof/*any", gin.WrapH(http.DefaultServeMux))
http.ListenAndServe
方法启动pprof服务。go func() {
if err := http.ListenAndServe(":8081", nil); err != nil {
log.Fatalf("pprof server failed: %v", err)
}
}()
完整的示例代码如下:
package main
import (
"log"
"net/http"
_ "net/http/pprof"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
// 注册pprof路由
r.GET("/debug/pprof/*any", gin.WrapH(http.DefaultServeMux))
// 启动pprof服务
go func() {
if err := http.ListenAndServe(":8081", nil); err != nil {
log.Fatalf("pprof server failed: %v", err)
}
}()
// 定义服务接口
r.GET("/hello", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello World!",
})
})
// 启动服务
r.Run(":8080")
}
以上代码在Gin框架中注册了pprof路由,并启动了pprof服务。当访问http://localhost:8081/debug/pprof/
时,可以看到pprof的Web界面,可以进行性能分析和调试。需要注意的是,pprof服务只能在本地使用,不能对外暴露。
pprof的Web界面提供了多种性能分析和调试工具,包括CPU分析、内存分析、堆栈跟踪等。以下是pprof的Web界面的使用方法:
CPU分析:在pprof的Web界面中,选择CPU分析,可以查看CPU的使用情况,找出CPU占用率高的函数或代码块。可以使用top
命令查看CPU占用率最高的函数或代码块,使用list
命令查看函数或代码块的具体实现。
内存分析:在pprof的Web界面中,选择内存分析,可以查看内存的使用情况,找出内存占用率高的函数或代码块。可以使用top
命令查看内存占用率最高的函数或代码块,使用list
命令查看函数或代码块的具体实现。
堆栈跟踪:在pprof的Web界面中,选择堆栈跟踪,可以查看函数或代码块的调用栈,找出函数或代码块的调用路径和调用次数。可以使用list
命令查看函数或代码块的具体实现,使用web
命令查看函数或代码块的调用路径。
需要注意的是,pprof的Web界面提供了多种性能分析和调试工具,需要根据具体情况选择合适的工具进行分析和调试。同时,pprof的Web界面也提供了多种命令和选项,可以根据需要进行调整和配置。
allocs
是用来分析内存分配情况的工具。它可以帮助我们找出内存分配量较大的函数或代码块,以及内存分配量的变化情况。在pprof的Web界面中,选择allocs
,可以看到以下信息:
In-use object size
:已分配的内存大小。Allocations
:内存分配次数。Total allocated
:总共分配的内存大小。Heap profile
:堆内存分配情况。Source code
:源代码分配情况。通过分析allocs
的结果,我们可以找出内存分配量较大的函数或代码块,并进行优化。例如,可以尝试减少内存分配次数,使用对象池等技术来减少内存分配量。同时,也可以通过分析allocs
的变化情况,找出内存分配量的变化原因,以及内存泄漏等问题。
block
是用来分析阻塞情况的工具。它可以帮助我们找出阻塞较多的函数或代码块,以及阻塞的原因和持续时间。在pprof的Web界面中,选择block
,可以看到以下信息:
Blocking call
:阻塞调用的函数或代码块。Total delay
:总共的阻塞时间。Delay per call
:每次阻塞的平均时间。Count
:阻塞的次数。Source code
:源代码阻塞情况。通过分析block
的结果,我们可以找出阻塞较多的函数或代码块,并进行优化。例如,可以尝试减少阻塞时间,使用异步调用等技术来减少阻塞量。同时,也可以通过分析block
的原因和持续时间,找出阻塞的根本原因,以及优化的方向和方法。
cmdline
是用来显示程序启动时的命令行参数的工具。它可以帮助我们了解程序启动时的参数设置,以及对程序性能的影响。在pprof的Web界面中,选择cmdline
,可以看到程序启动时的命令行参数列表。例如,可以看到程序启动时设置的CPU和内存分析的采样率、输出文件名等参数。
通过分析cmdline
的结果,我们可以了解程序启动时的参数设置,以及对程序性能的影响。例如,可以根据采样率的设置来调整分析的精度和速度,也可以根据输出文件名的设置来方便地查看和比较不同时间段的分析结果。
goroutine
是用来分析Go程序中的goroutine情况的工具。它可以帮助我们找出goroutine的数量、状态、堆栈信息等,以及发现可能存在的goroutine泄漏或死锁等问题。在pprof的Web界面中,选择goroutine
,可以看到以下信息:
State
:goroutine的状态,包括running、waiting、syscall等。Count
:goroutine的数量。Source code
:源代码中的goroutine情况。Stack trace
:goroutine的堆栈信息。通过分析goroutine
的结果,我们可以找出goroutine的数量、状态、堆栈信息等,以及发现可能存在的goroutine泄漏或死锁等问题。例如,可以找出阻塞较多的goroutine,以及可能存在的死锁或竞态条件等问题。同时,也可以通过分析goroutine的堆栈信息,找出程序中的性能瓶颈和优化方向。
heap
是用来分析Go程序中的堆内存情况的工具。它可以帮助我们找出程序中的内存泄漏、内存分配情况、对象大小分布等问题。在pprof的Web界面中,选择heap
,可以看到以下信息:
Inuse space
:堆内存使用情况,包括已使用的内存大小、对象数量等。Allocations
:内存分配情况,包括分配的内存大小、对象数量等。Objects
:对象大小分布情况,包括对象大小的分布情况、对象数量等。通过分析heap
的结果,我们可以找出程序中的内存泄漏、内存分配情况、对象大小分布等问题。例如,可以找出内存使用较多的对象类型,以及可能存在的内存泄漏或内存分配过多等问题。同时,也可以通过分析对象大小分布情况,找出程序中的性能瓶颈和优化方向。
mutex
是用来分析Go程序中的互斥锁情况的工具。它可以帮助我们找出程序中的锁竞争、锁持有时间、锁等待时间等问题。在pprof的Web界面中,选择mutex
,可以看到以下信息:
Contention
:锁竞争情况,包括锁争用次数、争用时间等。Holding
:锁持有情况,包括锁持有时间、持有次数等。Waiting
:锁等待情况,包括等待时间、等待次数等。通过分析mutex
的结果,我们可以找出程序中的锁竞争、锁持有时间、锁等待时间等问题。例如,可以找出锁竞争较多的代码段,以及可能存在的死锁或竞态条件等问题。同时,也可以通过分析锁持有时间和等待时间,找出程序中的性能瓶颈和优化方向。
profile
是用来分析Go程序的CPU性能瓶颈的工具。它可以帮助我们找出程序中的CPU占用高、函数调用次数、函数调用时间等问题。在pprof的Web界面中,选择profile
,可以看到以下信息:
Top
:CPU占用最高的函数列表,包括函数名称、调用次数、CPU占用时间等。Focus
:指定函数的CPU占用情况,包括函数调用树、函数调用路径、CPU占用时间等。Flame Graph
:CPU占用情况的火焰图,可以直观地看出函数调用关系和CPU占用情况。通过分析profile
的结果,我们可以找出程序中的CPU性能瓶颈,例如CPU占用高的函数、函数调用次数较多的函数、函数调用时间较长的函数等。同时,也可以通过分析函数调用树和路径,找出程序中的性能瓶颈和优化方向。
threadcreate
是用来分析Go程序中的线程创建情况的工具。它可以帮助我们找出程序中的线程创建次数、线程创建时间等问题。在pprof的Web界面中,选择threadcreate
,可以看到以下信息:
Thread Creation
:线程创建情况,包括线程创建次数、线程创建时间等。通过分析threadcreate
的结果,我们可以找出程序中的线程创建情况,例如线程创建次数较多的代码段、线程创建时间较长的代码段等。同时,也可以通过分析线程创建情况,找出程序中的性能瓶颈和优化方向。
trace
是用来分析Go程序的函数调用情况和事件分布情况的工具。它可以帮助我们找出程序中的函数调用关系、函数调用时间、事件分布情况等问题。在pprof的Web界面中,选择trace
,可以看到以下信息:
Trace
:函数调用情况和事件分布情况,包括函数调用树、函数调用路径、事件分布图等。通过分析trace
的结果,我们可以找出程序中的函数调用关系、函数调用时间、事件分布情况等问题。同时,也可以通过分析函数调用树和路径,找出程序中的性能瓶颈和优化方向。
full goroutine stack dump
是用来分析Go程序中所有goroutine的堆栈信息的工具。它可以帮助我们找出程序中所有goroutine的状态、堆栈信息等问题。在pprof的Web界面中,选择full goroutine stack dump
,可以看到以下信息:
Goroutine Stack Dump
:所有goroutine的堆栈信息,包括goroutine的ID、状态、堆栈信息等。通过分析full goroutine stack dump
的结果,我们可以找出程序中所有goroutine的状态、堆栈信息等问题。同时,也可以通过分析goroutine的状态和堆栈信息,找出程序中的性能瓶颈和优化方向。例如,如果发现有大量的goroutine处于阻塞状态,就可以考虑优化goroutine的使用方式,减少阻塞情况的发生。