GoFrame 高級特性-PProf服務性能分析

2022-04-15 11:46 更新

?GoFrame?框架的?Web Server?提供了非常強大和簡便的服務性能分析功能,內部完美集成了?pprof?性能分析工具,可以在任何時候通過?EnablePProf?方法啟用性能分析特性,并可自定義性能分析工具頁面路由地址,不傳遞路由地址時,默認?URI?地址為?/debug/pprof?。

PProf啟用

?PProf?特性的啟用會對程序性能產生一定影響,具體影響程度需要根據(jù)當前業(yè)務場景在?PProd?啟用前后進行對比。

EnablePProf

我們來看一個簡單的例子:

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

也可以使用?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()
}

PProf指標

  • ?heap?: 報告內存分配樣本;用于監(jiān)視當前和歷史內存使用情況,并檢查內存泄漏。
  • ?threadcreate?: 報告了導致創(chuàng)建新?OS?線程的程序部分。
  • ?goroutine?: 報告所有當前?goroutine?的堆棧跟蹤。
  • ?block?: 顯示?goroutine?在哪里阻塞同步原語(包括計時器通道)的等待。默認情況下未啟用,需要手動調用?runtime.SetBlockProfileRate?啟用。
  • ?mutex?: 報告鎖競爭。默認情況下未啟用,需要手動調用?runtime.SetMutexProfileFraction?啟用。

PProf頁面

簡單的性能分析我們直接訪問?/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

CPU性能分析

本示例中的命令行性能分析結果如下:

$ 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圖形展示,類似這樣的:


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號