W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
?GoFrame
?框架的?Web Server
?提供了非常強大和簡便的服務性能分析功能,內部完美集成了?pprof
?性能分析工具,可以在任何時候通過?EnablePProf
?方法啟用性能分析特性,并可自定義性能分析工具頁面路由地址,不傳遞路由地址時,默認?URI
?地址為?/debug/pprof
?。
?PProf
?特性的啟用會對程序性能產生一定影響,具體影響程度需要根據(jù)當前業(yè)務場景在?PProd
?啟用前后進行對比。
我們來看一個簡單的例子:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"runtime"
)
func main() {
runtime.SetMutexProfileFraction(1) // (非必需)開啟對鎖調用的跟蹤
runtime.SetBlockProfileRate(1) // (非必需)開啟對阻塞操作的跟蹤
s := g.Server()
s.EnablePProf()
s.BindHandler("/", func(r *ghttp.Request) {
r.Response.Writeln("哈嘍世界!")
})
s.SetPort(8199)
s.Run()
}
這個例子使用了?s.EnablePProf()
?啟用了性能分析,默認會自動注冊以下幾個路由規(guī)則:
/debug/pprof/*action
/debug/pprof/cmdline
/debug/pprof/profile
/debug/pprof/symbol
/debug/pprof/trace
其中?/debug/pprof/*action
?為頁面訪問的路由,其他幾個地址為?go tool pprof
?命令準備的。
也可以使用?StartPProfServer
?方法,快速開啟一個獨立的?PProf Server
?,常用于一些沒有?HTTP Server
?的常駐的進程中(例如定時任務、?GRPC
?服務中),可以快速開啟一個?PProf Server
?用于程序性能分析。該方法的定義如下:
func StartPProfServer(port int, pattern ...string)
一般的場景是使用異步?goroutine
?運行該?PProd Server
?,即往往是這么來使用:
package main
import (
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
go ghttp.StartPProfServer(8199)
// 其他服務啟動、運行
// ...
}
以上示例可以改進為:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
go ghttp.StartPProfServer(8299)
s := g.Server()
s.EnablePProf()
s.BindHandler("/", func(r *ghttp.Request) {
r.Response.Writeln("哈嘍世界!")
})
s.SetPort(8199)
s.Run()
}
heap
?: 報告內存分配樣本;用于監(jiān)視當前和歷史內存使用情況,并檢查內存泄漏。
threadcreate
?: 報告了導致創(chuàng)建新?OS
?線程的程序部分。
goroutine
?: 報告所有當前?goroutine
?的堆棧跟蹤。
block
?: 顯示?goroutine
?在哪里阻塞同步原語(包括計時器通道)的等待。默認情況下未啟用,需要手動調用?runtime.SetBlockProfileRate
?啟用。
mutex
?: 報告鎖競爭。默認情況下未啟用,需要手動調用?runtime.SetMutexProfileFraction
?啟用。簡單的性能分析我們直接訪問?/debug/pprof
?地址即可,內容如下:
1、?pprof
?頁面
2、堆使用量
3、當前進程中的?goroutine
?詳情
如果想要進行詳細的性能分析,基本上離不開?go tool pprof
?命令行工具的支持,在開啟性能分析支持后,我們可以使用以下命令執(zhí)行性能采集分析:
go tool pprof "http://127.0.0.1:8199/debug/pprof/profile"
執(zhí)行后?pprof
?工具經(jīng)過約30秒左右的接口信息采集(這30秒期間?WebServer
?應當有流量進入,我們這里不停地訪問?hello world
?頁面以作測試),然后生成性能分析報告,隨后可以通過?top10/web
?等?pprof
?命令查看報告結果,更多命令可使用?go tool pprof
?查看。關于?pprof
?的詳細使用介紹,請查看Golang官方:blog.golang.org/profiling-go-programs
本示例中的命令行性能分析結果如下:
$ 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/profile
Saved profile in /home/john/pprof/pprof.___go_build_pprof_go.samples.cpu.001.pb.gz
File: ___go_build_pprof_go
Type: cpu
Time: 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) top10
Showing nodes accounting for 80ms, 100% of 80ms total
Showing top 10 nodes out of 49
flat flat% sum% cum cum%
10ms 12.50% 12.50% 10ms 12.50% github.com/gogf/gf/v2/net/ghttp.(*Cookie).Get /home/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/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% github.com/gogf/gf/v2/container/gqueue.(*Queue).PopFront /home/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/container/gqueue/gqueue.go
(pprof) web
Failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in $PATH
(pprof) web
(pprof)
其中?web
?命令用以圖形展示接口之間的調用關系以及性能情況,但是需要安裝?Graphviz
?圖形化工具,以我目前的系統(tǒng)為?Ubuntu
?為例,直接執(zhí)行?sudo apt-get install graphviz
?命令即可安裝完成圖形化工具(如果是MacOS,使用?brew install Graphviz
?安裝),隨后再次使用?web
?命令,最終生成以下圖表:
與CPU性能分析類似,內存使用分析同樣使用到?go tool pprof
?命令:
$ go tool pprof http://127.0.0.1:8299/debug/pprof/heap
Fetching profile over HTTP from http://127.0.0.1:8299/debug/pprof/heap
Saved profile in /Users/john/pprof/pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.004.pb.gz
Type: inuse_space
Time: May 24, 2021 at 8:01pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top
Showing nodes accounting for 1536.39kB, 100% of 1536.39kB total
Showing top 10 nodes out of 19
flat flat% sum% cum cum%
512.19kB 33.34% 33.34% 512.19kB 33.34% runtime.malg
512.14kB 33.33% 66.67% 512.14kB 33.33% github.com/gogf/gf/v2/container/gmap.(*StrAnyMap).doSetWithLockCheck
512.06kB 33.33% 100% 512.06kB 33.33% net.newFD (inline)
0 0% 100% 512.14kB 33.33% github.com/gogf/gf/v2/container/gmap.(*StrAnyMap).GetOrSetFuncLock
0 0% 100% 512.06kB 33.33% github.com/gogf/gf/v2/net/ghttp.(*Server).startServer.func1
0 0% 100% 512.06kB 33.33% github.com/gogf/gf/v2/net/ghttp.(*gracefulServer).ListenAndServe
0 0% 100% 512.06kB 33.33% github.com/gogf/gf/v2/net/ghttp.(*gracefulServer).doServe
0 0% 100% 512.14kB 33.33% github.com/gogf/gf/v2/os/gres.Instance
0 0% 100% 512.14kB 33.33% github.com/gogf/gf/v2/os/gres.init
0 0% 100% 512.06kB 33.33% net.(*TCPListener).Accept
(pprof) web
(pprof)
通過web圖形展示,類似這樣的:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: