這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
文章來源:http://gf.johng.cn/592298
ghttp包提供了非常強大和簡便的服務效能分析功能,內部完美整合了pprof
效能分析工具,可以在任何時候通過EnablePprof
方法啟用效能分析特性,並可自訂效能分析工具頁面路由地址,不傳遞路由地址時,預設URI地址為/debug/pprof
。
我們來看一個簡單的例子:
package mainimport ( "gitee.com/johng/gf/g/net/ghttp")func main() { s := ghttp.GetServer() s.EnablePprof() s.BindHandler("/", func(r *ghttp.Request){ r.Response.Writeln("哈嘍世界!") }) s.SetPort(8199) s.Run()}
這個例子使用了s.EnablePprof()
啟用了效能分析,預設會自動註冊以下幾個路由規則:
/debug/pprof/*action/debug/pprof/cmdline/debug/pprof/profile/debug/pprof/symbol/debug/pprof/trace
其中/debug/pprof/*action
為頁面訪問的路由,其他幾個地址為go tool pprof
命令準備的。簡單的效能分析我們直接存取/debug/pprof
地址即可,內容如下:
- pprof頁面
- 堆使用量
- 當前進程中的goroutine詳情
如果想要進行詳細的效能分析,基本上離不開go tool pprof
命令列工具的支援,在開啟效能分析支援後,我們可以使用以下命令執行效能採集分析:
go tool pprof "http://127.0.0.1:8199/debug/pprof/profile"
執行後pprof工具經過約30秒左右的介面資訊採集(這30秒期間Web Server應當有流量進入,我們這裡不停地訪問hello world頁面以作測試),然後產生效能分析報告,隨後可以通過top10
/web
等pprof命令查看報告結果,更多命令可使用go tool pprof
查看。關於pprof的詳細使用介紹,請查看golang官方:blog.golang.org/profiling-go-programs
本樣本中的命令列效能分析結果如下:
john@johnhome:~/Workspace/Go/gf$ go tool pprof "http://127.0.0.1:8199/debug/pprof/profile"Fetching profile over HTTP from http://127.0.0.1:8199/debug/pprof/profileSaved profile in /home/john/pprof/pprof.___go_build_pprof_go.samples.cpu.001.pb.gzFile: ___go_build_pprof_goType: cpuTime: Apr 17, 2018 at 10:53pm (CST)Duration: 30s, Total samples = 80ms ( 0.27%)Entering interactive mode (type "help" for commands, "o" for options)(pprof) top10Showing nodes accounting for 80ms, 100% of 80ms totalShowing top 10 nodes out of 49 flat flat% sum% cum cum% 10ms 12.50% 12.50% 10ms 12.50% gitee.com/johng/gf/g/net/ghttp.(*Cookie).Get /home/john/Workspace/Go/GOPATH/src/gitee.com/johng/gf/g/net/ghttp/http_server_cookie.go 10ms 12.50% 25.00% 10ms 12.50% internal/poll.runtime_pollReset /home/john/Softs/go1.9.2/src/runtime/netpoll.go 10ms 12.50% 37.50% 10ms 12.50% runtime.futex /home/john/Softs/go1.9.2/src/runtime/sys_linux_amd64.s 10ms 12.50% 50.00% 10ms 12.50% runtime.getitab /home/john/Softs/go1.9.2/src/runtime/iface.go 10ms 12.50% 62.50% 10ms 12.50% runtime.newarray /home/john/Softs/go1.9.2/src/runtime/slice.go 10ms 12.50% 75.00% 10ms 12.50% runtime.rawstringtmp /home/john/Softs/go1.9.2/src/runtime/string.go 10ms 12.50% 87.50% 10ms 12.50% runtime.usleep /home/john/Softs/go1.9.2/src/runtime/sys_linux_amd64.s 10ms 12.50% 100% 10ms 12.50% sync.(*RWMutex).Lock /home/john/Softs/go1.9.2/src/sync/rwmutex.go 0 0% 100% 10ms 12.50% bufio.(*Writer).Flush /home/john/Softs/go1.9.2/src/bufio/bufio.go 0 0% 100% 10ms 12.50% gitee.com/johng/gf/g/container/gqueue.(*Queue).PopFront /home/john/Workspace/Go/GOPATH/src/gitee.com/johng/gf/g/container/gqueue/gqueue.go(pprof) webFailed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in $PATH(pprof) web (pprof)
其中web命令用以圖形展示介面之間的調用關係以及效能情況,但是需要安裝Graphviz
圖形化工具,以我目前的系統為ubuntu為例,直接執行sudo apt-get install Graphviz
命令即可安裝完成圖形化工具,隨後再次使用web命令,最終產生以表: