概要檔案種類#

Go 提供三種主要的概要檔案:

種類說明用途
CPU ProfileCPU 使用情況找出耗時的函式
Mem Profile記憶體配置找出記憶體使用熱點
Block Profile阻塞操作找出同步瓶頸

CPU 概要分析#

import "runtime/pprof"

func main() {
    // 建立 CPU 概要檔案
    f, _ := os.Create("cpu.prof")
    defer f.Close()

    pprof.StartCPUProfile(f)
    defer pprof.StopCPUProfile()

    // 執行要分析的程式碼
    doWork()
}

StartCPUProfile 以 100 Hz 採樣(每 10 毫秒一次)。這個頻率是固定的,無法調整。

記憶體概要分析#

import "runtime/pprof"

func main() {
    // 執行要分析的程式碼
    doWork()

    // 建立記憶體概要檔案
    f, _ := os.Create("mem.prof")
    defer f.Close()

    runtime.GC()  // 先執行 GC 取得更準確的資料
    pprof.WriteHeapProfile(f)
}

用 go test 產生概要檔案#

# CPU 分析
go test -cpuprofile cpu.prof -bench .

# 記憶體分析
go test -memprofile mem.prof -bench .

# 阻塞分析
go test -blockprofile block.prof -bench .

# 同時產生多個
go test -cpuprofile cpu.prof -memprofile mem.prof -bench .

分析概要檔案#

# 進入互動式介面
go tool pprof cpu.prof

# 常用命令
(pprof) top         # 顯示最耗時的函式
(pprof) top10       # 顯示前 10 名
(pprof) list main   # 顯示特定函式的程式碼
(pprof) web         # 在瀏覽器中顯示視覺化圖表

# 直接輸出
go tool pprof -top cpu.prof
go tool pprof -text cpu.prof
go tool pprof -svg cpu.prof > cpu.svg
go tool pprof -http=:8080 cpu.prof  # 開啟 Web 介面
pprof Web 介面功能

使用 go tool pprof -http=:8080 cpu.prof 開啟 Web 介面後,可以存取:

  • / - 圖形化呼叫圖
  • /flamegraph - 火焰圖
  • /top - 排行榜
  • /source - 原始碼分析
  • /disasm - 反組譯分析

火焰圖特別適合快速找出效能瓶頸:

  • X 軸:函式在取樣中出現的比例
  • Y 軸:呼叫堆疊深度
  • 越寬的區塊表示該函式佔用越多 CPU 時間

HTTP 服務的即時分析#

import (
    "net/http"
    _ "net/http/pprof"  // 自動註冊 pprof 路由
)

func main() {
    go func() {
        // 開啟 pprof 端點
        http.ListenAndServe(":6060", nil)
    }()

    // 主程式邏輯
    startServer()
}

存取 pprof 端點:

# 30 秒 CPU 分析
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30

# 記憶體分析
go tool pprof http://localhost:6060/debug/pprof/heap

# goroutine 分析
go tool pprof http://localhost:6060/debug/pprof/goroutine

# 阻塞分析
go tool pprof http://localhost:6060/debug/pprof/block

在生產環境中啟用 pprof 時:

  1. 使用獨立的埠口(非對外埠口)
  2. 限制存取(防火牆、認證)
  3. 考慮效能影響