go 程式的效能優化及 pprof 的使用
程式的效能優化無非就是對程式占用資源的優化。對於伺服器而言,最重要的兩項資源莫過於 cpu 和記憶體。效能優化,就是在對於不影響程式資料處理能力的情況zgcybgs下,我們通常要求程式的 cpu 的記憶體占用盡量低。反過來說,也就是當程式 cpu 和記憶體占用不變的情況下,盡量地提高程式的資料處理能力或者說是吞吐量。
go 的原生工具鏈中提程式設計客棧供了非常多豐富的工具供開發者使用,其中包括 pprof。
對於 pprof 的使用要分成下面兩部分來說。
web 程式使用 pprof
先寫乙個簡單的 web 服務程式。程式在 9876 埠上接收請求。
}可以看到我們只是簡單地引入了 net/http/pprof ,並未顯示地使用。
啟動程式。
我們用 wrk 來簡單地模擬請求。
這時我們開啟 http://localhost:9876/debug/pprof,會顯示如下頁面:
使用者可以點選相應的鏈結瀏覽內容。不過這不是我們重點講述的,而且這些內容看起來並不直觀。
我們開啟鏈結 http://localhost:9876/debug/pprof/profile 稍後片刻,可以**到檔案 profile。
使用 go 自帶的 pprof 工具開啟。go tool pprof test profile。(proof 後跟的 test 為程式編譯的可執行檔案)
輸入 top 命令得到:
可以看到 cpu 占用前 10 的函式,我們可以對此分析進行優化。
只是這樣可能還不是很直觀。
我們輸入命令 web(需要事先安裝 graphviz,macos 下可以 brew install graphviz),會在瀏覽器中開啟介面如下:
可以看到 main.dosomethingone 占用了 92.46% 的 cpu 時間,需要對其進行優化。
web 形式的 cpu 時間圖對於優化已經完全夠用,這邊再介紹一下火焰圖的生成。macos 推薦使用 go-torch 工具。使用方法和 go tool pprof 相似。
go-torch test profile 會生成 torch.svg 檔案。可以用瀏覽器開啟,如圖。
剛才只是講了 cpu 的占用分析檔案的生成檢視,其實記憶體快照的生成相似。http://localhost:9876/debug/pprof/heap,會**得到 heap.gz 檔案。
我們同樣可以使用 go tool pprof test heap.gz,然後輸入 top 或 web 命令檢視相關內容。
通用程式使用 pprof
我們寫的 go 程式並非都是 web 程式,這時候再使用上面的方法就不行了。
我們仍然可以使用 pprof 工具,但引入的位置為 runtime/pprof 。
這裡貼出兩個函式,作為示例:
// 生成 cpu 報告
func cpuprofile()
defer f.close()
log.println("cpu profile started")
pprof.startcpuprofile(f)
defer pprof.stopcpuprofile()
time.sleep(60 * time.second)
fmt.println("cpu profile stopped")
}// 生成堆記憶體報告
func heapprofile()
defer f.close()
time.sleep(30 * time.second)
pprof.writeheapprofile(f)
fmt.println("heap profile generated")
}兩個函式分別會生成 cpu.prof 和 heap.prof 檔案。仍然可以使用 go tool pprof 工具進行分析,在此就不贅述。
trace 報告
直接貼**:
// 生成追蹤報告
func traceprofile()
defer f.close()
log.println("trace started")
trace.start(f)
defer trace.stop()
time.sleep(60 * time.second)
fmt.println("trace stopped")
}使用工具 go tool trace 進行分析,會得到非常詳細的追蹤報告,供更深入的程式分析優化。由於報告內容比較複雜,且使用方法類似,就不繼續了。讀者可自行嘗試。
貼張網上的圖給大家大概看一下:
參考:本文標題: go程式效能優化及pprof使用方法詳解
本文位址:
Go程式效能分析pprof
參考 go語言的pprof是google c profiler的移植,所以用法也差不多。這裡簡要記錄步驟如下 1.import runtime pprof 引用pprof package os func main 2.執行 執行程式,生成profile檔案 3.分析 在命令列上執行 go tool ...
優化程式效能
編寫高效程式需要兩個活動 第一,我們必須選擇一組最好的演算法和資料結構 第二,我們必須編寫出編譯器能夠有效優化以轉換成高效可執行 的源 這裡,我們主要講述後者。首先,我們討論一下為什麼要編寫高效程式。不難想象,如果本來要用 天執行完的程式,經過優化只需要 天就可執行完,這是一件多麼令人振奮的 事啊。...
優化程式效能
l 消除迴圈的低效率 n 對於迴圈中的過程呼叫盡量移出迴圈外,例如 nfor i 0 i strlen s i strlen 函式為線性增長 在字串長度很大時 很消耗系統資源 n 減少不必要的儲存器引用,將儲存器引用儲存在臨時變數中.l 處理器優化 即充分利用儲存器流水線操作的吞吐量 n 迴圈展開,...