掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Go語言工具鏈中的 go pprof 可以幫助開發(fā)者快速分析及定位各種性能問題,如 CPU 消耗、內(nèi)存分配及阻塞分析。

十多年專注成都網(wǎng)站制作,成都企業(yè)網(wǎng)站建設(shè),個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都企業(yè)網(wǎng)站建設(shè),高端網(wǎng)頁制作,對(duì)茶藝設(shè)計(jì)等多個(gè)領(lǐng)域,擁有豐富的網(wǎng)站制作經(jīng)驗(yàn)。
性能分析首先需要使用 runtime.pprof 包嵌入到待分析程序的入口和結(jié)束處。runtime.pprof 包在運(yùn)行時(shí)對(duì)程序進(jìn)行每秒 100 次的采樣,最少采樣 1 秒。然后將生成的數(shù)據(jù)輸出,讓開發(fā)者寫入文件或者其他媒介上進(jìn)行分析。
go pprof 工具鏈配合 Graphviz 圖形化工具可以將 runtime.pprof 包生成的數(shù)據(jù)轉(zhuǎn)換為 PDF 格式,以圖片的方式展示程序的性能分析結(jié)果。
Graphviz 是一套通過文本描述的方法生成圖形的工具包。描述文本的語言叫做 DOT。
在 www.graphviz.org 網(wǎng)站可以獲取到最新的 Graphviz 各平臺(tái)的安裝包。
CentOS 下,可以使用 yum 指令直接安裝:
$ yum install graphiviz
runtime.pprof 提供基礎(chǔ)的運(yùn)行時(shí)分析的驅(qū)動(dòng),但是這套接口使用起來還不是太方便,例如:
很多第三方的包在系統(tǒng)包 runtime.pprof 的技術(shù)上進(jìn)行便利性封裝,讓整個(gè)測(cè)試過程更為方便。這里使用 github.com/pkg/profile 包進(jìn)行例子展示,使用下面代碼安裝這個(gè)包:
$ go get github.com/pkg/profile
下面代碼故意制造了一個(gè)性能問題,同時(shí)使用 github.com/pkg/profile 包進(jìn)行性能分析。
本套教程所有源碼下載地址: https://pan.baidu.com/s/1ORFVTOLEYYqDhRzeq0zIiQ 提取密碼:hfyf
基準(zhǔn)測(cè)試代碼如下(具體文件:./src/chapter11/profile/cpu.go):
package main
import (
"github.com/pkg/profile"
"time"
)
func joinSlice() []string {
var arr []string
for i := 0; i < 100000; i++ {
// 故意造成多次的切片添加(append)操作, 由于每次操作可能會(huì)有內(nèi)存重新分配和移動(dòng), 性能較低
arr = append(arr, "arr")
}
return arr
}
func main() {
// 開始性能分析, 返回一個(gè)停止接口
stopper := profile.Start(profile.CPUProfile, profile.ProfilePath("."))
// 在main()結(jié)束時(shí)停止性能分析
defer stopper.Stop()
// 分析的核心邏輯
joinSlice()
// 讓程序至少運(yùn)行1秒
time.Sleep(time.Second)
}代碼說明如下:
性能分析需要可執(zhí)行配合才能生成分析結(jié)果,因此使用命令行對(duì)程序進(jìn)行編譯,代碼如下:
$ go build -o cpu cpu.go
$ ./cpu
$ go tool pprof --pdf cpu cpu.pprof > cpu.pdf
代碼說明如下:
最終生成 cpu.pdf 文件,使用 PDF 查看器打開文件,觀察后發(fā)現(xiàn)下圖所示的某個(gè)地方可能存在瓶頸。
圖:性能分析
圖中的每一個(gè)框?yàn)橐粋€(gè)函數(shù)調(diào)用的路徑,第 3 個(gè)方框中 joinSlice 函數(shù)耗費(fèi)了 50% 的 CPU 時(shí)間,存在性能瓶頸。重新優(yōu)化代碼,在已知切片元素?cái)?shù)量的情況下直接分配內(nèi)存,代碼如下:
func joinSlice() []string {
const count = 100000
var arr []string = make([]string, count)
for i := 0; i < count; i++ {
arr[i] = "arr"
}
return arr
}代碼說明如下:
重新運(yùn)行上面的代碼進(jìn)行性能分析,最終得到的 cpu.pdf 中將不會(huì)再有耗時(shí)部分。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流