Go 語(yǔ)言性能測(cè)試
本文來(lái)學(xué)習(xí)一下如何進(jìn)行 Go 語(yǔ)言的性能測(cè)試。這里需要學(xué)習(xí)一個(gè) Go 語(yǔ)言官方提供的工具 pprof:
- runtime/pprof:采集程序(非 Server)的運(yùn)行數(shù)據(jù)進(jìn)行分析;
- net/http/pprof:采集 HTTP Server 的運(yùn)行時(shí)數(shù)據(jù)進(jìn)行分析。
上述兩個(gè)包的底層實(shí)現(xiàn)是一樣的,一般建議直接在主函數(shù)上加上 http 服務(wù)而使用第二個(gè)包,畢竟可視化顯示易于觀察和操作。故本文僅介紹 net/http/pprof
的用法。
1. pprof 使用方法
直接在程序入口,也就是 main 函數(shù)所在的文件中導(dǎo)入 pprof。
import _ "net/http/pprof"
示例代碼如下:
package main
import (
"fmt"
"net/http"
_ "net/http/pprof"
"time"
)
func main() {
//打印數(shù)字
go printNum()
//打印字符
go printChar()
http.ListenAndServe("0.0.0.0:9300", nil)//啟動(dòng)一個(gè)服務(wù)用于查看性能分析可視化頁(yè)面
}
func printChar() {
for i := '0'; ; i++ {
fmt.Println("printChar:", string(i))
time.Sleep(time.Second)
}
}
func printNum() {
for i := 0; ; i++ {
fmt.Println("printNum:", i)
time.Sleep(time.Second)
}
}
上述代碼啟動(dòng),pprof 會(huì)在這個(gè)服務(wù)上自動(dòng)創(chuàng)建路由:
debug/pprof/
在瀏覽器中輸入127.0.0.1:9300/debug/pprof/
,會(huì)出現(xiàn)如下頁(yè)面:
這個(gè)路由下還有幾個(gè)子頁(yè)面:
- allocs:內(nèi)存分配情況;
- block:獲取導(dǎo)致阻塞的 goroutine 堆棧(如 channel, mutex 等);
- cmdline:當(dāng)前程序激活的命令行啟動(dòng)參數(shù);
- goroutine:當(dāng)前當(dāng)前運(yùn)行的 goroutine 的堆棧信息;
- heap:存活對(duì)象的內(nèi)存分配情況;
- mutex :互斥鎖的競(jìng)爭(zhēng)持有者的堆棧跟蹤;
- profile:默認(rèn)進(jìn)行 30s 的 CPU Profiling,得到一個(gè)分析用的 profile 文件;
- threadcreate:操作系統(tǒng)線程跟蹤;
- trace:得到一個(gè)分析用的 trace 文件。
2. 使用工具分析 profile 和 trace
當(dāng)在127.0.0.1:9300/debug/pprof/
中點(diǎn)擊 profile 和 trace 時(shí)會(huì)分別得到一個(gè)文件,我們可以使用 Go 語(yǔ)言自帶的工具對(duì)這兩個(gè)文件進(jìn)行解析。在解析之前,需要編譯得到程序代碼的可執(zhí)行文件,配合分析文件使用。
2.1 解析 profile
使用如下命令行進(jìn)入解析頁(yè)面:
go tool pprof .\firstgo.exe .\profile
執(zhí)行結(jié)果:
如上如所示,我們進(jìn)入了 pprof 的命令行界面,可以輸入top
來(lái)查看前 10 行數(shù)的 CPU 占用情況:
- flat:采樣頻率(10ms);
- flat%:采樣頻率(10ms)下,CPU 運(yùn)行耗時(shí)總比例;
- sum%:給定函數(shù)累積使用 CPU 總比例,如第二行 sum% =40.00% = 20.00% + 20.00%;
- cum:當(dāng)前函數(shù)加上它之上的調(diào)用運(yùn)行總耗時(shí),包括函數(shù)等待子函數(shù)返回;
- cum%:CPU 運(yùn)行耗時(shí)總比例;
- 最后一列為函數(shù)名稱(chēng)。
還可使用 help 指令來(lái)查看 pprof 所有操作,讀者可以自行探索。
2.2 解析 trace
使用如下命令解析 trace 文件:
go tool trace .\firstgo.exe .\trace
此時(shí)會(huì)自動(dòng)打開(kāi)一個(gè) web 頁(yè)面:
- View trace:查看跟蹤;
- Goroutine analysis:Goroutine 分析;
- Network blocking profile:網(wǎng)絡(luò)阻塞概況;
- Synchronization blocking profile:同步阻塞概況;
- Syscall blocking profile:系統(tǒng)調(diào)用阻塞概況;
- Scheduler latency profile:調(diào)度延遲概況;
- User defined tasks:用戶自定義任務(wù);
- User defined regions:用戶自定義區(qū)域;
- Minimum mutator utilization:最低 Mutator 利用率。
我們可以看到有的鏈接后面跟著(?),是因?yàn)檫@些鏈接的使用需要配合第三方工具,可以點(diǎn)進(jìn)去查看缺失的內(nèi)容,下載安裝后就可以使用了,一般使用前兩個(gè)就可以分析程序的執(zhí)行情況了。
3. 小結(jié)
本文主要介紹了 Go 語(yǔ)言自帶的工具 pprof 的用法,以及其生成分析文件的解析。需要注意的是每個(gè)分析文件都要配合這個(gè)程序的可執(zhí)行文件使用。還有就是建議大家在開(kāi)發(fā)過(guò)程中盡量時(shí)不時(shí)的用一下 pprof,可以使開(kāi)發(fā)出來(lái)的程序更穩(wěn)定更高效。