Versions Compared
Key
- This line was added.
- This line was removed.
- Formatting was changed.
GoFrame
框架的Web Server
提供了非常强大和简便的服务性能分析功能,内部完美集成了pprof
性能分析工具,可以在任何时候通过EnablePProf
方法启用性能分析特性,并可自定义性能分析工具页面路由地址,不传递路由地址时,默认URI地址为/debug/pprof
。
PProf
启用
Note |
---|
|
EnablePProf
我们来看一个简单的例子:
Code Block | ||
---|---|---|
| ||
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()
启用了性能分析,默认会自动注册以下几个路由规则:
/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
用于程序性能分析。该方法的定义如下:
Code Block | ||
---|---|---|
| ||
func StartPProfServer(port int, pattern ...string) |
一般的场景是使用异步goroutine
运行该PProd Server
,即往往是这么来使用:
Code Block | ||
---|---|---|
| ||
package main import ( "github.com/gogf/gf/v2/net/ghttp" ) func main() { go ghttp.StartPProfServer(8199) // 其他服务启动、运行 // ... } |
以上示例可以改进为:
Code Block | ||
---|---|---|
| ||
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
: 报告内存分配样本;用于监视当前和历史内存使用情况,并检查内存泄漏。threadcreate
: 报告了导致创建新OS线程的程序部分。goroutine
: 报告所有当前goroutine
的堆栈跟踪。block
: 显示goroutine
在哪里阻塞同步原语(包括计时器通道)的等待。默认情况下未启用,需要手动调用runtime.SetBlockProfileRate
启用。mutex
: 报告锁竞争。默认情况下未启用,需要手动调用runtime.SetMutexProfileFraction
启用。
PProf
页面
简单的性能分析我们直接访问/debug/pprof
地址即可,内容如下:
1、pprof
页面
2、堆使用量
3、当前进程中的goroutine
详情
性能采集分析🔥
Tip |
---|
以下示例截图来源于示例项目,仅供参考。 |
如果想要进行详细的性能分析,基本上离不开go tool pprof
命令行工具的支持,在开启性能分析支持后,我们可以使用以下命令执行性能采集分析:
Code Block | ||
---|---|---|
| ||
go tool pprof -http :8080 "http://127.0.0.1:8199/debug/pprof/profile" |
也可以将pprof文件导出后再通过go tool pprof命令打开:
Code Block | ||
---|---|---|
| ||
curl http://127.0.0.1:8199/debug/pprof/profile > pprof.profile
go tool pprof -http :8080 pprof.profile |
执行后profile
的执行后pprof
工具经过约30
秒左右的接口信息采集(这30
秒期间WebServer
应当有流量进入,我们这里不停地访问hello world
页面以作测试),然后生成性能分析报告,随后可以通过应当有流量进入),然后生成性能分析报告,随后可以通过top10
/web
等pprof
命令查看报告结果,更多命令可使用go tool pprof
查看。关于pprof
的详细使用介绍,请查看Golang
官方:blog.golang.org/profiling-go-programs
CPU性能分析
本示例中的命令行性能分析结果如下:
Code Block | ||
---|---|---|
| ||
$ go tool pprof |
-http |
:8080 "http://127.0.0.1:8199/debug/pprof/profile |
" |
web
命令用以图形展示接口之间的调用关系以及性能情况,但是需要安装
Serving web UI on http://localhost:8080 |
Tip |
---|
图形化展示 |
运行后将会使用默认的浏览器打开以下图形界面,展示这段时间抓取的CPU开销链路:
Image Added
也可以查看火炬图,可能更形象一些:
Image Added安装),随后再次使用web
命令,最终生成以下图表:Image Removed
内存使用分析
与CPU性能分析类似,内存使用分析同样使用到与CPU
性能分析类似,内存使用分析同样使用到go tool pprof
命令:
Code Block | ||
---|---|---|
| ||
$ go tool pprof -http :8080 "http://127.0.0.1:82998199/debug/pprof/heap" FetchingServing profileweb overUI HTTP fromon 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
图形展示,类似这样的:
localhost:8080 |
图形展示类似这样的:
Image Added
同样的,也可以查看火炬图,可能更形象一些:
Image Added
goroutine使用分析
与上面的分析类似,goroutine
使用分析同样使用到go tool pprof
命令:
Code Block | ||
---|---|---|
| ||
$ go tool pprof -http :8080 "http://127.0.0.1:8199/debug/pprof/goroutine"
Serving web UI on http://localhost:8080 |
图形展示类似这样的,通常goroutine
看这个图的话就差不多了,当然也有火炬图。
Image AddedImage Removed
Panel | ||
---|---|---|
| ||
|