如何为基于fasthttp/router的Go应用配置pprof性能分析?
在现有fasthttp/router中接入pprof性能分析(无需重写路由)
你的问题核心有两个:一是之前用profile.Start()生成空文件的原因,二是如何在不替换现有路由的前提下接入pprof。我来逐个解决:
为什么你的profile.Start()生成空文件?
你把defer profile.Start().Stop()放在了limitedListenAndServe之后,而limitedListenAndServe是阻塞调用——程序会一直卡在这个函数直到服务终止,所以defer语句根本没机会执行,自然生成的cpu.pprof是空的。要让它生效,你需要把defer放在阻塞调用之前,但这种离线分析方式,不如用pprof的HTTP端点更灵活。
无需重写路由的pprof接入方案
我们可以用fasthttp/adaptor包把标准库net/http/pprof的路由转换成fasthttp兼容的handler,然后挂载到你现有的fasthttp/router上,完全不用修改现有业务路由。
步骤1:导入依赖
先确保你安装了fasthttp/adaptor:
go get github.com/fasthttp/adaptor
然后在代码中导入必要的包:
import ( "net/http/pprof" "github.com/fasthttp/adaptor" // 其他你的原有导入... )
步骤2:挂载pprof路由到现有router
在创建router之后,添加pprof的路由映射。可以选择两种方式:
方式一:逐个注册pprof端点(更精准)
func main() { flag.Parse() r := router.New() // 挂载pprof核心路由 r.GET("/debug/pprof/*", adaptor.NewFastHTTPHandlerFunc(pprof.Index)) r.GET("/debug/pprof/profile", adaptor.NewFastHTTPHandlerFunc(pprof.Profile)) r.GET("/debug/pprof/heap", adaptor.NewFastHTTPHandlerFunc(pprof.Heap)) r.GET("/debug/pprof/goroutine", adaptor.NewFastHTTPHandlerFunc(pprof.Goroutine)) r.GET("/debug/pprof/block", adaptor.NewFastHTTPHandlerFunc(pprof.Block)) r.GET("/debug/pprof/threadcreate", adaptor.NewFastHTTPHandlerFunc(pprof.ThreadCreate)) // 你的原有业务路由 r.GET("/", index) r.GET("/myroute", myrouteFn) h := r.Handler if err := limitedListenAndServe(*addr, fasthttplogger.Tiny(h)); err != nil { log.Fatalf("Error in ListenAndServe: %s", err) } }
方式二:批量挂载(更简洁)
因为pprof默认会把所有端点注册到http.DefaultServeMux,我们可以直接把整个DefaultServeMux转成fasthttp handler:
func main() { flag.Parse() r := router.New() // 批量挂载所有pprof路由 r.GET("/debug/pprof/*", adaptor.NewFastHTTPHandler(http.DefaultServeMux)) // 你的原有业务路由 r.GET("/", index) r.GET("/myroute", myrouteFn) h := r.Handler if err := limitedListenAndServe(*addr, fasthttplogger.Tiny(h)); err != nil { log.Fatalf("Error in ListenAndServe: %s", err) } }
步骤3:使用pprof进行性能分析
启动你的服务后,就可以通过HTTP端点采集性能数据了:
- CPU分析:运行
go tool pprof http://<你的服务地址>/debug/pprof/profile,等待30秒(默认采集时间)后进入pprof交互界面,输入web即可生成火焰图 - 内存分析:运行
go tool pprof http://<你的服务地址>/debug/pprof/heap - 协程分析:运行
go tool pprof http://<你的服务地址>/debug/pprof/goroutine - 其他端点可以访问
http://<你的服务地址>/debug/pprof查看完整列表
总结
- 之前的
profile.Start()失效是因为defer放在了阻塞调用之后,调整位置也可以用,但HTTP端点的方式更适合在线服务 - 用
fasthttp/adaptor可以无缝把标准库pprof接入现有fasthttp/router,完全不用修改业务路由 - 启动服务后通过
go tool pprof配合HTTP端点就能灵活采集和分析性能数据
内容的提问来源于stack exchange,提问作者josephkibe
相关产品推荐
相关产品推荐

