Gin 框架中使用 pprof
【導讀】go 語言 web 框架 gin 中如何便捷引入 pprof 觀察性能?本文做了詳細介紹。
Go 語言內置了獲取程序運行數據的工具,包括以下兩個標準庫:
-
runtime/pprof
: 採集工具型應用運行數據進行分析 -
net/http/pprof
: 採集服務型應用運行時數據進行分析
pprof 開啓後,每隔一段時間 (10ms) 就會收集當前的堆棧信息,獲取各個函數佔用的 CPU 以及內存資源,然後通過對這些採樣數據進行分析,形成一個性能分析報告。
性能優化主要有一下幾個方面:
-
CPU Profile:報告程序的 CPU 使用情況,按照一定頻率去採集應用程序在 CPU 和寄存器上面的數據。
-
Memory Profile(Heap Profile): 報告程序的內存使用情況。
-
Block Profiling: 報告 goroutines 不在運行狀態的情況,可以用來分析和查找死鎖等性能瓶頸。
-
Goroutine Profiling: 報告 goroutines 的使用情況,有哪些 roroutines,它們的調用關係是怎樣的。
注意:我們只應該在性能測試的時候纔在代碼中引入 pprof
下載 Gin 框架專用 pprof 包並在項目中添加
go get https://github.com/gin-contrib/pprof
添加 pprof 之後的代碼如下:
package main
import (
"net/http"
"github.com/gin-contrib/pprof"
"github.com/gin-gonic/gin"
)
func main() {
app := gin.Default()
pprof.Register(app) // 性能
app.GET("/test", func(c *gin.Context) {
c.String(http.StatusOK, "test")
})
app.Run(":3000")
}
編譯並運行代碼。代碼運行之後可以看到系統自動增加了很多/debug/pprof
的 API。通過這些 API 我們可以看到需要的數據。
“調試 API”
在瀏覽器裏訪問/debug/pprof
, 通過這個頁面我們可以看到我們需要的所有數據:
“瀏覽器查看數據”
使用 go tool pprof 採集數據
再新建一個終端窗口輸入以下命令,獲取當前協程的堆棧信息:
go tool pprof --seconds 20 http://localhost:3000/debug/pprof/goroutine
或者採用如下寫法
go tool pprof http://localhost:3000/debug/pprof/goroutine?second=20
上述命令的意思是採集協程數據並持續 20S。執行結果如下:
“採集數據”
現在已經進入了命令行模式,在最後一行的pprof
後輸入web
, 會自動打開本地瀏覽器並訪問相關頁面,當然這隻限於圖形化界面系統,如 MacOS,Ubuntu Desktop,Windows 等。如果不是,比如說使用的雲服務器就可能會是如下結果:
“非圖形化系統異常”
在這種情況,我們可以使用數據採集的結果文件創建新的 web 服務,以用來在客戶端瀏覽。請注意採集數據時的Saved profile
一行,這便是我們需要的數據文件。啓動新的終端窗口,輸入如下命令:
go tool pprof -http://0.0.0.0:3001 /home/ubuntu/pprof/pprof.rumgo.goroutine.001.pb.gz
直接在瀏覽器裏訪問http://ip:3001
, 如果沒有安裝graphviz
,會出現Could not execute dot;may need to install graphviz
。安裝 graphviz 的方式如下:
brew install graphviz # for macos
apt-get install graphviz # for ubuntu
yum install graphviz # for centos
注:graphviz 一定是安裝在服務器上的哦
在瀏覽器中我們可以看到圖形化的函數調用堆棧信息。右上角的VIEW
欄有一些選項,可以點開查看,Flame Graph
就是傳說中的火焰圖。
“圖形頁面 - 調用堆棧”
“圖形頁面 - 火焰圖”
go tool pprof 命令行交互界面
go tool pprof
只通過命令行也可以實現強大的功能,在上一節裏我們遇到了一個命令,就是web
,接下來再介紹幾個常用的命令。
top
top
默認查看程序中佔用 cpu 前 10 位的函數。
top 3
可以查看程序中佔用 CPU 前三位的函數。
“top 信息”
最後一列爲函數名稱,其他各項內容意義如下:
-
flat: 當前函數佔用 CPU 的耗時
-
flat%: 當前函數佔用 CPU 的耗時百分比
-
sum%: 函數佔用 CPU 的累積耗時百分比
-
cum:當前函數 + 調用當前函數的佔用 CPU 總耗時
-
cum%: 當前函數 + 調用當前函數的佔用 CPU 總耗時百分比
list
我們還可以使用list 函數名
命令查看具體的函數分析,例如:
“list”
pdf
命令可以生成可視化的 pdf 文件。
help
help
命令可以提供所有 pprof 支持的命令說明。
轉自:
liumurong.org/2019/12/gin_pprof/
Go 開發大全
參與維護一個非常全面的 Go 開源技術資源庫。日常分享 Go, 雲原生、k8s、Docker 和微服務方面的技術文章和行業動態。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/skDvz1J2KET4MU4zKn7xxQ