Gin 框架中使用 pprof

【導讀】go 語言 web 框架 gin 中如何便捷引入 pprof 觀察性能?本文做了詳細介紹。

Go 語言內置了獲取程序運行數據的工具,包括以下兩個標準庫:

pprof 開啓後,每隔一段時間 (10ms) 就會收集當前的堆棧信息,獲取各個函數佔用的 CPU 以及內存資源,然後通過對這些採樣數據進行分析,形成一個性能分析報告。

性能優化主要有一下幾個方面:

注意:我們只應該在性能測試的時候纔在代碼中引入 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 信息”

最後一列爲函數名稱,其他各項內容意義如下:

list

我們還可以使用list 函數名命令查看具體的函數分析,例如:

“list”

pdf

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