pprof 使用

pprof 是一个用于可视化和分析性能数据的工具,常用于分析Go语言程序的性能,包括CPU使用情况和内存占用。

  1. 导入 pprof:在Go程序中导入 pprof 包。

    1
    import _ "net/http/pprof"
  2. 启动HTTP服务器pprof 通过HTTP服务器提供分析界面,需要在程序中启动HTTP服务器。

    1
    2
    3
    go func() {
    log.Println(http.ListenAndServe("localhost:6060", nil))
    }()

    如果使用了 Echo 等框架,需要如下配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package main

    import (
    "github.com/labstack/echo/v4"
    "github.com/labstack/echo/v4/middleware"
    _ "net/http/pprof"
    "net/http"
    )

    func main() {
    e := echo.New()
    e.GET("/debug/pprof/*", echo.WrapHandler(http.DefaultServeMux))
    e.Logger.Fatal(e.Start(":1327"))
    }
  3. 运行程序:编译并运行你的Go程序。

  4. 收集内存分析数据:在程序运行时,使用 pprof 工具收集内存分析数据。可以通过访问 http://localhost:6060/debug/pprof/heap 获取堆内存的实时数据。

  5. 生成分析报告:使用 go tool pprof 命令获取和分析内存数据。例如:

    1
    go tool pprof http://localhost:6060/debug/pprof/heap
  6. 浏览和分析报告pprof 提供了文本和图形两种方式查看分析数据。例如,使用 top 命令查看内存使用最多的函数,或使用 web 命令生成内存分析的图形报告。

    1. top 命令

      • 用途:显示消耗最多内存的函数。
      • 示例:在 pprof 的交互式界面中输入 top,可以看到内存占用最多的几个函数。
    2. list 命令

      • 用途:显示指定函数的详细内存分配信息。
      • 示例:list 函数名,这会显示该函数中的内存分配详情。
    3. web 命令

      • 用途:生成一个SVG格式的堆内存分配的调用图,可以直观地看到各个函数之间的调用关系和内存分配情况。
      • 示例:输入 webpprof 会自动打开浏览器展示内存分配的图形化视图。
    4. tree 命令

      • 用途:以树状图的形式展示内存分配情况。
      • 示例:输入 tree,可以看到以树形结构组织的内存分配信息。
    5. peek 命令

      • 用途:查看特定函数或路径的内存分配情况。
      • 示例:peek 函数名,可以看到该函数的内存分配情况及其调用者的信息。
    6. 图形化界面

      • 使用 pprof -http=:端口号 命令启动 pprof 的图形界面。
      • 示例:go tool pprof -http=:8080 http://localhost:6060/debug/pprof/heap,然后在浏览器中访问 http://localhost:8080

    这些命令可以帮助你更深入地理解程序的内存使用情况,从而对程序进行有效的优化。不同的命令适用于不同的分析需求,可以根据实际情况灵活选择。