概要檔案種類#
Go 提供三種主要的概要檔案:
| 種類 | 說明 | 用途 |
|---|---|---|
| CPU Profile | CPU 使用情況 | 找出耗時的函式 |
| 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 時:
- 使用獨立的埠口(非對外埠口)
- 限制存取(防火牆、認證)
- 考慮效能影響